Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите найти ошибку в php скрипте  (Прочитано 11990 раз)
0 Пользователей и 1 Гость смотрят эту тему.
andrystepa
Помогающий

ru
Offline Offline

« : 29-09-2008 10:55 » 

Который день бьюсь, никак не могу найти, где напортачил. Вроде все просто:
база данных на MySQL 5.0.45. В ней есть таблица makers с полями makers_id INT auto_increment not null - первичный ключ, и makers_name VARCHAR. Мне нужно из этой таблицы (в смысле из полей makers_name) сделать выпадающий список. Для начала пишу страницу авторизации:
Код:
<html>
<head>
<title></title>
</head>
<body>
<?php
$conn
mysql_connect("localhost"$userl$userp);
if(
$conn) {
print <<<HERE
<div align="center"><h1><font color="red" face="Comic Sans MS">
You connected!
</font></h1></div>
<br><br>
<div align="center">
<a href="showlist1.php">
<font size="+2" color="#0000FF">Checking</font>
</a>
</div>

HERE;
mysql_select_db("Classificator"$conn);
}
else {
print "<h1>Connection failed!</h1>";
}
?>

</body>
</html>

Далее, если подключение удалось, то переходим на страницу "Проверка" (или showlist1.php):
Код:
<html>
<head>
<title></title>

<?php
include "ClLib.php";
?>


</head>
<body>
<h1><div align="center"><font size="+2" color="#FF0045" face="Comic Sans MS">Makers list/font></div></h1>
<br><br><br><br>

