Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
 
 автор: Alex Boxgorn   (07.02.2007 в 09:19)   письмо автору
 
 

Подскажите пожалуйста почему появляется ошибка указаная ниже?

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/ottobocks/www_1/content/htdocs/catalog.php on line 407

При чем в строке 407 находится код PHP <?php while($d=mysql_fetch_array($r)) { ?>

Я один к одному перелил сайт и базу на сервер в инете. Главное это все работает у
меня на виртуальном сервере на компе дома и на хосте от AGAVA.RU тоже без проблем все крутится.

   
 
 автор: Trianon   (07.02.2007 в 09:31)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 09:19)
 

$r не содержит дескриптора результсета.
Обычно это является причиной того, что запрос $r=mysql_query(...) завершился неудачно.
Код запроса Вы не привели.

   
 
 автор: Alex Boxgorn   (07.02.2007 в 09:38)   письмо автору
 
   для: Trianon   (07.02.2007 в 09:31)
 

Вот этот код. Причем я понимаю эта ошибка вылазила на других хостах, но чего нужно тут, я не пойму.

    if(!isset($_GET['category'])){
        $r=mysql_query("SELECT * FROM catalog WHERE hidezapis=0 ORDER BY `artikul` ASC");}else{
            if(isset($_GET['under_category'])){
                $under_category=$_GET['under_category'];
                $category=$_GET['category'];
$r=mysql_query("SELECT * FROM catalog WHERE id<9000 AND category='$category' AND under_category='$under_category' AND hidezapis=0 ORDER BY `artikul` ASC");
            }else{
                $category=$_GET['category'];
$r=mysql_query("SELECT * FROM catalog WHERE id<9000 AND category='$category' AND hidezapis=0 ORDER BY `artikul` ASC");
            }
}

   
 
 автор: Trianon   (07.02.2007 в 10:02)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 09:38)
 

Чем гадать, посмотрите, из-за чего запрос отвергается.

if(!$r) echo mysql_error();

Заодно выведите текст запроса:

mysql_query($sql = "SELECT ......");
....
if(!$r) echo "Error in $sql : ".mysql_error();

   
 
 автор: ZuArt   (07.02.2007 в 09:36)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 09:19)
 

Абсолютно верно, добавлю только догадку, что регистры имен таблиц и полей в ЗАПРОСЕ несоответствуют регистрам имен таблиц и полей в БАЗЕ - такое оч. часто бывает =)... особенно, когда локально стоит Вынь, а хостинг на Юнихе =). Приведите в соответствие регистры - вполне вероятно, что все заработает =).

   
 
 автор: Alex Boxgorn   (07.02.2007 в 09:39)   письмо автору
 
   для: ZuArt   (07.02.2007 в 09:36)
 

верно!!! Хост это на юниксе. Как это лечить господа? Я уже весь мозг сломал. ;-((

   
 
 автор: Alex Boxgorn   (07.02.2007 в 09:41)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 09:39)
 

может есть ограничение на длину имени поля в юниксах?

   
 
 автор: ZuArt   (07.02.2007 в 09:48)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 09:41)
 

Еще бы дамп используемых таблиц сюда для полного счастья =) именно в том виде, в котором он заливался на сервак хостера.
Кстать когда идет if с вложенными if-ами в секции else лучше использовать else if - понятнее код + обработка побыстрее идет...

if(!isset($_GET['category']))
{
  $r=mysql_query("SELECT * FROM catalog WHERE hidezapis=0 ORDER BY `artikul` ASC");
}
else if (isset($_GET['under_category']))
{
             $under_category=$_GET['under_category'];
             $category=$_GET['category'];
 $r=mysql_query("SELECT * FROM catalog WHERE id<9000 AND category='$category' AND under_category='$under_category' AND hidezapis=0 ORDER BY `artikul` ASC");
}
else
{
   $category=$_GET['category'];
  $r=mysql_query("SELECT * FROM catalog WHERE id<9000 AND category='$category' AND hidezapis=0 ORDER BY `artikul` ASC");
}

ну и рискну предложить в условии не $r находить, а просто составлять sql-запрос в переменную, а уж $r=mysql_query(...) после всех условий узать - попроще отлаживать + сам получившийся запрос можно вывести на экран (аля if(isset($DEBUG)) echo $sql;) и посмотреть на него на предмет синтаксических ошибок =)

   
 
 автор: Alex Boxgorn   (07.02.2007 в 10:01)   письмо автору
 
   для: ZuArt   (07.02.2007 в 09:48)
 

вы это имели ввиду?

-- phpMyAdmin SQL Dump
-- version 2.6.1
-- http://www.phpmyadmin.net
--
-- Хост: localhost
-- Время создания: Фев 07 2007 г., 13:00
-- Версия сервера: 4.1.8
-- Версия PHP: 4.4.0
--
-- БД: `rt9_rtto`
--

-- --------------------------------------------------------

--
-- Структура таблицы `catalog`
--

CREATE TABLE `catalog` (
`id` int(11) NOT NULL auto_increment,
`name` tinytext NOT NULL,
`summary` longtext,
`text` longtext,
`money` int(11) default NULL,
`img` tinytext,
`category` tinytext,
`under_category` tinytext,
`hidezapis` int(1) default '0',
`hidepodrobno` int(1) default '0',
`hidezakaz` int(1) default '0',
`artikul` int(6) default '0',
`zakaz_podrobno` int(1) default NULL,
`razmer_min` int(3) default NULL,
`razmer_max` int(3) default NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM;

--
-- Дамп данных таблицы `catalog`
--

   
 
 автор: ZuArt   (07.02.2007 в 10:06)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 10:01)
 

