0

如果表单字段为空,是否可以告诉 php 不要发布数据?

现在我的 insert.php 页面中的帖子变量如下所示:

fname = $_POST['firstname'];
lname = $_post['lasname'];

sql = "UPDATE profile SET first='.$fname.', last='.$lname.' WHERE id='.$id.'";

如果我的表单字段为空或 null,我希望 $fname $lname 不要发布。最好的方法是什么?

目前,当我提交更新时,如果这些字段为空,如果没有插入任何内容,它们会用空行更新整个表。

4

5 回答 5

0

Is it possible to tell php to NOT post data if the form field is null? 发布数据的不是 PHP,而是您点击表单提交按钮时的浏览器。为了防止在字段为空时发生这种情况,您必须使用客户端(javascript),它首先验证字段是否确实在提交表单之前填写。

这就是我理解你的问题的方式。如果您不想在$_POST变量为空时创建 SQL 查询,则只需使用 if 条件或三元运算符。

于 2013-10-04T22:45:35.607 回答
0

我会这样做:

$fname = isset($_POST['firstname']) && strlen($_POST['firstname']) > 0 ? $_POST['firstname'] : null;

这样,如果变量已设置且不为空,则 $fname 将被定义为 $_POST['firstname'] 值,否则将为null

顺便说一句,如果您在双引号 ( ") 内工作,则无需使用点将值添加到 $sql 字符串。更重要的是,你的语法是错误的。这是一种可行的方法:

$sql = "UPDATE profile SET first='$fname', last='$lname' WHERE id='$id'";

您不应该使用这种 SQL 查询生成。它容易受到 SQL 注入的攻击。更好地使用PDOMySQLi参数化查询。

顺便说一句,如果您想在值为空的情况下拒绝插入,则最好在创建 MySQL 表时执行此操作(not null为列分配属性)。例如:

CREATE TABLE user(
    first VARCHAR(50) NOT NULL,
    last VARCHAR(50) NOT NULL
)

** 编辑:如果我理解得很好,这就是你想要的:

$valuesToAdd = "";
// Concatenate values to the query if they are defined
if (isset($_POST['firstname']) && strlen($_POST['firstname']) > 0) $valuesToAdd .= "first = '{$_POST['firstname']}',";
if (isset($_POST['lastname']) && strlen($_POST['lastname']) > 0) $valuesToAdd .= "last = '{$_POST['lastname']}',";
// Repeat for any other values...

// By default, the SQL string is empty
$sql = "";

// If changes were made...
if (strlen($valuesToAdd) > 0) {
    // Remove the last ","
    $valuesToAdd = substr($valuesToAdd, 0, strlen($valuesToAdd)-1);

    // Generate the SQL string with the values which will be added
    $sql = "UPDATE profile SET {$valuesToAdd} WHERE id='{$id}'";

    // echo $sql; die;
}


// Check if the SQL string is not empty
if (strlen($sql) > 0) {
    // Here the SQL has been generated, use it for a SQL query...
    // $con = mysql_connect(...); .....
}
于 2013-10-04T22:47:22.070 回答
0

您可以对每个字段使用类似的内容:

$fname = empty($_POST['firstname']) ? null : $_POST['firstname'];

$fname如果表单字段不存在或输入为空,这将设置为 null。否则,它将使用原始值。

更新

如果您只想更新不为空的字段,则需要添加一些额外的逻辑:

if($fname !== null && $lname !== null) {
    // update both
}
else if($fname !== null) {
    // update just fname
}
else if($lname !== null) {
    // update just lname
}
于 2013-10-04T22:36:54.227 回答
0
$fname = $_POST['firstname'];
$lname = $_POST['lastname'];

$sets = array();

if(trim($fname)) {
  $sets[] = "first = '".mysql_real_escape_string($fname)."'";
}
if(trim($lname)) {
  $sets[] = "last = '".mysql_real_escape_string($lname)."'";
}

if($sets) {
  $sql = "UPDATE profile SET ".implode(", ", $sets)." WHERE id='".mysql_real_escape_string($id)."'";
}

请记住在将它们粘合到 SQL 之前正确转义您的值。

于 2013-10-04T23:04:54.473 回答
-1

您需要表单验证。简单的解决方案不允许空字段保存在 db 中并防止SQL-injections

简单的解决方案

$fname = isset($_POST['firstname']) and nameIsValid($_POST['firstname'])
    ? $_POST['firstname'] : false;
$lname = isset($_POST['lastname']) and nameIsValid($_POST['lastname'])
    ? $_POST['lastname'] : false;

if (false === $fname or false === $lname) {
    // report about not valid form fields
} else {
    $dsn = 'mysql:dbname=yourdb;host=yourhost;charset=utf8';
    $dbh = new PDO($dsn, 'user', 'pass');
    $sql = "UPDATE profile SET first = :fname, last = :lname WHERE id = :id";

    $stmt = $dbh->prepare($sql);
    $stmt->execute(array(':fname' => $value, ':lname' => $lname, ':id' => $id));
}

/**
 * Validation names for empty values
 *
 * @param string $name First name or last name
 * @return bool
 */
function nameIsValid($name) {
    return '' !== $name;
}

但请注意XSS-injection。例如,有人可以保存在您的 db Fist 名称中:

<script>alert('Woohoo! You have vulnerability!');</script>

下次,当您打印用户的名字时,每个人都会看到有关漏洞的消息:)

您可以决定实施更严格的验证规则,这将不允许诸如"asfyua23807*^2#""-2*&%$9837239askHF"或 XSS 注入之类的名称。在这种情况下,您应该修改nameIsValid()功能。

安全解决方案:

/**
 * Validation names and prevent XSS-injections
 *
 * @param string $name First name or last name
 * @return bool
 */
function nameIsValid($name) {
    $pattern = '/^[\.a-z-]+$/i';
    return (bool) preg_match($pattern, $name);
}

此逻辑允许名称包含 Az 。- 符号:J.JamesonJackson- PitersonJOHnsmIth等。如需更严格的验证规则,请查看官方 PHP 正则表达式手册

于 2013-10-05T05:47:25.193 回答