|
|
|
| Всем добрый день! Скачал с Вашего сайта каталого продукции, поставил. Вроде все нормально. но когда посмотреть даный из базы. то выводить нормально только первый раз. Когда выбираешь другую категорию или подкатегорию, выдает ошибку:
Notice: Undefined variable: categ_id in d:\project\www\catalog\categ.php on line 20
Notice: Undefined variable: sub_id in d:\project\www\catalog\categ.php on line 34
Notice: Undefined variable: sub_id in d:\project\www\catalog\categ.php on line 42
вроде бы там все нормально, никак не могу найти причину. Помогите.
Сам каталог есть в довноадсах | |
|
|
|
|
|
|
|
для: sitkar
(21.12.2007 в 15:44)
| | Заглушите notic'ы
error_reporting(E_ALL & ~E_NOTICE);
Это просто советы по написанию кода. | |
|
|
|
|
|
|
|
для: antf
(21.12.2007 в 16:31)
| | Заглушать ничего не надо. Надо исправлять. | |
|
|
|
|
|
|
|
для: Unkind
(21.12.2007 в 16:35)
| | Я не вижу что там исправлять. Там вроде все нормально. Идет стандартный запрос к базе. Ичего серйозного. Если есть предложение что и где исправить с удовольствием выслушаю | |
|
|
|
|
|
|
|
для: sitkar
(21.12.2007 в 16:38)
| | Лень лезть в downloads, искать тот каталог и нужный файл. Выложите тут часть кода. | |
|
|
|
|
|
|
|
для: Unkind
(21.12.2007 в 16:48)
| | [поправлено модератором: объемные файлы лучше прикреплять в виде архива] | |
|
|
|
|
|
|
|
для: sitkar
(21.12.2007 в 17:20)
| | Грязный код...
Я бы посоветовал не использовать скрипт, в противном случае переписывать.
Автор позволяет делать такие небрежности, как "while ($category[]=mysql_fetch_array($result, MYSQL_ASSOC)){}", где $category - неопределенная переменная. И это при том, что код написан для register_globals = on. Тут где-нибудь таким образом может нарисоваться уязвимость.
Переписывается примерно так:
<?php
$id = isset( $_GET['id'] ) ? (int) $_GET['id'] : 0;
$query = "SELECT * FROM `categ` WHERE `id` = " . $id . ";";
if( !($result = mysql_query($query, $aDBLink)) )
{
die( 'Failure: ' . mysql_error() . ', File: ' . __FILE__ . ', Line: ' . __LINE__ );
}
if( mysql_num_rows($result) < 1 )
{
// Тут можно поставить переадресацию в корень каталога
die( 'Section does not exist' );
}
$category = array();
while( $category[] = mysql_fetch_assoc($result) )
{
// ...
}
// И так далее
?>
|
| |
|
|
|
|
|
|
|
для: sitkar
(21.12.2007 в 17:20)
| | Здесь:
if (@!$_GET['categ_id']) //заглушен вывод предупрежедния, если нет запроса
{
.....
//переменная $categ_id будет инициализирована только тогда,
//когда придет соответствующий запрос из меню
$categ_id=$aRow["categ_id"];
}
//но далее вне условия проверки, идет обращение к этой переменной
$query = "SELECT * FROM subcat WHERE categ_id='$categ_id'";
|
Аналогично и далее. | |
|
|
|
|
|
|
|
для: sim5
(21.12.2007 в 17:42)
| | Но ведь это уязвимость. Если уж код и написан для RG = on, то и работать надо только с одними и теме же переменными. Нужно приводить $categ_id получать из $_GET['categ_id'] и приводить к integer. Собственно, Вы забыли это сказать. | |
|
|
|
|
|
|
|
для: Unkind
(21.12.2007 в 17:48)
| | Да нет, просто и не хотел говорить, а единственно указать то место - "почему". Просто меня "бесит", когда советуют просто подавить эти предупреждения и забыть о них, а что за этой "безобидностью" может скрываться... Хотя нет, не бесит, на форуме это как "философия", пусть будет так. :) | |
|
|
|
|
|
|
|
для: sim5
(21.12.2007 в 17:42)
| | И что можно придумать что бы выправлять пришлось поменьше. Вариант Unkind сейчас разбираю и пробую переписать скрипт. Но еще советы будут полезны. | |
|
|
|
|
|
|
|
для: sitkar
(21.12.2007 в 19:03)
| | Ну чтобы "выправлять" поменьше, примите конечно этот вариант - error_reporting(E_ALL & ~E_NOTICE), править вообще ничего не надо.
Либо вы будете задумываться над скриптом (ищите на форуме темы о защите кода) в ущерб времени, либо примите все как есть, экономя время, - выбирать вам. | |
|
|
|
|
|
|
|
для: sim5
(21.12.2007 в 20:03)
| | Спасибо за совет! Я так и сделаю! Лучше один раз хорошо разобратся с етим всем чем потом мучится! | |
|
|
|
|
|
|
|
для: Unkind
(21.12.2007 в 16:35)
| | Согласен, с вами. Мало того, что РНР "небрежен", так еще советовать тому кто не понимает о чем предупрждение и почему, подавить все, забыть и не думать об этом. | |
|
|
|
|
|
|
|
для: antf
(21.12.2007 в 16:31)
| | Интересно! antf Вы же вроде разработчик CMS, которая представлена на сайте Softtime.
И Вы говорите о подавлении ошибок, которые действительно надо исправлять и думать почему эта ошибка возникла.
P.S. Вы наверно не сталкивались с компилируемыми языками :) | |
|
|
|
|
|
|
|
для: Faraon
(21.12.2007 в 21:01)
| | Я учился на скриптах Softtime, а они советуют подавлять эти ошибки. В общем я это тоже перенял.
Не понимаю, откуда такая любовь к notic'ам. Это же просто советы. В общем зависит от стиля разработчика. Хотя я всегда пишу под register globals = off
PS Сталкивался, только довольно давно. | |
|
|
|
|
|
|
|
для: antf
(21.12.2007 в 21:30)
| | >PS Сталкивался, только довольно давно.
Вот и зря, там компилятор поблажек Вам не даст :)
И еще раз их надо исправлять, а не подавлять | |
|
|
|
|
|
|
|
для: antf
(21.12.2007 в 21:30)
| | > Я учился на скриптах Softtime, а они советуют подавлять эти ошибки
Программисты, достигшие уровня SoftTime'овцев, могут позволить себе подавлять Notice - там они могут появится только в случае неопределенных переменных, значения которых всё же далее проверяется. Если что-то не так - работа скрипта останавливается, либо это никак не мешает работе скрипта в дальнейшем.
Ко всему прочему, они выкладывают скрипты, готовые к установке на любой сайт без дополнительной отладки. Там действительно можно (и даже нужно) отключать ошибки вообще, не говоря от Notice.
> Это же просто советы
Не слушать советы бывает очень опасно.
> В общем зависит от стиля разработчика
Да, стили бывают неважные и нормальные. | |
|
|
|
|
|
|
|
для: Unkind
(21.12.2007 в 22:53)
| | >>Не слушать советы бывает очень опасно.
Хорошо, пойдем по другому пути. Каким образом Notice "Undefined variable" может сказаться на работоспособности и безопасности скрипта при условии, что он заглушен?
Посмотрите третье сообщение cheops'а в теме:
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=45985 | |
|
|
|
|
|
|
|
для: antf
(21.12.2007 в 23:21)
| | Не сам Notice может стать причиной появление уязвимости. А его игнорирование. Особенно нехорошо это советовать новичкам. И не надо тыкать пальцем в cheops'а. Я могу спокойно в этом с ним не согласиться. Он же не фараон :)
На примере этого безобразного скрипта:
<?php
// ...
if (@!$_GET['categ_id']) //заглушен вывод предупрежедния, если нет запроса
{
.....
//переменная $categ_id будет инициализирована только тогда,
//когда придет соответствующий запрос из меню
$categ_id=$aRow["categ_id"];
}
//но далее вне условия проверки, идет обращение к этой переменной
$query = "SELECT * FROM subcat WHERE categ_id='$categ_id'";
// ...
?>
|
Что-то вроде
POST /script.php?categ_id=1 HTTP/1.0
Host: example.com
Content-type: Content-Type: application/x-www-form-urlencoded
Content-Length: 80
categ_id=0+UNION+SELECT+user_id%2Cusername%2Cpassword%2C0%2C...+FROM+%60users%60
|
| |
|
|
|
|
|
|
|
для: Unkind
(21.12.2007 в 23:38)
| | В свое время я принял это мнение как авторитетное (под свою ответственность). Иногда имеет смысл сделать это, чем копаться в противоречивых мнениях на этот счет. При условии, что игнорирование notic'ов не приведет к неработоспособности моих приложений. | |
|
|
|
|
|
|
|
для: antf
(22.12.2007 в 00:07)
| | > При условии, что игнорирование notic'ов не приведет к неработоспособности моих приложений.
Лишь до тех пор, пока они остаются исключительно Вашими.
Но Вы же их как open source позиционируете? | |
|
|
|
|
|
|
|
для: Trianon
(22.12.2007 в 00:35)
| | Да, но и в чем вопрос? Все зависит от конкретного разработчика. | |
|
|
|
|
|
|
|
для: antf
(22.12.2007 в 00:53)
| | Даже создатели php не столь категоричны на этот счет. Из мануала:
Enabling E_NOTICE during development has some benefits. For debugging purposes:
NOTICE messages will warn you about possible bugs in your code. For example, use of unassigned values is warned. It is extremely useful to find typos and to save time for debugging. NOTICE messages will warn you about bad style. For example, $arr[item] is better to be written as $arr['item'] since PHP tries to treat "item" as constant. If it is not a constant, PHP assumes it is a string index for the array.
| |
|
|
|
|
|
|
|
для: antf
(22.12.2007 в 00:57)
| | Поясню еще раз смысл цитаты из мануала. Я имею в виду ее тон: это рекомендация, а не требование. | |
|
|
|
|
|
|
|
для: antf
(22.12.2007 в 01:20)
| | Насчет новичков Unkind может быть и прав. Хотя я не знаю насколько велика роль notic'ов в предотвращении глюков и дыр. | |
|
|
|
|
|
|
|
для: Unkind
(21.12.2007 в 22:53)
| | >> Это же просто советы
>Не слушать советы бывает очень опасно.
Разработчики PHP вместо того, чтобы давать советы, как обходить возможные дыры, которые они сами провоцируют - лучше бы язык проектировали более тщательно, чтобы таких моментов не возникало.
Лично я не собираюсь, усложнять и снижать читабельность кода проверками isset() и @ только ради того, чтобы подавить вывод совета - если об снижении дыроопасности не позаботились разработчики PHP, я позабочусь об этом самостоятельно - но и советовать мне после этого ничего не следует. Вы можете открыть phpMyAdmin или любой другой свободно-распространяемый продукт и увидите в начале строку
<?php
Error_Reporting(E_ALL & ~E_NOTICE);
?>
|
Я сейчас поступаю точно также - это строка позволяет спокойно работать и знать, что советы не вылезут, даже если полоумный администратор включит их отображение. Отмечу, что так поступают подавляющее большинство разработчиков свободно-распространяемых программ. Вы не увидите в phpMyAdmin Notice не потому, что нет мест, где бы они могли возникнуть - их там полно - просто вывод подавляется. | |
|
|
|
|
|
|
|
для: cheops
(22.12.2007 в 13:46)
| | Опять же phpMyAdmin - проверенный, отлаженный скрипт. Я сам после написания скрипта отключаю показ всех ошибок - и не только Notice. Но советовать новичкам делать тоже самое по моему мнению ошибочно. Новички - они же не пишут еще скриптов на уровне phpMyAdmin.
Им просто прописано работать в debug режиме. Если они ошибутся где-то в написании имени переменной или что-нибудь в этом духе - потом будут ломать голову над тем что не так. | |
|
|
|
|
|
|
|
для: Unkind
(22.12.2007 в 14:25)
| | Так никто и не советует - программист сам выбирает режим своей работы, удобно ему включать режим отображения замечаний и подгонять под него - код наздоровье, уверен он, что самостоятельно защитит код от дырок, можно отключить сразу - чтобы замечания не мешали работать. | |
|
|
|
|
|
|
|
для: cheops
(23.12.2007 в 00:21)
| | > Так никто и не советует
Конкретно в этой теме:
sitkar: "... никак не могу найти причину. Помогите"
antf: "Заглушите notic'ы ..."
Именно советуют сразу отрубить Notice'ы и не вникать в то, чем они вызваны. Будет писать свой скрипт - отрубит Notice и застрянет. Лично когда пишу код я, то примерно 60% ошибок - Notice. Хотя я пишу код так, чтобы их не было. То есть это какие-то опечатки при написании имени константы/переменной, неверный алгоритм кодирования, при котором идет обращение к несуществующим элементам массива и прочее, прочее, прочее. | |
|
|
|
|
|
|
|
для: Unkind
(23.12.2007 в 00:52)
| | Если человек сам не научиться защищать свой код, ничего ему не поможет. Для это есть специальные статьи, а не notic'ы. К слову в php4 (с которого я начинал и работал с ним долгое время) они были по умолчанию отключены.
PS По-моему человек просто хотел установить каталог или я ошибаюсь? | |
|
|
|
|
|
|
|
для: antf
(23.12.2007 в 13:00)
| | >>Будет писать свой скрипт - отрубит Notice и застрянет.
Что-то мне подсказывает, что как раз с ними-то он и застрянет... | |
|
|
|
|
|
|
|
для: antf
(23.12.2007 в 13:00)
| | Не согласен с вами. Разговор ведь не идет о вас, знающим суть проблемы, а о человеке, который этого не понимает. В конкретном случае скрипт нельзя назвать безупречным, а посоветовать закрыть глаза на предупреждения, значит заведомо не обратить внимания на куда более серьезные проблемы, которые могут быть. Значит надо севетовать такому человеку читать что-то, а не блокировать вывод, причем даже не разъясняя почему. | |
|
|
|
|
|
|
|
для: sim5
(23.12.2007 в 13:22)
| | Всем добрый день! Ребята проблема не в том что бы заглушить или не заглушить нотисы (хотя и в этом тоже), а в том что этот каталог работает неправильно! Если заглушить нотисы то вместо информации которая выводится из БД , выводится пустое место!
Мне так кажеться что надо бы исправить этот скрипт и заменить существующий вариант каталога. Пока мне этот еще не удалось сделат. поскольку я новичок в ПХП и не могу очень быстро разбирать чужие коды. | |
|
|
|
|
|
|
|
для: sitkar
(24.12.2007 в 14:25)
| | Всем добрый день. Теперь есть другая проблема с этим каталогом: в админке вообще не возможно что то сделать, просто оно не работает и выдает:
Notice: Undefined variable: PHP_SELF in d:\project\www\admin\catalog\catalog.php on line 43
Notice: Undefined variable: PHP_SELF in d:\project\www\admin\catalog\catalog.php on line 49
Notice: Undefined variable: PHP_SELF in d:\project\www\admin\catalog\catalog.php on line 51
<?
///////////////////////////////////////////////////
// Блок "Каталог"
// 2005 (C) Выскорко М.С. (aspid02@ngs.ru)
///////////////////////////////////////////////////
print "<div align=right valign=top>
<img src=../images/admin/q.gif align=absmiddle> <a class=menu href='#' onClick=window.open('../admin/help/cat_admin.html','','resizable=yes,scrollbars=yes,width=600')>Как администрировать каталог</a>
</div>";
?>
<table width="100%">
<tr>
<td valign="top">
<a href="<?print $PHP_SELF;?>?p=catalog&act=creat_cat" class="menu"><img src="../images/admin/new2.gif" align="absmiddle" border="0"> Создать новый каталог</a>
<a href="<?print $PHP_SELF;?>?p=catalog&act=import" class="menu"><img src="../images/admin/import.gif" align="absmiddle" border="0"> Импорт каталога</a>
</td>
</tr>
</table>
<?
$query = "SELECT * FROM cat";
$result=mysql_query( $query, $aDBLink);
while ($catalog[]=mysql_fetch_array($result, MYSQL_ASSOC)){}
print "<table align=center width='600'>
<tr>
<td colspan=6 align=center>
<h3 class='bor_bot'>Каталоги:</h3>
</td>
</tr>";
$width=490-$w_pic;
$width2=430-$w_pic;
for($i=0;$i<count($catalog)-1;$i++)
{
print " <tr>
<td rowspan=2 valign=top>
<img src='../images/info/catalog/".$catalog[$i]["img"]."' height=\"$h_pic\" width=\"$w_pic\" class=bor>
</td>
<td width=\"$width\" colspan=2 class=\"bor_bot\" valign=\"bottom\">
<a href='$PHP_SELF?p=catalog&act=category&id=".$catalog[$i]["id"]."' class='calendar'><b>
".$catalog[$i]["catalog"]."
</b></a>
</td>
<td rowspan=2 valign=\"middle\" width='110'>
<a href=\"$PHP_SELF?p=catalog&act=edit_info&id=".$catalog[$i]["id"]."\" class='calendar'>
<img src=\"../images/admin/edit.gif\" height=\"16\" width=\"16\" border=\"0\" alt=\"сменить название, описание, картинку\"> редактировать</a><br>
<a href=\"$PHP_SELF?p=catalog&act=add_new_catalog&act2=del&id=".$catalog[$i]["id"]."\" class='calendar'>
<img src=\"../images/admin/del.gif\" height=\"16\" width=\"16\" border=\"0\" alt=\"удалить\" > удалить</a>
</td>
</tr>
<tr>
<td width='60' align=right valign=top>описание:</td>
<td style='color: #666699' width=\"$width2\" valign=\"top\">
".$catalog[$i]["description"]."
</td>
</tr>";
}
print "</table>";
?>
|
| |
|
|
|
|
|
|
|
для: sitkar
(28.12.2007 в 12:39)
| | Замените на - $_SERVER['PHP_SELF'] | |
|
|
|
|
|
|
|
для: sim5
(28.12.2007 в 12:43)
| | Попробовал заменить только эти три строчки, а потом все где встречался PHP_SELF. В итоге выдает такую ошибку:
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in d:\project\www\admin\catalog\catalog.php on line 43 | |
|
|
|
|
|
|
|
для: sitkar
(28.12.2007 в 13:02)
| | Ваша 43 -я строка должна выглядить так
<a href='".$_SERVER['PHP_SELF']."?p=catalog&act=category&id=".$catalog[$i]["id"]."' class='calendar'><b>
|
И другие аналогичные тоже. | |
|
|
|
|
|
|
|
для: Faraon
(28.12.2007 в 13:17)
| | Одну точку пропустил, сейчас у меня так и выглядит, но теперь ошибка с ?:
Parse error: parse error, unexpected '?' in d:\project\www\admin\catalog\catalog.php on line 43
<?
///////////////////////////////////////////////////
// Блок "Каталог"
// 2005 (C) Выскорко М.С. (aspid02@ngs.ru)
///////////////////////////////////////////////////
print "<div align=right valign=top>
<img src=../images/admin/q.gif align=absmiddle> <a class=menu href='#' onClick=window.open('../admin/help/cat_admin.html','','resizable=yes,scrollbars=yes,width=600')>Как администрировать каталог</a>
</div>";
?>
<table width="100%">
<tr>
<td valign="top">
<a href="<?print $PHP_SELF;?>?p=catalog&act=creat_cat" class="menu"><img src="../images/admin/new2.gif" align="absmiddle" border="0"> Создать новый каталог</a>
<a href="<?print $PHP_SELF;?>?p=catalog&act=import" class="menu"><img src="../images/admin/import.gif" align="absmiddle" border="0"> Импорт каталога</a>
</td>
</tr>
</table>
<?
$query = "SELECT * FROM cat";
$result=mysql_query( $query, $aDBLink);
while ($catalog[]=mysql_fetch_array($result, MYSQL_ASSOC)){}
print "<table align=center width='600'>
<tr>
<td colspan=6 align=center>
<h3 class='bor_bot'>Каталоги:</h3>
</td>
</tr>";
$width=490-$w_pic;
$width2=430-$w_pic;
for($i=0;$i<count($catalog)-1;$i++)
{
print " <tr>
<td rowspan=2 valign=top>
<img src='../images/info/catalog/".$catalog[$i]["img"]."' height=\"$h_pic\" width=\"$w_pic\" class=bor>
</td>
<td width=\"$width\" colspan=2 class=\"bor_bot\" valign=\"bottom\">
<a href='".$_SERVER['PHP_SELF'].?p=catalog&act=category&id=".$catalog[$i]["id"]."' class='calendar'><b>
".$catalog[$i]["catalog"]."
</b></a>
</td>
<td rowspan=2 valign=\"middle\" width='110'>
<a href=\".$_SERVER['PHP_SELF'].?p=catalog&act=edit_info&id=".$catalog[$i]["id"]."\" class='calendar'>
<img src=\"../images/admin/edit.gif\" height=\"16\" width=\"16\" border=\"0\" alt=\"сменить название, описание, картинку\"> редактировать</a><br>
<a href=\".$_SERVER['PHP_SELF'].?p=catalog&act=add_new_catalog&act2=del&id=".$catalog[$i]["id"]."\" class='calendar'>
<img src=\"../images/admin/del.gif\" height=\"16\" width=\"16\" border=\"0\" alt=\"удалить\" > удалить</a>
</td>
</tr>
<tr>
<td width='60' align=right valign=top>описание:</td>
<td style='color: #666699' width=\"$width2\" valign=\"top\">
".$catalog[$i]["description"]."
</td>
</tr>";
}
print "</table>";
?>
|
| |
|
|
|
|
|
|
|
для: sitkar
(28.12.2007 в 13:25)
| | <a href='".$_SERVER['PHP_SELF']. "?p=catalog&act=category&id=".$catalog[$i]["id"]."' class='calendar'><b> | |
|
|
|
|
|
|
|
для: Unkind
(28.12.2007 в 13:44)
| | Спасибо помогло, но толку с этого мало. Там вообще тупо написано. Одним словом надо все переделывать. Теперь не выдает ошибок но и ничего не делает. Надо просматривать все остальные файлы. :(( | |
|
|
|
|
|
|
|
для: sitkar
(28.12.2007 в 13:56)
| | Насколько я понял то эта строка должна переадресовать меня на страницу для создания каталога. Но вопрос почему это не делается?
<a href="<?print $PHP_SELF;?>?p=catalog&act=creat_cat" class="menu"><img src="../images/admin/new2.gif" align="absmiddle" border="0"> Создать новый каталог</a> | |
|
|
|
|
|
|
|
для: sitkar
(28.12.2007 в 17:56)
| | Во-первых $_SERVER["PHP_SELF"], во-вторых print $_SERVER["PHP_SELF"] поместит имя текущего скрипта в url, а у вас имя скрипта создающего каталог какое? | |
|
|
|