<?php
//connection to BD
$conn mysql_connect($serverName, &#39;myserver&#39;, &#39;4321&#39;);
mysql_select_db("Classificator"$conn);
//create query
$sql "SELECT * FROM makers";
$result mysql_query($sql);
if (
$result) {
print <<<
HERE 
<
select name="selman" id="selman">
HERE;
print printlist($result);
print <<<HERE
</select>
HERE;
} else { print 
"Query Error"; }
?>


</body>
</html>

В библиотеке ClLib.php функция printlist($result) выглядит так:
Код:
function printlist($result) {
while ($names = mysql_fetch_assoc($result)) {
$output .= " <option value=.$names['maker_name']>";
$output .= ".$names['maker_name'].</option>\n";
}
return $output;
}

При попытке войти на страницу "Проверка" браузер выдает сообщение: "Ошибка при загрузке http://develop.ru/Classificator/showlist1.php:
Внутренняя ошибка сервера
 myserver.ru"
Это выдает Konqueror, Firefox вообще выдает пустую страницу, а в консоли ошибок пустота.
А в логе апача написано вот что:
Код:
[Mon Sep 29 14:33:44 2008] [error] [client 169.254.37.2] PHP Parse error:  syntax error, unexpected T_SL in /var/www/develop/Classificator/showlist1.php on line 34, referer: http://develop.ru/Classificator/enter.php
строка 34 (вместе с последующими) выглядит так:
Код:
print <<<HERE
<select name="selman" id="selman">
printlist($result)
</select>
HERE;

и я не могу понять, где же тут ошибка? У меня есть отладчик для php, но он под винду. Может еще подскажете, чем можно отлаживать код?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 29-09-2008 18:08 » 

andrystepa, 90% твое информации - лишнее. Тебе PHP дал четкий ответ: parse error - ошибка синтаксического разбора. Ищи ошибку у себя в коде на указанной строке и раньше. После этой строки искать не имеет смысла, т.к. разбор дальше не пошел.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #2 : 30-09-2008 07:49 » 

andrystepa, 90% твое информации - лишнее. Тебе PHP дал четкий ответ: parse error - ошибка синтаксического разбора. Ищи ошибку у себя в коде на указанной строке и раньше. После этой строки искать не имеет смысла, т.к. разбор дальше не пошел.
Попробовал проверить синтаксис php в Bluefish - он мне тоже указал, что ошибка в строке 34, но строку он выделил совсем другую - не ту, что в исходном коде стоит тридцать четвертой, а завершающий тег страницы "Проверка" - </html>!! Тут я совсем в тупике - там то где ошибка? Строкой выше стоит тег </body> - тут тоже вроде все в порядке....
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 30-09-2008 08:25 » 

andrystepa, нафиг умные программы: открой указанный файл простым текстовым редактором, найди строку 34 и проверяй синтаксис ее и предществующих.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 30-09-2008 08:26 » 

Код:
function printlist($result) {
while ($names = mysql_fetch_assoc($result)) {
$output .= " <option value=.$names['maker_name']>";
$output .= ".$names['maker_name'].</option>\n";
}
return $output;
}
Чья ClLib.php ? Чужая? Своя?
Браво!
$output кто-нибудь инициализировал?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 30-09-2008 08:27 » 

Sla, это не parse error - только notice. Parse error это такое вот:

" <option value=.$names['maker_name']>"

В этих строках полная несуразица написана.
« Последнее редактирование: 30-09-2008 08:37 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 30-09-2008 08:35 » 

andrystepa, вот ты привел код
ощущение, что куски надерганы
сравни
$conn= mysql_connect("localhost", $userl, $userp);

и

$conn = mysql_connect($serverName, 'myserver', '4321');
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 30-09-2008 08:39 » 

RXL, это я к тому, что надо код причесать, а ошибка сама проявится
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #8 : 30-09-2008 10:12 » 

Sla,  Так ведь естесственно они отличаются! Первый коннект сделан для того, чтобы проверить логин и пароль пользователя. Переменные берутся из формы на предыдущей странице - она то и отправляет переменные в показанную - вообще я привел эту страницу для справки, чтобы было понятно, откуда дело началось.
Sla, это не parse error - только notice. Parse error это такое вот:

" <option value=.$names['maker_name']>"

В этих строках полная несуразица написана.
Можно пообстоятельнее объяснить в чем тут несуразица? Я написал это по аналогии с примером из книги Кузнецова и Симдянова "MYSQL 5. Наиболее полное руководство". Там правда выводилась таблица, и код был такой:
Код:
while($catalogs = mysql_fetch_assoc($cat)
      {
       echo "<tr>
                 <td>".$catalogs['id_catalog']."</td>
                 <td>".$catalogs['name']."</td>
                </tr>";
       }
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 30-09-2008 11:21 » 

а так слабо попробовать?

$output .= " <option value=".$names['maker_name'].">";
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #10 : 30-09-2008 11:24 » 

Вот что еще меня сильно смущает. Если я в браузере отображаю эту страницу в виде исходного кода, выдается вот это:
Код:
<html>
<head>
<title></title>
</head>
<body>

<h1><div align="center">Список разработчиков</div></h1>
<br><br><br><br>
<?php
include "ClLib.php";
//соединение с БД
$conn mysql_connect($serverName, &#39;ansaldo&#39;, &#39;1234&#39;);
mysql_select_db("Classificator"$conn);

//создаем запрос
$sql "SELECT * FROM makers";
$result mysql_query($sql);
if (
$result) {
print <<<HERE
<select name="selman1" id="selman1">
printlist(
$result)
</select>
HERE;

else { print 
"Query Error"; }
?>

</body>
</html>
Но ведь браузер не должен отображать внутренность php скрипта! Он же обрабатывается на строне сервера! И в браузер код уже вроде как передаваться не должен. Так почему апач выдал код?
И еще,
Код:
function printlist($result) {
while ($names = mysql_fetch_assoc($result)) {
$output .= " <option value=.$names['maker_name']>";
$output .= ".$names['maker_name'].</option>\n";
}
return $output;
}
Чья ClLib.php ? Чужая? Своя?
Браво!
$output кто-нибудь инициализировал?
ClLib.php - своя. А вот про инициализацию - то позабыл!! Это верно, спасибо большое! Только вот переписал код функции так:
Код:
function printlist() {
$output = <<<HERE
<select name="selman1" id="selman1">
HERE;
while ($names = mysql_fetch_assoc($result)) {
$name = $names['maker_name'];
$output .= " <option value = $name>";
$output .= "$name</option>\n";
}
return $output;
}
А браузер все равно рисует страницу с заголовком - а далее пусто. А в исходном коде показывает блок кода php, который он и видеть то не должен!
Записан
andrystepa
Помогающий

ru
Offline Offline

« Ответ #11 : 30-09-2008 11:32 » 

Sla,
Попробовал. Нифига не изменилось. Попробовал еще так:
Код:
                                $name = $names['maker_name'];
$output .= " <option value = $name>";
$output .= ""$name"</option>\n";
то же самое. Браузер выдает страницу на которой только заголовок, а в исходном коде упорно показывает код php.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 30-09-2008 12:05 » 

andrystepa, см.настройку веб-сервера и расширение твоих файлов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 30-09-2008 12:09 » 

andrystepa, я тебе показал как тебе избавиться от ошибки

Покажи полученный ответ (исходный код) что дает браузер

кроме того
Код:
function printlist() {
$output = <<<HERE
<select name="selman1" id="selman1">
HERE;
while ($names = mysql_fetch_assoc($result)) {
$name = $names['maker_name'];
$output .= " <option value = $name>";
$output .= "$name</option>\n";
}
return $output;
}

select нужно закрыть
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #14 : 30-09-2008 13:07 » 

select закрыл. Переименовал файл из showlist.html  в showlist.php. Браузер - Konqueror, теперь блоков php  кода не пишет и выдает такое:
Код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
</head>
<body>
<h1><div align="center">Сприсок разработчиков</div></h1>
<br><br><br><br>
<style type = "text/css">
body{
  background-color: tan;
  color: black;
  text-align:center
}

</style>

<select name="selman1" id="selman1"></select></body>
</html>
То есть теперь он не хочет добавлять в переменную $output, то что добавляется в теле цикла while. Но у меня проверяестя результат функции mysql_query($sql). То есть результат запроса не пустой!
Записан
andrystepa
Помогающий

ru
Offline Offline

« Ответ #15 : 30-09-2008 13:16 » 

Ур-р-ра-а-а! Заработало!!! Я в процессе изменения кода пропустил, что в функции printlist() используется внешняя переменная $result, которую надо бы в функцию передать! Переопределил функцию как printlist($result), подставил значение и все заработало! Всем большое спасибо!
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 30-09-2008 13:20 » 

ну так попробуй без цикла, ради теста
потом в цикле выводи результат запроса
или же без функции printlist
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #17 : 01-10-2008 05:42 » 

ну так попробуй без цикла, ради теста
потом в цикле выводи результат запроса
или же без функции printlist
Ну раз работает, то и не нужно без функции - она мне нужна, так как на странице надо вывести несколько выпадающих списков составленных из разных таблиц базы.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines