我有一个PHP脚本,它接收带有多个数据(+30)的POST,所有这些都是必需的。而不是像 isset()和 strlen()一样逐一检查,如建议here,如果我能抓住通知错误&#34将会很棒;未定义的索引"不知何故。在Google上进行研究我发现很少有关于此主题的旧帖子,例如this one,所以也许有一些新的技术或解决方法来存档这个目标。
更新
根据@bishop的回答,这是我的解决方案:
try {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$flds = ['data1', 'data2', 'data3'];
if (count(array_diff($flds, array_keys($_POST))) > 0) {
throw new Exception('Missing fields detected!');
}
/* @bishop solution
$vals = array_filter($_POST, function($val) { return ($val != ''); });
if (count(array_diff($_POST, $vals)) > 0) {
throw new Exception('Empty fields detected!');
}
*/
// I prefered using the bellow approach instead of @bishop
// solution, once I will need to sanitize values anyway
foreach($_POST as $input => $value) {
$_POST[$input] = trim($value);
if (strlen($_POST[$input]) === 0) {
throw new Exception('Empty fields detected!');
}
//$_POST[$input] = mysqli_real_escape_string($conn, $value);
}
}
} catch (Exception $e) {
echo $e->getMessage();
}
答案 0 :(得分:2)
如果您想检查每个字段是否存在,可以使用array_diff和array_filter:
// check for missing keys in the post data
$expect = [ 'data1', 'data2', 'data3' ];
if ($missing = array_diff($expect, array_keys($_POST))) {
var_dump($missing);
}
// check for missing values in the post data: modify to suit
$passed = array_filter($_POST, function($value) { return ! empty($value); });
if ($invalid = array_diff($_POST, $passed)) {
var_dump($invalid);
}
但是,按照你描述的方式去做:
// temporarily catch all raised errors, warnings, and notices
$errors = [];
set_error_handler(function ($code, $message, $file, $line, $context) use (&$errors) {
$errors[] = [ $code, $message ];
});
// do your "validation"
if ($foo) {
echo "foo";
}
// restore the state of the world, and check for errors
restore_error_handler();
if (count($errors)) {
echo 'Bad bad!';
}
但使用风险自负。通常,最好是积极检查可接受的值,并使用任何生成的错误/警告/通知作为您的逻辑未按预期工作的上下文。
捕获错误以进行检查是许多框架的一部分。一些外部库也提供它,如Haldayne/fox。免责声明:我是Haldayne的作者。