Примечание: Неопределенное смещение: 0 в

Я получаю эту ошибку PHP, что это значит?

Notice: Undefined offset: 0 in C:\xampp\htdocs\mywebsite\reddit_vote_tut\src\votes.php on line 41 

Из этого кода:

 <?php include("config.php"); function getAllVotes($id) { $votes = array(); $q = "SELECT * FROM entries WHERE id = $id"; $r = mysql_query($q); if(mysql_num_rows($r)==1)//id found in the table { $row = mysql_fetch_assoc($r); $votes[0] = $row['votes_up']; $votes[1] = $row['votes_down']; } return $votes; } function getEffectiveVotes($id) { $votes = getAllVotes($id); $effectiveVote = $votes[0] - $votes[1]; //ERROR THROWN HERE return $effectiveVote; } $id = $_POST['id']; $action = $_POST['action']; //get the current votes $cur_votes = getAllVotes($id); //ok, now update the votes if($action=='vote_up') //voting up { $votes_up = $cur_votes[0]+1; //AND ERROR THROWN HERE $q = "UPDATE threads SET votes_up = $votes_up WHERE id = $id"; } elseif($action=='vote_down') { $votes_down = $cur_votes[1]+1; $q = "UPDATE threads SET votes_down = $votes_down WHERE id = $id"; } $r = mysql_query($q); if($r) { $effectiveVote = getEffectiveVotes($id); echo $effectiveVote." votes"; } elseif(!$r) //voting failed { echo "Failed!"; } ?> в <?php include("config.php"); function getAllVotes($id) { $votes = array(); $q = "SELECT * FROM entries WHERE id = $id"; $r = mysql_query($q); if(mysql_num_rows($r)==1)//id found in the table { $row = mysql_fetch_assoc($r); $votes[0] = $row['votes_up']; $votes[1] = $row['votes_down']; } return $votes; } function getEffectiveVotes($id) { $votes = getAllVotes($id); $effectiveVote = $votes[0] - $votes[1]; //ERROR THROWN HERE return $effectiveVote; } $id = $_POST['id']; $action = $_POST['action']; //get the current votes $cur_votes = getAllVotes($id); //ok, now update the votes if($action=='vote_up') //voting up { $votes_up = $cur_votes[0]+1; //AND ERROR THROWN HERE $q = "UPDATE threads SET votes_up = $votes_up WHERE id = $id"; } elseif($action=='vote_down') { $votes_down = $cur_votes[1]+1; $q = "UPDATE threads SET votes_down = $votes_down WHERE id = $id"; } $r = mysql_query($q); if($r) { $effectiveVote = getEffectiveVotes($id); echo $effectiveVote." votes"; } elseif(!$r) //voting failed { echo "Failed!"; } ?> 

Вы запрашиваете значение в ключе 0 из $votes . Это массив, который не содержит этого ключа.

Массив $votes не задан, поэтому, когда PHP пытается получить доступ к ключу 0 массива, он встречает неопределенное смещение для [0] и [1] и выдает ошибку.

Если у вас есть массив:

 $new_array = array('1','2','3'); 

Теперь мы можем получить доступ:

 $new_array[0]; $new_array[1]; $new_array[2]; 

Если мы попытаемся получить доступ:

 $new_array[3]; 

Мы получим сообщение об ошибке «Примечание: Неопределенное смещение: 3»

Использовать print_r($votes); для проверки массива $votes вы увидите, что ключ 0 там не существует. Он вернет NULL и выбросит эту ошибку.

getAllVotes() не возвращает массив с индексами 0 или 1 . Убедитесь, что он возвращает var_dump() данные, вызывая var_dump() в результате.

во-первых, убедитесь, что массив существует, вы можете попробовать что-то вроде

 if (isset($$votes)) { // Do bad things to the votes array } 

Как объясняется, это происходит из-за отсутствия данных в $ cur_votes [0], и, следовательно, это порождает ошибку. Чтобы убедиться, что ваш код работает нормально, перед выполнением «$ vote_up = $ cur_votes [0] +1;» echo значение $ cur_votes [0], чтобы увидеть, есть ли какое-либо значение, сохраненное или нет. Разумеется, ценность не сохраняется.

 function getEffectiveVotes($id) 

Согласно заголовку функции существует только одна переменная параметра ( $id ). Таким образом, в строке 27 массив votes[] не определен и выходит за рамки. Вам нужно добавить другое значение параметра в заголовок функции, чтобы функция getEffectiveVotes() знала, что ожидает два параметра. Я ржавый, но что-то вроде этого будет работать.

 function getEffectiveVotes($id, $votes) 

Я не говорю, что так должно быть сделано, но вам может понадобиться исследование того, как PHP передает свои массивы и решает, нужно ли явно указывать, чтобы передать его по ссылке

 function getEffectiveVotes($id &$votes) <---I forget, no time to look it up right now. 

Наконец, вызовите функцию getEffectiveVotes() с обоими аргументами, где она должна быть вызвана.

Приветствия.

Этот ответ помог мне https://stackoverflow.com/a/18880670/1821607 Причина отказа – индекс 0 не был установлен. Простой $array = $array + array(null) сделал трюк. Или вы должны проверить, установлен ли элемент массива в индексе 0 через isset($array[0]) . Второй вариант – лучший подход для меня.

Если вы оставите скобки, то PHP по умолчанию назначит ключи.

Попробуй это:

 $votes = $row['votes_up']; $votes = $row['votes_down']; 

это просто предупреждение:

 error_reporting(0); 

он показывает, когда мы не инициализируем массив и не присваиваем значение индексам.

 somefunction{ $raja[0]="this"; $raja[1]="that"; } 

вместо этого:

 somefunction{ $raja=array(0=>'this',1='that'); //or $raja=array("this","that"); } 

это просто уведомление, не генерирует никакой выходной ошибки или какого-либо неожиданного вывода.

Как вы могли уже знать об ошибке. Это связано с попыткой доступа к пустому массиву или для доступа к значению пустого ключа массива. В моем проекте я имею дело с этой ошибкой с подсчетом массива и отображением результата.

Вы можете сделать это следующим образом:

 if(count($votes) == '0'){ echo 'Sorry, no votes are available at the moment.'; } else{ //do the stuff with votes } 

count($votes) подсчитывает массив $votes . Если он равен нулю (0) , вы можете отобразить свое собственное сообщение или перенаправить на определенную страницу, иначе вы можете делать что-то с помощью $votes . Таким образом вы можете удалить Notice: Undefined offset: 0 в уведомлении в PHP.