Вы, вероятно, отправляете неверную информацию на addInOrder
, не видя, что это за переменная, и никак не может быть.Без намного большего количества кода нет никакого способа узнать, откуда это происходит.Может быть трудно отследить эти вещи, даже когда вы можете запустить сайт (но у меня есть несколько советов, см. Ниже).
Когда вы конвертируете строку типа "foo"
, используя intval
, она возвращает 0
например.Но вы можете вызвать функцию, если идентификатор равен falsy
Например:
//this is just a simplified example to show how to bail out of the method
function addInOrder($id){
if(false ==($id = intval($id))) return;
echo $id."\n";
//.....
}
addInOrder(1);
addInOrder("foo");
Выход (возвращается 0)
1
Песочница
Это действительно не решение, потому что вы должны найти, где происходит плохой звонок.
function addInOrder($id){
if(false ==($id = intval($id))){
try{
throw new Excepton(__METHOD__." called with invalid argument[$id]");
}catch(Exception $e){
echo $e->getMessage()."\n";
echo $e->getTraceAsString();
exit;
}
}
echo $id."\n";
}
Теперь, когда это произойдет, ваш сайт взорвется (просто шутит), но он сломается,однако вы получите хорошую трассировку стека, которую вы можете использовать, чтобы узнать, откуда поступил вызов, чтобы вы могли исправить реальную проблему.
В основном по любой причине вы получаете 0
для переменной $id
в вашемметод.Наиболее вероятной причиной (помимо отправки 0
) является нечто иное, чем присвоение ему числа, а затем преобразование в 0
с intval
в $ _SESSION ['products'] появляется [0]
Если вы, например, позвоните addInOrder("foo")
, вы получите элемент массива с номером и индексом 0
.
. Я не могу использовать$_SESSION
в песочнице, но мы можем продублировать, как это работает, используя global $session
.С этим я могу воспроизвести (что, я думаю, вы говорите):
function addInOrder($id){
global $session;
$id= intval($id);
$productsInOrder=array();
if(isset($session['products'])){
$productsInOrder=$session['products'];
}
if(array_key_exists($id, $productsInOrder)){
$productsInOrder[$id]++;
}else{
$productsInOrder[$id]=1;
}
$session['products']=$productsInOrder;
}
addInOrder(1);
print_r($session);
echo "\n---------------------------------\n";
addInOrder("foo");
print_r($session);
Вывод:
Array
(
[products] => Array
(
[1] => 1
)
)
---------------------------------
Array
(
[products] => Array
(
[1] => 1
[0] => 1
)
)
Песочница
Лично я бывыдает ошибку всякий раз, когда этот метод получает что-то, что falsy
после intval
только потому, что это никогда не должно произойти, если вызов не испорчен (где вы не отправляете ему идентификатор).Но я должен упомянуть, что никогда не показывать трассировку стека на рабочем сервере, так как аргументы могут содержать такие вещи, как пароли БД и т. Д. *
Надеюсь, это поможет.