编辑:我错误地分析了问题,所有等于0的值都有问题。是的,问题似乎出在功能上,您知道如何改进该功能吗?
我的网站有问题。
要进行上下文化,我创建了一个网页,允许管理员将新成员添加到数据库。我们可以自定义字段(姓名,名字,年龄等)。
但是我的选择选项字段有问题。
<form id="contact-form" method="post" autocomplete="off">
<!-- other input type text fields -->
<label for="ban">Banissement</label>
<select name="ban">
<option value="0" selected>Non</option>
<option value="1">Oui</option>
</select>
<label for="role">Rôle</label>
<select name="role">
<option value="0" selected>Aucun (membre classique)</option>
<option value="1">Modérateur</option>
<option value="2">Administrateur</option>
</select>
<input type="submit" name="register_new_user" value="Créer ce membre" />
</form>
通过验证表单,我检查“ ban”和“ role”字段是否已填写。但是,如果这两个值相同(如果 $ _ POST ['ban'] == 1 ,并且如果 $ _ POST ['role'] == 1 ),则我的页面就像没有填写这两个字段一样。
但是,如果两个字段不同( $ _ POST ['ban'] == 0 和 $ _ POST ['role'] == 1 ),则存在没问题,两个字段填满,代码仍在运行...
在这里您可以看到PHP代码:
if(isset($_POST['register_new_user'])) {
if(not_empty(['firstname','lastname','pseudo','email','password','password_confirm','code','city','score','banque','sortPref','notimeout','ban','role'])) {
// Sending to the database
}
}
...具有函数 not_empty()的功能,我用来检查字段是否已填充。
if(!function_exists('not_empty')){
function not_empty($fields = []){
if(count($fields) != 0){
foreach($fields as $field){
if(empty($_POST[$field]) || trim($_POST[$field]) == ""){
return false;
}
}
return true;
}
}
}
我是否必须对整个表格使用不同的值?
答案 0 :(得分:3)
empty
的主要优点在于,它可以在检查变量/键的值是否等于false
(包括“ 0”;请参见{{ 3}}),而不会引起未定义的通知。通过此处的操作,您应该可以只使用isset
。这将检查该变量是否已设置,如果没有设置该变量,则将防止下一部分引发通知,并且下一部分将确保该变量具有值(包括零)。
if (!isset($_POST[$field]) || trim($_POST[$field]) == "") {
答案 1 :(得分:1)
function not_empty($fields = []) {
foreach($fields AS $key) {
// Check is set
if(!isset($_REQUEST[$key]))
return false;
$input = $_REQUEST[$key];
// Check not null value
if(is_null($input))
return false;
// If is array of list items check at least one is selected
if(is_array($input) && count($input) === 0)
return false;
// Must be string or number, trim white sapce
$input = trim($input);
// If is valid number continue iteration
if(is_numeric($input))
continue;
// Must be a string, check length is more than zero
if(strlen($input) === 0)
return false;
}
return true;
}
函数为空会在以下情况下返回 true :
在您的用例中,选择值为整数零的选择选项将被错误地评估为空true。
如果完全声明了变量,数组键,对象键,则已设置的函数 isset 将返回 true ,即使其值在函数empty()中返回true时也是如此。
因此,这使得检查值是否为不希望的空白值非常棘手。 您可以通过考虑这些事实来抑制这些复杂性,并选择更明智的值来使用不太复杂的代码。
还请注意,我没有费心检查 $ fields 的数组中是否有任何项目,只要循环为空,就不会运行for每个循环,也不会抛出错误通过。
您在代码中放入的条件更少的 if
声明表现得越好,请始终尝试一下。
始终最好将值作为预期类型传递,即使它是空数组,而不是将值设置为NULL。
NULL检查对您的代码不利,并且NULL设置并非总是如此