[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как отловить ошибку в запросе?
Renden
Привет, интересует как отловить такую ошибку в запросе mysql_num_rows() expects parameter 1 to be resource, boolean given in
делаю обычную провеку перед выводом запроса:

if (mysql_num_rows($this->_SQL)) {}

Как в методе отловить?

function Query($Sql) {
try {
$this->_SQL = mysql_query($Sql);
mysql_num_rows($this->_SQL);
} catch (Exception $e) {
echo 'Ошибка запроса: ', $e->getMessage(), "\n";
}
return $this;
}

ии нифига не происходит..



Спустя 17 минут, 55 секунд (19.10.2011 - 11:50) Invis1ble написал(а):
Цитата
mysql_num_rows() expects parameter 1 to be resource, boolean given in

Ну это говорит о том, что mysql_query() вернула false, т.е. скорее всего ошибка в запросе.
Как проверить? Очень просто - is_resource()

Спустя 24 минуты, 35 секунд (19.10.2011 - 12:15) Winston написал(а):
Для начала написать
$this->_SQL = mysql_query($Sql) or_die(mysql_error());

Скорее всего в запросе ошибка.

Спустя 50 минут, 24 секунды (19.10.2011 - 13:05) caballero написал(а):

выведи строку запроса в окно и выполни его в phpmyadmin или чем там пользуешся

отлаживай мух отдельно а котлеты отдельно

тем более по сообщению об ощибке понятно это ошибка в mysql или в PHP



Спустя 55 минут, 29 секунд (19.10.2011 - 14:01) SlavaFr написал(а):
function Query($Sql) {
//_SQL ne podhodit po smyslu
$this->_RES = mysql_query($Sql,$this->getConnection());
if(!is_resource( $this->_RES)){
throw new Exception(mysql_error($this->getConnection()),mysql_errno($this->getConnection()));
}
$this->rowcount=mysql_num_rows($this->_RES);
$this->affected=msql_affected_rows($this->getConnection());

return $this;
}


внутри метода лучше кидать Ексцептион, а ловить ее при вызове метода.
ты хочеш ведь твой класс использовать дальше, так что не используй die(), по тому что при етой функции ты вообще не чего больше не сможеш зделать и клиенты увидят уродливую пхп ошибку вместо сообщения или редиректа.


Спустя 2 часа, 46 минут, 58 секунд (19.10.2011 - 16:48) imbalance_hero написал(а):
Renden
У тебя ошибка в запросе, mysql_query вернул FALSE, отлавливать надо на том уровне ошибку, а не где-то далеко внизу! Скорее всего грамматическая ошибка в запросе, либо колонки нет, либо кавычки не так поставил!
mysql_query() or die(mysql_error()); - самая простая отловка ошибок!

Спустя 39 минут, 39 секунд (19.10.2011 - 17:27) Renden написал(а):
Я видимо криво изьянился просто, только SlavaFr понял то что я знаю что у мня в запросе ошибка, что я специально её сделал чтоб отловить с помощью ООП не прерывая работы скрипта happy.gif.
Грубо говоря я хотел смоделировать ситуацию при которой должно показаться сообщение о том что запрос не верный, а не выдавать ошибку.

SlavaFr
А зачем постоянно указатель на соединение getConnection()?
Завтра попробую спс.

Спустя 28 минут, 20 секунд (19.10.2011 - 17:56) imbalance_hero написал(а):
Renden
irbis-team.com , функция mysqlQuery, вот посмотри как там идёт отловка ошибки.

Спустя 4 часа, 21 минута, 28 секунд (19.10.2011 - 22:17) Invis1ble написал(а):
Renden
Цитата
Я видимо криво изьянился просто

конечно криво. Я например не понял, что ты моделируешь сиитуацию.
Суть дал я тебе, более развернуто написал SlavaFr. Код его полностью корректен, на мой взгляд. Можно правда конструкцию try - catch сунуть в саму ф-цию, как у тебя было.

Спустя 48 минут, 59 секунд (19.10.2011 - 23:06) SlavaFr написал(а):
Цитата (Renden @ 19.10.2011 - 14:27)

А зачем постоянно указатель на соединение getConnectiion?

Если паралельно с 2 базами работать, то mysql небудет знать к какой овратились и будет использовать последнюю конекцию.

Спустя 9 часов, 28 минут, 4 секунды (20.10.2011 - 08:34) Renden написал(а):
Ну вроде разобрался, но небольшой косяк:
$this->Query("SET NAMES utf8");
тоже вызывает исключение тк видимо этот запрос не is_resource(), как побороть?

Спустя 11 минут, 5 секунд (20.10.2011 - 08:45) Invis1ble написал(а):
if (!is_resource($this->_RES) && $this->_RES !== true)
или
if (!$this->_RES === false)

Спустя 6 минут, 29 секунд (20.10.2011 - 08:52) Renden написал(а):
Invis1ble
В таком случае вылезает опять ошибка mysql_num_rows() expects parameter 1 to be resource, boolean given in..

UPD. А отдуплил что нетак smile.gif

Спустя 26 минут, 30 секунд (20.10.2011 - 09:18) Invis1ble написал(а):
Цитата
if (!$this->_RES === false)

копипаст - зло, тут отрицание лишнее smile.gif

Спустя 16 минут, 32 секунды (20.10.2011 - 09:35) SlavaFr написал(а):
я думал нужно просто принцип отлова ошибок показать, а вы начинаете в мелачах копатся. Он в общем то совсем не нужен, так ка существует немыслемое количество подобных классов, начиная от pear db и оканчивая готовыми ORM как propel или doctrina
biggrin.gif

Спустя 5 минут, 28 секунд (20.10.2011 - 09:40) Renden написал(а):
Я всеравно что-то немогу разобраться :(

public $RES;
public $rows;
function Query($Sql) {
try {
$this->_RES = mysql_query($Sql);
if (!is_resource($this->_RES) && $this->_RES !== true)
throw new Exception(mysql_error(),mysql_errno());
$this->rows = mysql_num_rows($this->_RES);
} catch (Exception $e) {
echo 'Ошибка запроса: '.$e->getMessage();
}
return $this;
}

Так исключение срабатывает все норм но один фиг php-шные ошибки выводятся на страницу.
mysql_num_rows() expects parameter 1 to be resource, boolean given in
И условия в коде не срабатывают.

if ($this->rows) // что так..
if ($this->rows > 0) //что так

SlavaFr
Да меня просто раздражают эти убогие буржуйские php-шные ошибки..

Спустя 3 минуты, 15 секунд (20.10.2011 - 09:43) Invis1ble написал(а):
Цитата
Так исключение срабатывает все норм но один фиг php-шные ошибки выводятся на страницу.

ну так обрабатывай исключение, как тебе нужно. Например:
        } catch (Exception $e) {
echo 'Ошибка запроса: '.$e->getMessage();
exit;
}

Спустя 5 минут, 1 секунда (20.10.2011 - 09:48) Renden написал(а):
Invis1ble
Так это прервет скрипт, зачем мне это, да Warning один фиг болтаются на странице и указывают на то что ошибка этом методе класса.

Спустя 10 минут, 53 секунды (20.10.2011 - 09:59) Invis1ble написал(а):
я всего лишь пример показал, обрабатывай как тебе нужно
function Query($Sql) {
try {
$this->_RES = mysql_query($Sql);
if (is_resource($this->_RES) || $this->_RES === true)
{
$this->rows = mysql_num_rows($this->_RES);
}
else
throw new Exception(mysql_error(),mysql_errno());
} catch (Exception $e) {
$this->_log('Ошибка запроса: '.$e->getMessage());
echo 'Произошла страшная хренотень. Приносим извенения за доставленные неудобства.';
}
return $this;
}

Спустя 5 минут, 41 секунда (20.10.2011 - 10:05) Renden написал(а):
Invis1ble
Да я не о том я о том что $this->Query("SET NAMES utf8"); всеравно вызывает ошибку на странице показывается:
Цитата
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /usr/local/apache2/htdocs/dev/classes/ConnectDB.class.php on line 29

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /usr/local/apache2/htdocs/dev/classes/ConnectDB.class.php on line 29

Если убрать данный запрос то все норм..

Спустя 4 минуты, 19 секунд (20.10.2011 - 10:09) Invis1ble написал(а):
Цитата
Да я не о том я о том что $this->Query("SET NAMES utf8"); всеравно вызывает ошибку на странице показывается:

это я понял, поэтому изменил немного алгоритм в try-блоке. Посмотри внимательно.

Спустя 2 минуты, 6 секунд (20.10.2011 - 10:11) Renden написал(а):
Invis1ble
Ну я же вижу что мне пишут, перед тем как писать тебе ответ - я проверил твой код, ситуация таже самая.

Спустя 2 минуты, 4 секунды (20.10.2011 - 10:14) Invis1ble написал(а):
хорошо, вот проверь такой вариант
if (is_resource($this->_RES))
$this->rows = mysql_num_rows($this->_RES);
elseif ($this->_RES === false)
throw new Exception(mysql_error(),mysql_errno());

Спустя 6 минут, 58 секунд (20.10.2011 - 10:21) Renden написал(а):
Invis1ble
Хы, а так работает, спс :)
Только если не трудно обьясни, а как тогда отловить выполнился запрос или нет..
if ($this->rows) не срабатывает, тк в этот блок "$this->rows = mysql_num_rows($this->_RES);" скрипт не попадает в случае если в запросе ошибка. Сообщение об ошибке выводится, но мне нужно же еще прервать while в скрипте тк раз запрос ошибочный чтоб этот блок не выполнялся.

