Передача Dynami c значений, отправленных на php array_strip, приводит к ошибкам - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь передать значения Dynami c GET с помощью сценария AJAX в PHP. Я заметил, что значения Dynami c, отправленные в "array_strip", вызывают ошибку, приведенную ниже. Все работает, если я жестко закодировал значения, но мне нужно, чтобы он работал со значениями Dynami c. Не уверен, что я делаю неправильно ... Заранее спасибо!

"Предупреждение: неверный аргумент указан для foreach () в / var / www/html/books.php в строке 120"

<?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 Ответ

1 голос
/ 26 января 2020

Безглючный способ сделать это состоит в том, чтобы значения $p и $limit не отличались от чисел. Поскольку нечисловые значения c приведут к сбою 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) {    

    /* ... */

}

Так что приведенный выше код выполняет некоторые основные действия c проверка ошибок для предотвращения ошибок, подобных приведенной выше. Его безопаснее использовать, поскольку он не может выдавать никаких ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...