Хммм... попробуйте заменить код на такой...


$sql = "";
if(!isset($_GET['category']))
{
  $sql = "SELECT * FROM catalog WHERE hidezapis=0 ORDER BY `artikul` ASC";
}
else if (isset($_GET['under_category']))
{
             $under_category=$_GET['under_category'];
             $category=$_GET['category'];
 $sql = "SELECT * FROM catalog WHERE id<9000 AND category='$category' AND under_category='$under_category' AND hidezapis=0 ORDER BY `artikul` ASC";
}
else
{
   $category=$_GET['category'];
  $sql = "SELECT * FROM catalog WHERE id<9000 AND category='$category' AND hidezapis=0 ORDER BY `artikul` ASC";

echo "<pre>".$sql."</pre>";

и посмотреть, что выводится на экран при различных вариантах - есть подозрение, что в построенном запросе есть какая-то ошибка... может быть не подставляются значения вместо $under_category или $category при построении запроса =(.

   
 
 автор: Alex Boxgorn   (07.02.2007 в 10:25)   письмо автору
 
   для: ZuArt   (07.02.2007 в 10:06)
 

Получается вот этот запрос выполняется хорошо
SELECT * FROM catalog WHERE hidezapis=0 ORDER BY `artikul` ASC

вот этот запрос выполняется с ошибкой
SELECT * FROM catalog WHERE id <9000 AND category = 'category3' AND under_category = '11'
AND hidezapis =0 ORDER BY `artikul` ASC LIMIT 0 , 30

Ответ MySQL:

#1267 - Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (utf8_unicode_ci,COERCIBLE) for operation '='

Вот этот запрос исполняется также с той же ошибкой
SELECT * FROM catalog WHERE id<9000 AND category='category3' AND hidezapis=0 ORDER BY `artikul` ASC

   
 
 автор: ZuArt   (07.02.2007 в 10:30)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 10:25)
 

Похоже, что скрипт у Вас работает в кодировке win1251 , а дамп залит в кодировке utf8 - вот отсюда и растут ноги...
попробуйте перезалить дамп, только выберите в MyAdmin кодировку cp1251_general_ci - возможно она там фигурирует как русская Windows или Windows Cyrilic

   
 
 автор: Trianon   (07.02.2007 в 10:30)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 10:25)
 

А это уже следствие криво проимпортированной базы данных (либо некорректно настроенного соединения с сервером).
Кодировка запроса у Вас не совпадает с кодировкой данных в таблицах. Как следствие, не совпадают алгоритмы сопоставления строк и сервер ругается, что ему не понять, как сравнивать строки в запросе со строками в таблице.

   
 
 автор: Alex Boxgorn   (07.02.2007 в 10:38)   письмо автору
 
   для: Trianon   (07.02.2007 в 10:30)
 

Ребята, я нашел решение проблемы

ошибки 1267 из документации mySQL, она возникает на серверах mySQL от 4.1.2 до 4.1.7 включительно из-за неправильной интерпретации некоторых символов. Нужно юзать Мускул версией выше. Причем этот сервер MySQL имеет версию 4.1.7 к сожалению. А остальные, где нет ошибки, имеют версию выше. Вот и все.
Всем спасибо за участие!! Очень помогли!!

   
 
 автор: ZuArt   (07.02.2007 в 10:41)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 10:38)
 

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

   
 
 автор: Alex Boxgorn   (07.02.2007 в 11:04)   письмо автору
 
   для: ZuArt   (07.02.2007 в 10:41)
 

хорошо, попробую.
Я так понимаю ниже указанные переменные character set client и character set results можно изменить программно? Или проще базу перелить в кодировке utf8 ?
character set client utf8
(Глобальное значение) cp1251
character set connection cp1251
character set database cp1251
character set results utf8
(Глобальное значение) cp1251

   
 
 автор: ZuArt   (07.02.2007 в 11:08)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 11:04)
 

Базу лучше перезалить =) - это и проще и надежнее в нужной кодировке... Только не соображу, в какой она сейчас залита?

   
 
 автор: Alex Boxgorn   (07.02.2007 в 11:15)   письмо автору
 
   для: ZuArt   (07.02.2007 в 11:08)
 

решение простое получилось!! Я в таблице поменял кодировку сравнения на utf8_general_ci у полей текстового типа и все заработало и стало отображаться!!!

   
 
 автор: ZuArt   (07.02.2007 в 11:17)   письмо автору
 
   для: Alex Boxgorn   (07.02.2007 в 11:15)
 

поздравляю ;)
что и требовалось доказать, что скрипт работает с кодировкой utf8, а база в win1251...
Стоит пересмотреть все таблицы и их текстовые поля, в противном случае можете опять на грабли наступить ;)

   
 
 автор: Alex Boxgorn   (07.02.2007 в 11:34)   письмо автору
 
   для: ZuArt   (07.02.2007 в 11:17)
 

Спасибо Уважаемые за помощь!!! Я учту ваши замечания.
Сколько с mySQL работаю ни разу не попадал на эти грабли. ;-)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования