Войти

Показать полную графическую версию : [решено] Ошибки "Undefined variable"


FoXLee
11-09-2008, 15:14
Здравствуйте. Сделал небольшой набор кодов для того, чтобы можно было добавлять, смотреть, обновлять и удалять данные из таблиц, код работает, но в некоторых местах выдает уведомление: "Undefined variable" и кое-где не работает как надо.

Ошибка: Notice: Undefined variable: display_block in C:\apache\localhost\www\sel_bydate.php on line 31

<?
$db_name = "GoDB";
$table_name = "vacansies";
$connection = @mysql_connect("localhost", "root", "qwerty")
or die("Невозможно подключиться MySQL.");
$db = @mysql_select_db ($db_name, $connection)
or die ("Невозможно выбрать базу данных.");
$sql = "SELECT * FROM $table_name ORDER BY date DESC";
$result = @mysql_query($sql, $connection)
or die("Невозможно выполнить запрос.");

while ($row = mysql_fetch_array($result)) {

$vac_id = $row['vac_id'];
$vac_name = $row['vac_name'];
$age = $row['age'];
$formation = $row['formation'];
$exp = $row['exp'];
$duties = $row['duties'];
$conditions = $row['conditions'];
$contacts = $row['contacts'];
$date = $row['date'];

$display_block .= "
<p><strong>$vac_name</strong><br>
<strong>Требования: </strong> Возраст: $age $formation $exp<br>
<strong>Обязанности: </strong> $duties<br>
<strong>Условия: </strong> $conditions $contacts<br>
<strong>Дата добавления вакансии: </strong> $date
</p>
";


}

?>
<html>
<head>
<title>Список Вакансий (сортировка по номеру)</title>
</head>
<body>
<h1>Список Вакансий</h1>
<?
echo "$display_block";
?>
<p><a href ="index.php">Назад</a></p>
</body>
</html>

Ошибка: Notice: Undefined variable: option_block in C:\apache\localhost\www\pick_modvac.php on line 15

<?
$db_name = "GoDB";
$table_name = "vacansies";
$connection = @mysql_connect("localhost", "root", "qwerty")
or die("Невозможно подключиться MySQL.");
$db = @mysql_select_db ($db_name, $connection)
or die ("Невозможно выбрать базу данных.");
$sql = "SELECT vac_id, vac_name, date FROM $table_name ORDER BY date";
$result = @mysql_query($sql, $connection)
or die("Невозможно выполнить запрос.");
while ($row = mysql_fetch_array($result)) {
$vac_id = $row['vac_id'];
$vac_name = $row['vac_name'];
$date = $row['date'];
$option_block .= "<option value=\"$vac_id\">$vac_name, $date</option>";
}
$display_block = "
<FORM METHOD=\"post\" ACTION=\"show_modvac.php\">
<p><strong>Вакансия:</strong>
<select name=\"vac_id\">
$option_block
</select>
<p><INPUT TYPE=\"SUBMIT\" NAME=\"submit\" VALUE=\"Изменить\"></P>
</form>
";
?>
<html>
<head>
<title>Управление вакансиями: Изменение вакансии</title>
</head>
<body>
<h1>Управление вакансиями</h1>
<h2><em>Изменение вакансии - Выбор из списка</em></h2>
<p>Выберите вакансию из списка, чтобы изменить записанную информацию</p>
<? echo "$display_block"; ?>
<p><a href="index.php">Возврат к главному меню</a></p>
</body>
</html>

Ну и самый главный гемор, который весь вечер вчерашний пытался вылечить (поскольку только он мешает нормальной работе "системы управления БД"):
На странице при открытии, в полях ввода должны уже находиться данные, которые хранятся в базе данных для выбранной вакансии. Чтобы было удобно обновлять информацию, не вбивая её всю заново. При открытии вместо данных из базы данных в полях ввода ошибка:
<br /> <b>Notice</b>: Undefined variable: vac_name in <b>C:\apache\localhost\www\show_modvac.php</b> on line <b>38</b><br />

в каждом поле соответственно вместо "vac_name" и линии другие переменные. НО в первом поле (vac_id - "номер вакансии") есть цифра 1 - т.е. первое поле заполнилось как надо. Далее код этой страницы:

