Я получаю уведомление PHP «неопределенная переменная»
Вопрос
Мне любопытно, почему я получаю сообщение об ошибке в том, что я делал миллион раз раньше, но внезапно в определенном сценарии получаю сообщение об ошибке «Неопределенная переменная:ряд'
И все же мне кажется, что ряд определен...
$sql = 'SELECT * FROM table WHERE id="1" LIMIT 1 ';
$res = mysql_query($sql);
if(mysql_num_rows($res) != FALSE) {
$row = mysql_fetch_array($res);
}
Вышеуказанное является псевдо-sql...но я проверил этот оператор sql и знаю, что он дает результат.Я также знаю, что $row хранит данные, потому что если я пойду
echo $row[0];
Я получаю правильные данные.
Насколько мне известно, переменная $row определена.И все же - ошибка.Я схожу с ума или чего мне здесь не хватает?Разве эта ошибка/уведомление не должна возникать только в том случае, если $row не существует?
редактировать
Извините, ребята, все это происходит ВНУТРИ оператора if:
$sql = 'SELECT * FROM table WHERE uID="' . $ID . '" LIMIT 1 ';
$res = mysql_query($sql);
if(mysql_num_rows($res) != FALSE) {
$row = mysql_fetch_array($res);
$firstName = $row[0];
$lastName = $row[1];
$email = $row[2];
}
редактировать 2
если я сделаю print_r($row), я получу следующее:
Array
(
[0] => Robert
[firstName] => Robert
[1] => Nibbles
[lastName] => Nibbles
[2] => robert@nibbles.com
[email] => robert@nibbles.com
)
Undefined variable: row
Решение
Если вы не инициализируете $row
к чему-то вне этого оператора if, тогда оно не определено.
В противном случае, если вы не хотите инициализировать $row
к какому-то нулевому значению (что не совсем необоснованно), вы можете захотеть окружить любой код, проверяющий $row
за пределами if
заявление с чем-то вроде
if (isset($row)) doSomething();
Это неприятно, но вам просто нужно помнить, что любые переменные, которые вы не определяете явно, даже если они равны нулю, не определены и могут привести к ошибке во время выполнения, если на них ссылаются как на rvalue в коде (за исключением isset
и т. д.).В общем, либо всегда инициализируйте переменные, либо свободно применяйте код, подобный приведенному выше.
Прошу прощения, если проблема не в этом, но я не могу придумать ничего большего, не видя вашего кода.
РЕДАКТИРОВАТЬ:Извините, это «isset», а не «определено».Прошло много времени с тех пор, как я действительно работал с PHP.Я попытался ответить на вопрос с помощью концепции, а не синтаксиса.Виноват.
Другие советы
Оффтоп, но рекомендую использовать mysql_fetch_assoc() вместо mysql_fetch_array вы можете использовать в коде фактические имена полей вместо произвольных чисел.
print $row[2]
против
print $row['email];