if ($this->rows) //не работает.
{
while($row = mysql_fetch_assoc($this->_RES))
{
//блок кода.
}
}


хм решил так:

if (is_resource($this->_SQL))
$this->rows = mysql_num_rows($this->_SQL);
elseif ($this->_SQL === false)
{
$this->rows = false;
throw new Exception(mysql_error(),mysql_errno());
}

Незнаю правильно или нет но работает :)

Спустя 18 секунд (20.10.2011 - 10:21) SlavaFr написал(а):

if (!is_resource($this->_RES) && $this->_RES !== true){
throw new Exception(mysql_error(),mysql_errno());
}

$this->rows = $this->_RES===true?0:mysql_num_rows($this->_RES);

задача по возмозности исключить все возможные ошибки.

в твоем случае ловить ехцепцию внутри функции имеет только тогда смысл, если ты пишеш ошибку в лог и кидаеш ехцепцию дальше.
....
}catch(Exception $e){
logging.....
//кидаем дальше или заменяем ехцепцию на другую
throw $e;
}


Ехцепция придумана не для того, чтоб просто ловить ошибки, а для того чтоб их правильно обрабатывать, так что в твоем конкретном случае оставлять ее просто в методе не даст нам возможности реагировать на ошибки при применении етого метода.
не кто не захочет работать с классом, который отнимает у тебя возможность реагировать на Ошибки.

Спустя 6 минут, 41 секунда (20.10.2011 - 10:27) Invis1ble написал(а):
Вариантов масса, например ловить исключения за пределами этого класса и не выполнять код с циклом while.

Спустя 25 секунд (20.10.2011 - 10:28) Renden написал(а):
SlavaFr
Цитата
в твоем случае ловить ехцепцию внутри функции имеет только тогда смысл, если ты пишеш ошибку в лог и кидаеш ехцепцию дальше.

Да я собирался писать в лог, а что значит кинуть ехцепцию дальше? Можно поподробнее, или сылочку, я 1 раз в жизни просто применяю данный функционал в php.

Спустя 21 минута, 5 секунд (20.10.2011 - 10:49) SlavaFr написал(а):
Цитата (Renden @ 20.10.2011 - 07:28)
а что значит кинуть ехцепцию дальше?


//кидаем дальше или заменяем ехцепцию на другую
throw $e;

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.