<?
$db_name = "GoBD";
$table_name = "vacansies";
$connection = @mysql_connect("localhost", "root", "qwerty")
or die("Невозможно подключиться MySQL.");
$db = @mysql_select_db ($db_name, $connection)
or die ("Невозможно выбрать базу данных.");
$sql = "SELECT vac_id, vac_name, age, formation, exp, duties, conditions, contacts, date
FROM $table_name
WHERE vac_id = \"vac_id\"
";
$result = @mysql_query($sql, $connection)
or die("Невозможно выполнить запрос.");
while ($row = mysql_fetch_array($result)) {
$vac_id = $row['vac_id'];
$vac_name = $row['vac_name'];
$age = $row['age'];
$formation = $row['formation'];
$exp = $row['exp'];
$duties = $row['duties'];
$conditions = $row['conditions'];
$contacts = $row['contacts'];
$date = $row['date'];
}
?>
<html>
<head>
<title>Управление вакансиями: Изменение вакансии</title>
</head>
<body>
<h1>Управление вакансиями</h1>
<h2><em>Изменение вакансии</em></h2>
<FORM METHOD="post" ACTION="do_modvac.php">
<INPUT TYPE="hidden" name="vac_id" value="<? echo "$vac_id"; ?>">
<P><STRONG>Номер вакансии :</STRONG><BR>
<INPUT TYPE="text" NAME="vac_id" VALUE="<? echo "$vac_id"; ?>" SIZE=5 MAXLENGHT=5></p>
<P><STRONG>Должность :</STRONG><BR>
<INPUT TYPE="text" NAME="vac_name" VALUE="<? echo "$vac_name"; ?>" SIZE=100 MAXLENGHT=150></p>
<P><STRONG>Возраст :</STRONG><BR>
<INPUT TYPE="text" NAME="age" VALUE="<? echo "$age"; ?>" SIZE=20 MAXLENGTH=100</p>
<P><STRONG>Образование :</STRONG><BR>
<INPUT TYPE="text" NAME="formation" VALUE="<? echo "$formation"; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Опыт работы :</STRONG><BR>
<INPUT TYPE="text" NAME="exp" VALUE="<? echo "$exp"; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Обязанности :</STRONG><BR>
<INPUT TYPE="text" NAME="duties" VALUE="<? echo "$duties"; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Условия :</STRONG><BR>
<INPUT TYPE="text" NAME="conditions" VALUE="<? echo "$conditions"; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Контакты :</STRONG><BR>
<INPUT TYPE="text" NAME="contacts" VALUE="<? echo "$contacts"; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Дата добавления вакансии (ГГГГ-ММ-ДД) :</STRONG><BR>
<INPUT TYPE="text" NAME="date" VALUE="<? echo "$date"; ?>" SIZE=10 MAXLENGTH=10</p>
<P><INPUT TYPE="SUBMIT" NAME="submit" VALUE="Обновить"></P>
<p><a href="pick_modvac.php">Назад</a></p>
<p><a href="index.php">Возврат к главному меню</a></p>
</FORM>
</BODY>
</HTML>

Coutty
11-09-2008, 16:02
В первом куске - напишите $display_block = ""; перед while. Видимо, к несуществующей переменной он добавлять строку не может.
Во втором, соответственно, $option_block=""; перед while.

По третьему что могу сказать:
1. Когда пишите echo $var_id; и т.д. кавычки можно не ставить.
2. Зачем вот это в цикле: while ($row = mysql_fetch_array($result)) ? Одна ведь строка выбирается. Избавьтесь от while.
3. Зачем заниматься такой ерундой: $vac_id = $row['vac_id']; , если можно потом просто написать echo $row['vac_id']; ?
4. Попробуйте вывести содержимое переменной $row: print_r($row); после mysql_fetch_array(). Посмотрим, что оно выдаёт.
5. Это мелочь, но всё же, не везде php-парсер принимает скрипт, если он заключён в short-тэги: <? ... ?>. Пишите лучше <?php ... ?>
В общем-то, всё это (кроме п.4) и к первому скрипту относится.

FoXLee
11-09-2008, 16:15
ясно, спасибо, буду пробовать когда освобожусь, позже отпишусь.

FoXLee
11-09-2008, 17:25
Спасибо, с первым и вторым разобрался.

Теперь далее:

При таком коде, ошибка:
Parse error: syntax error, unexpected ':' in C:\apache\localhost\www\show_modvac.php on line 15
<?
$db_name = "jobnav";
$table_name = "vacansies";
$connection = @mysql_connect("localhost", "root", "qwepoi")
or die("Невозможно подключиться MySQL.");
$db = @mysql_select_db ($db_name, $connection)
or die ("Невозможно выбрать базу данных.");
$sql = "SELECT vac_id, vac_name, age, formation, exp, duties, conditions, contacts, date
FROM $table_name
WHERE vac_id = \"vac_id\"
";
$result = @mysql_query($sql, $connection)
or die("Невозможно выполнить запрос.");
$row = mysql_fetch_array($result);
$row: print_r($row);
?>
<html>
<head>
<title>Управление вакансиями: Изменение вакансии</title>
</head>
<body>
<h1>Управление вакансиями</h1>
<h2><em>Изменение вакансии</em></h2>
<FORM METHOD="post" ACTION="do_modvac.php">
<INPUT TYPE="hidden" name="vac_id" value="<? echo $vac_id; ?>">
<P><STRONG>Номер вакансии :</STRONG><BR>
<INPUT TYPE="text" NAME="vac_id" VALUE="<? echo $vac_id; ?>" SIZE=5 MAXLENGHT=5></p>
<P><STRONG>Должность :</STRONG><BR>
<INPUT TYPE="text" NAME="vac_name" VALUE="<? echo $vac_name; ?>" SIZE=100 MAXLENGHT=150></p>
<P><STRONG>Возраст :</STRONG><BR>
<INPUT TYPE="text" NAME="age" VALUE="<? echo $age; ?>" SIZE=20 MAXLENGTH=100</p>
<P><STRONG>Образование :</STRONG><BR>
<INPUT TYPE="text" NAME="formation" VALUE="<? echo $formation; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Опыт работы :</STRONG><BR>
<INPUT TYPE="text" NAME="exp" VALUE="<? echo $exp; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Обязанности :</STRONG><BR>
<INPUT TYPE="text" NAME="duties" VALUE="<? echo $duties; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Условия :</STRONG><BR>
<INPUT TYPE="text" NAME="conditions" VALUE="<? echo $conditions; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Контакты :</STRONG><BR>
<INPUT TYPE="text" NAME="contacts" VALUE="<? echo $contacts; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Дата добавления вакансии (ГГГГ-ММ-ДД) :</STRONG><BR>
<INPUT TYPE="text" NAME="date" VALUE="<? echo $date; ?>" SIZE=10 MAXLENGTH=10</p>
<P><INPUT TYPE="SUBMIT" NAME="submit" VALUE="Обновить"></P>
<p><a href="pick_modvac.php">Назад</a></p>
<p><a href="index.php">Возврат к главному меню</a></p>
</FORM>
</BODY>
</HTML>

При изменении echo $vac_name на echo $row['vac_name'] - поле ввода просто пустое, без ошибок, но и без инфы из БД.

Как я уже говорил, поле "Номер вакансии" (vac_id) он показывает правильно, может из-за того, что там только цифры, а с текстом он не может подружиться?

DedAlex
11-09-2008, 17:34
FoXLee, а что это за странная команда?$row: print_r($row);

