--}}
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем

[Q] PHP

2
10
С друзьями на NN.RU
В социальных сетях
Поделиться
Novice coder
16.10.2004
Занялся под старость лет пхпой и уперся почти сразу в проблемку:
ниже фрагмент кода для построения иерархичского списка работает просто замечательно, но все же иногда проскакивает ошибка:

mysql_fetch_assoc(): 12 is not a valid MySQL result resource
mysql_free_result(): 12 is not a valid MySQL result resource

фрагмент:

function getNLevel($levnum, $pid) {
$q = "SELECT $this->qflds FROM $this->qfrom";
if ( isset($this->qexpr) )
$q .= " WHERE ($this->qexpr) and $this->to $pid";
else
$q .= " WHERE $this->to $pid";

if ( isset($this->qend) )
$q = $q . " $this->qend";

$r =& mysql_query($q);
if ( ! $r ) {
trigger_error(E_SQL_FAILED .':'. mysql_error(). ' in '.$q, ER_SYS);
return FALSE;
}
if ( mysql_num_rows($r) != 0 )
while($a = mysql_fetch_assoc($r) ) {
$a['level'] = $levnum;
$this->result[] = $a;
if( $levnum < $this->ml )
if (!$this->getNLevel($levnum+1, mkMYSQLVal($a[$this->prior]))) return FALSE;
}
if (!mysql_free_result($r)) {
print "<br>Can't close resultset:<br>
";
var_dump($r);
print "<br>Level $levnum, pid:$pid<br>
";
print "Query: $q<br>
";
print "Error". mysql_error()."<br>
";
}
return true;
}

вот отладочное сообщение
кот. стоит на mysql_free_result:

Can't close resultset:
resource(12) of type (Unknown)
Level 0, pid:is null
Query: SELECT * FROM category WHERE parent_id is null

в нем нет майскль-ой ошибки
а если взять запрос и выполнить его из консоли то все пройдет нормально.

похоже на глюк пхп или бд. кто с этим сталкивался?
так
17.10.2004
$r =& mysql_query($q);
Вызов идет рекурсивный? И объясните если можно использование сыслки?
Novice coder
18.10.2004
так писал(а)
$r =& mysql_query($q);
Вызов идет рекурсивный?

Да.
так писал(а)
И объясните если можно использование сыслки?


Упс, спасибо не заметил.
но в данном случае это не играет роли поскольку mysql_query возвращает не ссылку.
Это наследие. раньше вместо mysql_query стоял абстрактный метод, который реализовывался в потомках и мог запрашивать любую БД. Вот он то и возвращал ссылку, да бы избежать лишнее клонирование.
так
18.10.2004
все ж таки поробуйте снести ссылку. учитывая что вызов рекурсивный, я не уверен, что это праильный подход - класть результат запроса в переменную, которая равна ссылке на объект. Попробуйте выводить на экран результаты запроса(то есть его ID)...в моем случае вот такая же ссылка стоила пары бессоных ночей(((((
Novice coder
18.10.2004
Ссылка ничем не отличается от др. переменной. Но тем неменее ссылку я снес, но глюк остался.
Основная проблема в том что этот глюк очень редко проявляется. и одно обращение генерирует много запросов (в рекурсии), т.е. очень много отладочной инфо.

так писал(а)
...в моем случае вот такая же ссылка стоила пары бессоных ночей(((((

Да хоженные грабли пользую часто, но осторожно, хотя вот иногда и промаргиваю.
Novice coder
19.10.2004
"Да хоженные грабли пользую часто, но осторожно,"
Читать как:
Да хоженные грабли. Ссылки пользую часто, но осторожно.
:)))
Novice coder
19.10.2004
Вот поймал:
$r сразу после query:
resource(12) of type (mysql result) resource(13) of type (mysql result)

вот тот же $r в конце:
resource(12) of type (Unknown)
VIadimir
19.10.2004
Мде....

$q .= " WHERE $this->to $pid";

Там знака никакого не должно быть? Типа равенства, или неравенства....
$q .= " WHERE $this->to=$pid";

Вообще, лучше перед $r =& mysql_query($q); сделать echo $q; и посмотри что за запросы...
.
Novice coder
19.10.2004
VIadimir писал(а)
Мде....

$q .= " WHERE $this->to $pid";

Там знака никакого не должно быть? Типа равенства, или неравенства....
$q .= " WHERE $this->to=$pid";

Нет, значение $pid уже едет с равенством: если NULL то "is null"
если число, то " = число"...

VIadimir писал(а)

Вообще, лучше перед $r =& mysql_query($q); сделать echo $q; и посмотри что за запросы...
.

$q распечатывается при ошибке - совершенно валидный запрос, дает нормальный результат если выполнить в консоле.
Novice coder
23.10.2004
Всем спасибо, проблема найдена:
Серверу не хватало ресурсов, после оптимизации другого кода этот стал работать как часы.
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Последние темы форумов
Форум Тема (Автор) Последний ответ Ответов
Принтер лазерный HEWLETT PACKARD HP-6L

Принтер лазерный HEWLETT PACKARD HP-6L Отправка в регионы после оплаты. 3штуки БУ. Внешний вид из магазина простояли на складе...
Цена: 4 500 руб.

Материнские платы на запчасти и не только

Материнские платы на запчасти и не только Материнские платы и другие комплектующие Отправка в регионы после оплаты. Транспортной...
Цена: 3 000 руб.

Оперативная память Corsair XMS3 CMX8GX3M2A1600C9

Оперативная память Corsair XMS3 CMX8GX3M2A1600C9 Отправка в регионы после оплаты. Продаются сразу обе. Цена за обе 2000 руб....
Цена: 1 000 руб.

Сетевой фильтр APC Surge Arrest

Сетевой фильтр APC Surge Arrest для радиолюбителя.и не только Отправка в регионы после оплаты. ЦЕНА 3000 руб. В рабочем состоянии....
Цена: 3 000 руб.