如果表单字段为空,是否可以告诉php不发布数据?
现在我的insert.php页面中的帖子变量如下所示:
fname = $_POST['firstname'];
lname = $_post['lasname'];
sql = "UPDATE profile SET first='.$fname.', last='.$lname.' WHERE id='.$id.'";
如果我的表单字段为空或为空,我希望$ fname $ lname不发布。这样做的最佳方法是什么?
目前,当我提交更新时,如果这些字段为空,则如果没有插入任何内容,则用空行更新整个表。
答案 0 :(得分: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
}
答案 1 :(得分:0)
Is it possible to tell php to NOT post data if the form field is null?
发布数据不是PHP,只要你点击表单的提交按钮就是你的浏览器。为了防止在字段为空时发生这种情况,您必须使用客户端(javascript),首先验证字段是否确实在提交表单之前填写。
这是我理解你的问题的方式。如果您不希望在$_POST
变量为空时创建SQL查询,则只需使用if条件或三元运算符。
答案 2 :(得分: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'";
您应 NOT 使用此类SQL查询生成。它容易受到SQL注入的攻击。更好地使用 PDO 或 MySQLi 参数化查询。
顺便说一下,如果你想在值为空时拒绝插入,你最好在创建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(...); .....
}
答案 3 :(得分: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之前正确转义值。
答案 4 :(得分:-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 *&amp;%$ 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);
}
此逻辑允许包含A-z的名称。 - 符号: J.Jameson , Jackson-Piterson , JOHn , smIth ,等。 要获得更严格的验证规则,请检查Official PHP Regular Expressions manual。