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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите найти ошибку в php скрипте  (Прочитано 23693 раз)
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 - ошибка синтаксического разбора. Ищи ошибку у себя в коде на указанной строке и раньше. После этой строки искать не имеет смысла, т.к. разбор дальше не пошел.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
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 и проверяй синтаксис ее и предществующих.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
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 » new

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

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

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
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, см.настройку веб-сервера и расширение твоих файлов.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
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