FoXLee
11-09-2008, 17:35
Если сделать так, то разницы не видно:
<?
$db_name = "jobnav";
$table_name = "vacansies";
$connection = @mysql_connect("localhost", "root", "qwepoi")
or die("Невозможно подключиться MySQL.");
$db = @mysql_select_db ($db_name, $connection)
or die ("Невозможно выбрать базу данных.");
$sql = "SELECT vac_id, vac_name, age, formation, exp, duties, conditions, contacts, date
FROM $table_name
WHERE vac_id = \"vac_id\"
";
$result = @mysql_query($sql, $connection)
or die("Невозможно выполнить запрос.");
$row = mysql_fetch_array($result);
print_r($row);
?>
<html>
<head>
<title>Управление вакансиями: Изменение вакансии</title>
</head>
<body>
<h1>Управление вакансиями</h1>
<h2><em>Изменение вакансии</em></h2>
<FORM METHOD="post" ACTION="do_modvac.php">
<INPUT TYPE="hidden" name="vac_id" value="<? echo $vac_id; ?>">
<P><STRONG>Номер вакансии :</STRONG><BR>
<INPUT TYPE="text" NAME="vac_id" VALUE="<? echo $vac_id; ?>" SIZE=5 MAXLENGHT=5></p>
<P><STRONG>Должность :</STRONG><BR>
<INPUT TYPE="text" NAME="vac_name" VALUE="<? echo $vac_name; ?>" SIZE=100 MAXLENGHT=150></p>
<P><STRONG>Возраст :</STRONG><BR>
<INPUT TYPE="text" NAME="age" VALUE="<? echo $age; ?>" SIZE=20 MAXLENGTH=100</p>
<P><STRONG>Образование :</STRONG><BR>
<INPUT TYPE="text" NAME="formation" VALUE="<? echo $formation; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Опыт работы :</STRONG><BR>
<INPUT TYPE="text" NAME="exp" VALUE="<? echo $exp; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Обязанности :</STRONG><BR>
<INPUT TYPE="text" NAME="duties" VALUE="<? echo $duties; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Условия :</STRONG><BR>
<INPUT TYPE="text" NAME="conditions" VALUE="<? echo $conditions; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Контакты :</STRONG><BR>
<INPUT TYPE="text" NAME="contacts" VALUE="<? echo $contacts; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Дата добавления вакансии (ГГГГ-ММ-ДД) :</STRONG><BR>
<INPUT TYPE="text" NAME="date" VALUE="<? echo $date; ?>" SIZE=10 MAXLENGTH=10</p>
<P><INPUT TYPE="SUBMIT" NAME="submit" VALUE="Обновить"></P>
<p><a href="pick_modvac.php">Назад</a></p>
<p><a href="index.php">Возврат к главному меню</a></p>
</FORM>
</BODY>
</HTML>

т.е. Что есть команда print_r($row); что её нету - нет новых ошибок

Вот картинка, чтобы понятнее было о чем речь

http://s39.radikal.ru/i085/0809/17/6df24587226dt.jpg (http://radikal.ru/F/s39.radikal.ru/i085/0809/17/6df24587226d.jpg.html)

Coutty
11-09-2008, 18:05
т.е. Что есть команда print_r($row); что её нету - нет новых ошибок »
Смотрите в HTML, а не в рендеренной странице. Оно же выводится перед <html>, а значит в браузере видно не будет.
Ну или вставьте print_r($row); внутри <body>, чтобы увидеть вывод прямо в браузере. Для удобства можно окружить тэгами <pre>:

...
<body><pre>
<?php
print_r($row);
?>
</pre>
...

Должно выводится содержание массива $row.

FoXLee
11-09-2008, 18:14
Все равно ничего нету, может это и есть ответ?
<html>
<head>
<title>Управление вакансиями: Изменение вакансии</title>
</head>
<body>
...
<body><pre>
</pre>
...
<h1>Управление вакансиями</h1>

<h2><em>Изменение вакансии</em></h2>
<FORM METHOD="post" ACTION="do_modvac.php">
<INPUT TYPE="hidden" name="vac_id" value="3">
<P><STRONG>Номер вакансии :</STRONG><BR>
<INPUT TYPE="text" NAME="va..........

Coutty
11-09-2008, 18:24
Хм... Нет, это не тот ответ) Похоже, что $row просто не существует. Может быть ошибка в SQL-запросе?
Теперь давайте сделаем так:
$sql = "SELECT vac_id, vac_name, age, formation, exp, duties, conditions, contacts, date
FROM $table_name
WHERE vac_id = \"vac_id\"
";
echo $sql;

Посмотрим какой тут запрос формируется.
Может быть не vac_id = \"vac_id\", а vac_id = \"$vac_id\" надо? (кстати, откуда эта vac_id берётся? Из GET или POST-запроса? Тогда пишите $_GET['vac_id'] или $_POST['vac_id'].

Igor_I
12-09-2008, 01:30
Что-то я запамятовал, но мне кажется что идет путаница между полями в MySQL и переменными в PHP. После запроса к базе надо присваивать полученные значения переменным.

FoXLee
12-09-2008, 14:15
Coutty, Вы были правы, $row не существовал из-за vac_id = \"vac_id\", вместо vac_id = \"$vac_id\" . Я заменил echo $vac_name на echo $row['vac_name'] и все заполнилось без проблем, ну и убрал из кода вывод запроса sql и отображение $row

Рабочий код:
<?
$db_name = "jobnav";
$table_name = "vacansies";
$connection = @mysql_connect("localhost", "root", "qwepoi")
or die("Невозможно подключиться MySQL.");
$db = @mysql_select_db ($db_name, $connection)
or die ("Невозможно выбрать базу данных.");
$sql = "SELECT vac_id, vac_name, age, formation, exp, duties, conditions, contacts, date
FROM $table_name
WHERE vac_id = \"$vac_id\"
";
$result = @mysql_query($sql, $connection)
or die("Невозможно выполнить запрос.");
$row = mysql_fetch_array($result);
?>
<html>
<head>
<title>Управление вакансиями: Изменение вакансии</title>
</head>
<body>
<h1>Управление вакансиями</h1>
<h2><em>Изменение вакансии</em></h2>
<FORM METHOD="post" ACTION="do_modvac.php">
<INPUT TYPE="hidden" name="vac_id" value="<? echo $vac_id; ?>">
<P><STRONG>Номер вакансии :</STRONG><BR>
<INPUT TYPE="text" NAME="vac_id" VALUE="<? echo $vac_id; ?>" SIZE=5 MAXLENGHT=5></p>
<P><STRONG>Должность :</STRONG><BR>
<INPUT TYPE="text" NAME="vac_name" VALUE="<? echo $row['vac_name']; ?>" SIZE=100 MAXLENGHT=150></p>
<P><STRONG>Возраст :</STRONG><BR>
<INPUT TYPE="text" NAME="age" VALUE="<? echo $row['age']; ?>" SIZE=20 MAXLENGTH=100</p>
<P><STRONG>Образование :</STRONG><BR>
<INPUT TYPE="text" NAME="formation" VALUE="<? echo $row['formation']; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Опыт работы :</STRONG><BR>
<INPUT TYPE="text" NAME="exp" VALUE="<? echo $row['exp']; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Обязанности :</STRONG><BR>
<INPUT TYPE="text" NAME="duties" VALUE="<? echo $row['duties']; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Условия :</STRONG><BR>
<INPUT TYPE="text" NAME="conditions" VALUE="<? echo $row['conditions']; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Контакты :</STRONG><BR>
<INPUT TYPE="text" NAME="contacts" VALUE="<? echo $row['contacts']; ?>" SIZE=100 MAXLENGTH=150</p>
<P><STRONG>Дата добавления вакансии (ГГГГ-ММ-ДД) :</STRONG><BR>
<INPUT TYPE="text" NAME="date" VALUE="<? echo $row['date']; ?>" SIZE=10 MAXLENGTH=10</p>
<P><INPUT TYPE="SUBMIT" NAME="submit" VALUE="Обновить"></P>
<p><a href="pick_modvac.php">Назад</a></p>
<p><a href="index.php">Возврат к главному меню</a></p>
</FORM>
</BODY>
</HTML>

Всем спасибо.

ой, забыл изменить $vac_id на echo $row['vac_id'] в html в hidden и text, но и с "$vac_id" - тоже отображается правильно. Странно.

Работает во всех полях как $vac_id так и $row['vac_id'], вся проблема была в недостающем знаке $ в WHERE vac_id = \"$vac_id\" :)

Coutty
12-09-2008, 18:36
ой, забыл изменить $vac_id на echo $row['vac_id'] в html в hidden и text, но и с "$vac_id" - тоже отображается правильно. Странно. »
Включен параметр register_globals в php.ini? Похоже на то.
Тогда этот $vac_id берётся из $_GET[vac_id] или $_POST[vac_id] (в общем, из $_QUERY[vac_id]), а не из $row.

И ещё - зачем $vac_id писать и в hidden-поле, и в text? Name у переменной одно и тоже. Можно убрать hidden.

FoXLee
12-09-2008, 18:52
register_globals выключен

Igor_I
12-09-2008, 18:58
ой, забыл изменить $vac_id на echo $row['vac_id'] в html в hidden и text, но и с "$vac_id" - тоже отображается правильно. Странно. »
Правильно только потому, что $vac_id и $row['vac_id'] в данном случае равны.

echo $_POST[vac_id] - что покажет?




© OSzone.net 2001-2012