Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > проблемы с MySql (ф-ия mysql_fetch_array)


Автор: capricorn 28.10.2007, 12:37
есть такая ф-ия:

Код

function SQL_QUERY($query)
{
    $PublicSqlBase = mysql_connect('localhost', 'Lamer', 'Lamer')
                    or die($Mysql_connect_error);
        mysql_select_db('MyBase', $PublicSqlBase)
                    or die($Mysql_select_db_error);
    $retval = mysql_query($query, $PublicSqlBase);
    return $retval;
}


далее где-то в коде:

Код

$rslt = SQL_QUERY("SELECT * FROM Gallery THERE id=0");
$row = mysql_fetch_array($rslt);

print($row["img"]);


во здесь и проблема.
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in z:\home\test3\www\sql.php on line 14

но, если вызвать mysql_fetch_array с параметром, возвращаемым напрямую mysql_query, то всё ок.
(напр. такsmile

Код

$retval = mysql_query($query, $PublicSqlBase);
mysql_fetch_array($retval);


ЗЫ
это просто пример, я хочу узнать, почему так происходит....

Помогите!

Зарание спасибо!

Автор: skyboy 28.10.2007, 16:12
давай посмотрим на твой код:
Код

 $PublicSqlBase = mysql_connect('localhost', 'Lamer', 'Lamer')
                    or die($Mysql_connect_error);

Если ошибка соеднения - то выдаем текст ошибки.
Код

 mysql_select_db('MyBase', $PublicSqlBase)
                    or die($Mysql_select_db_error);

Если не получилось выбрать базу - выдаем ошибку.
Код

 $retval = mysql_query($query, $PublicSqlBase);

Если запрос не был выполнен из-за ошибки, то... тупо игнорируем? 
скорее всего, твой запрос просто вызывает ошибку. Ну, мало ли, кавычки не закрыл, или прав на выполнение запросов нет... Но ошибки этой ты не видишь... Вот, вариант.

Автор: capricorn 28.10.2007, 16:51
да нет же. вопрос понят неправильно.

mysql_query($query, $PublicSqlBase); - возвращает мне результат запроса,
а вот МОЯ ФУНКЦИЯ (function SQL_QUERY($query)) - этот самый результат возвращает неверно =(
посему mysql_fetch_array и ругается.

но вот если оформить ф-ию так, то всё пойдёт нормально:

Код

function SQL_QUERY($query)
{
    $PublicSqlBase = mysql_connect('localhost', 'Lamer', 'Lamer')
                    or die($Mysql_connect_error);
        mysql_select_db('MyBase', $PublicSqlBase)
                    or die($Mysql_select_db_error);
    $retval = mysql_query($query, $PublicSqlBase);

    $row = mysql_fetch_array($retval); // вот теперь mysql_fetch_array не ругаеццо

    print($row["img"]);
}


просекаешь в чём суть?

вот я и не поймю почему моя ф-ия возвращает "кривой" результат.
А может дело в реализации ПХП, или надо сначала как-то обработать этот результат, хз... :(

Автор: HotHead 28.10.2007, 18:02
capricorn, я бы первым делом попробовал написать "SELECT * FROM Gallery WHERE id=0". Или этот глюк только на форуме? Иначе всё должно работать.

Автор: capricorn 28.10.2007, 18:14
это я когда на форум код переносил - опечятку сделал smile

а решение найдено (в переустановке сервера (т.е. апача, и мускл/пхп вместе с ним) %)). тема закрыта, всем спасибо!

Автор: skyboy 28.10.2007, 20:26
Цитата(capricorn @  28.10.2007,  15:51 Найти цитируемый пост)
а вот МОЯ ФУНКЦИЯ (function SQL_QUERY($query)) - этот самый результат возвращает неверно =(

...а твоя функция возвращает то, что возвращает mysql_query внутри, верно? а mysql_query возвращает либо идентификатор выполненного запроса(что без проблем парсится при помощи mysql_fetch_array/mysql_fetch_row), либо возвращает false в случае ошибки, парсинг которого(значения false) пориведет к сообщению 
Цитата

supplied argument is not a valid MySQL result resource

Естественно, так как у тебя не было проверки в твоей функции, то ты не мог определить, что причина в запросе. Твоя функция возвращала false, а ты искал причины в РНР-коде своей функции, а не в запросе или настройках сервера. Не самый лучший подход - игнорировать ошибки. Так как соединение и указание БД происходили(иначе ты бы видел сообщения - эти-то ошибки у тебя обрабатываются), запрос мог не выполнится из-за превышения максимального количества выполняемых запросов(видать, были у тебя глючные запросы, выполнение которых повисло, не завершившись) или подключений. echo mysql_error() тебе бы это показало. Если бы ты захотел.
P.S. Меня ещё и удивляет, что ты под каждый запрос заново коннектишься к БД. Получается ты(потенциально) теряешь время и(совсем наверняка) быстренько расходуешь лимит доступных подключений. Вот если у тебя за время работы 10 запросов, значит у тебя создастся 10(!) подключений, которые завершатся только при окончании работы скрипта. Почему бы не подключаться один разх в начале работы?

Автор: NiCketT 29.10.2007, 23:34
Есть запрос
Код

SELECT name, city, country, year, level, score, public_date FROM ten_users, ten_records
WHERE ten_users.user_id = ten_records.user_id
ORDER BY score DESC, level DESC, play_time;

Пишу
Код

$query="SELECT name, city, country, year, level, score, public_date FROM ten_users, ten_records WHERE ten_users.user_id=ten_records.user_id ORDER BY score DESC, level DESC, play_time;";
$result=mysql_query($query);
$n=mysql_num_rows($resul);

а оно выдает ошибку
Код

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result 


В чем дело?!
Через phpMyAdmin работает нормально

Автор: skyboy 30.10.2007, 00:10
Цитата(NiCketT @  29.10.2007,  22:34 Найти цитируемый пост)
$query="SELECT name, city, country, year, level, score, public_date FROM ten_users, ten_records WHERE ten_users.user_id=ten_records.user_id ORDER BY score DESC, level DESC, play_time;";
$result=mysql_query($query);
$n=mysql_num_rows($resul);

сделай так:
Код

$query="SELECT name, city, country, year, level, score, public_date FROM ten_users, ten_records WHERE ten_users.user_id=ten_records.user_id ORDER BY score DESC, level DESC, play_time;";
$result=mysql_query($query);
if($result === false)
 die(mysql_error());
else 
 $n=mysql_num_rows($resul);

что выдает?

Автор: NiCketT 30.10.2007, 00:42
skyboy
Сначала попрежнему выдает
Код

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/virtwww/w_nicket_cafc/http/show.php on line 143

затем, когда поставил вездле кавычки
Код

SELECT 'name', 'city', 'country', 'year', 'level', 'score', 'public_date' FROM 'ten_users', 'ten_records' WHERE 'ten_users'.'user_id' = 'ten_records'.'user_id' ORDER BY 'score' DESC, 'level' DESC, 'play_time';

(кстати, что эти кавычки означают?)
выдало вот-такое
Код

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''ten_users', 'ten_records' WHERE 'ten_users'.'user_id' = 'ten_records'.'user_id'' at line 1

Автор: skyboy 30.10.2007, 14:00
Цитата(NiCketT @  29.10.2007,  23:42 Найти цитируемый пост)
Сначала попрежнему выдает

конечно. как же я сразу просмотрел?! ты же обращаешься к переменной $resul, а не $result!
Цитата
затем, когда поставил вездле кавычки

Прямые кавычки(в отличие от обратных "`", которые позволяют отличать имена полей/таблиц/БД от зарезервированных слов) как  и двойные кавычки " указывают на строковые константы. Т.е. ты свои запросом
Код

SELECT 'name', 'city', 'country', 'year', 'level', 'score', 'public_date' FROM 'ten_users', 'ten_records' WHERE 'ten_users'.'user_id' = 'ten_records'.'user_id' ORDER BY 'score' DESC, 'level' DESC, 'play_time'

ты пытаешься вытянуть 6 строковых констант('name', 'city', 'country', 'year', 'level', 'score' и  'public_date') не из таблицы, а из двух строковых констант('ten_users' и 'ten_records'), что есть неправильно и вызывает смуту и возражения сервера.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)