将动态值传递给php array_strip会产生错误

时间:2020-01-26 20:12:27

标签: php ajax

我正在尝试通过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) {  
 ....
 }
 ?>

1 个答案:

答案 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) {    

    /* ... */

}

因此,以上代码进行了一些基本的错误检查,以防止发生上述错误。使用安全,因为它不会产生任何错误。