我正在尝试通过AJAX脚本将动态GET值传递给PHP,我注意到发送到“ array_strip”的动态值会产生以下错误。如果我对值进行硬编码,则一切正常,但是我需要它与动态值一起使用。不确定我在做什么错...预先感谢!
“警告:在第120行的/var/www/html/books.php中为foreach()提供了无效的参数”
<?php
$p = trim($_GET["p"]);//START
$limit = trim($_GET["limit"]);//NUMBER OF RESULTS
//HARDCODING VALUES WORKS
foreach (array_slice($obj_data->docs, 0, 5) as $book) {
.....
}
//DYNAMIC VALUES FAILS
foreach (array_slice($obj_data->docs, $p, $limit) as $book) {
.....
}
?>
不确定我的代码发生了什么,但是将字符串转换为整数,并重命名了一些值,请在下面修复
<?php
$st = trim($_GET["p"]);//START
$limit = trim($_GET["limit"]);//NUMBER OF RESULTS
$int_s = (int)$st;
$int_l = (int)$limit;
//var_dump($int_s, $int_l); -> int(1) int(5)
foreach (array_slice($obj_data->docs, $int_s, $int_l) as $book) {
....
}
?>
答案 0 :(得分:1)
执行此操作的非笨拙方法是防止值$p
和$limit
成为数字以外的任何东西。由于非数字值将导致array_slice()
失败并返回NULL
,这将导致foreach
失败,并出现上述错误。另外,在将其交给foreach
之前,请始终检查以确保具有数组。
所以尝试这样的事情:
const MIN_P = 0;
const MIN_LIMIT = 10; // set some default minimum to use
$p = filter_var(
$_GET['p'] ?? MIN_P,
FILTER_VALIDATE_INT,
['flags' => FILTER_NULL_ON_FAILURE]
) ?? MIN_P;
$limit = filter_var(
$_GET['limit'] ?? MIN_LIMIT,
FILTER_VALIDATE_INT,
['flags' => FILTER_NULL_ON_FAILURE]
) ?? MIN_LIMIT;
// ensure that we always have an array if even a zero-length array
$array = is_array($obj_data->docs) ? $obj_data->doc : [];
foreach (array_slice($array, $p, $limit) as $book) {
/* ... */
}
因此,以上代码进行了一些基本的错误检查,以防止发生上述错误。使用安全,因为它不会产生任何错误。