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

Форум MySQL

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

 

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

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

тема: Есть ли оператора SELECT какая-нибудь специфика?
 
 автор: Владимир55   (13.03.2009 в 22:50)   письмо автору
 
 

Безуспешно пытаюсь настроить скрипт, который ведет себя совершенно непредсказуемым образом. Локализация сбоев вывела на запрос
$res1 = mysql_query("SELECT id FROM bot_knigi WHERE str = '$str'");
Этот запрос выдает номера строк, содержимое которых совершенно не совпадает с условием, заданным переменной $str.

Например, в столбце str записано 10.htm, а оператор выдает номер этой строки при условии поиска index.htm.

Как это можно понять?

Поле CHAR (50)

  Ответить  
 
 автор: sl1p   (13.03.2009 в 23:23)   письмо автору
 
   для: Владимир55   (13.03.2009 в 22:50)
 

mysql_escape_string($str)

  Ответить  
 
 автор: Владимир55   (13.03.2009 в 23:30)   письмо автору
 
   для: sl1p   (13.03.2009 в 23:23)
 

Безрезультатно.

  Ответить  
 
 автор: sl1p   (14.03.2009 в 00:14)   письмо автору
 
   для: Владимир55   (13.03.2009 в 23:30)
 

addslashes($str)
ну это впринципе даже смотреть надо как настроен пхп имхо.
отключите magic_quotes:)

  Ответить  
 
 автор: Владимир55   (14.03.2009 в 00:31)   письмо автору
 
   для: sl1p   (14.03.2009 в 00:14)
 

Это addslashes($str) не повлияло, а что такое magic_quotes, я пока что не знаю.

Признаться, я в изумлении: отловил скрипт непосредственно на выполнении ошибочной операции и остановил его. Теперь посредством PhpMyAdmin я вижу следующее: оператор SELECT выбирает строку, содержимое которой СОВЕРШЕННО не имеет ничего общего с условием выборки!

Встает вопрос, как вообще можно полагаться на работу MySQL, если она выкидывает такие фокусы?!

  Ответить  
 
 автор: sl1p   (14.03.2009 в 00:34)   письмо автору
 
   для: Владимир55   (14.03.2009 в 00:31)
 

ну дайте дамп таблицы хотябы :)

  Ответить  
 
 автор: Владимир55   (14.03.2009 в 00:47)   письмо автору
 
   для: sl1p   (14.03.2009 в 00:34)
 

Скрипт анализирует посещаемость ботов, беря данные из таблицы bot.
Вот такой фрагмент скрипта:
    $n = 0;

    unset($row); // Удаление массива
    $res = mysql_query("SELECT * FROM bot ");
    while($row = mysql_fetch_assoc($res))
    {
        $str     = $row['str'];
        $namebot = $row['namebot'];
        $time_s  = $row['time_s'];

        ++$n;

        // addslashes($str);

           echo "no $n $str ";

            unset($row1); // Удаление массива
            $res1 = mysql_query("SELECT id FROM bot_knigi WHERE str = '$str'");
            while($row1 = mysql_fetch_assoc($res1)) $id1 = $row1['id'];


            if ($id1)
            {
                echo " Найдена строка $id1, содержащая $str <br><br> ";
//                mysql_query("UPDATE bot_knigi SET `".$namebot."` = '$time_s' WHERE id = '$id1'");

                if ($n == 10 ) die ;
            }
            else
            {
                mysql_query ("INSERT INTO bot_knigi (str, `".$namebot."`) VALUES ('$str', '$time_s')");
                $o_id = mysql_insert_id();
                echo " Создана строка $o_id <br><br> ";
            }
    }


В таблице bot_knigi образуются вот такие записи:
id  str 

1    46/mulik.htm
2    10.htm
3    161/pisjukov.h
4    41.htm
5    33.htm

При работе скрипта получаю:
no 1 46/mulik.htm Создана строка 1 

no 2 10.htm Создана строка 2 

no 3 161/pisjukov.h Создана строка 3 

no 4 41.htm Создана строка 4 

no 5 33.htm Создана строка 5 

no 6 33.htm Найдена строка 5, содержащая 33.htm 

no 7 41.htm Найдена строка 4, содержащая 41.htm 

no 8 10.htm Найдена строка 2, содержащая 10.htm 

no 9 45.htm Найдена строка 2, содержащая 45.htm 

no 10 42.htm Найдена строка 2, содержащая 42.htm 


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

  Ответить  
 
 автор: sl1p   (14.03.2009 в 01:00)   письмо автору
 
   для: Владимир55   (14.03.2009 в 00:47)
 

magic_quotes_gpc
настройка в php.ini
включенные обычно только мешают и путают.

ну а может всё таки стоит попрбовать так?)
$str = addslashes($str);
либо
$str = mysql_escape_string($str);

ибо както в коде подозрительно выглядит, хотя и закомментировано -)

  Ответить  
 
 автор: Владимир55   (14.03.2009 в 01:14)   письмо автору
 
   для: sl1p   (14.03.2009 в 01:00)
 

magic_quotes_gpc - отключил
$str = addslashes($str); - попробовал
$str = mysql_escape_string($str); - попробовал

Никакого эффекта!
(Вернул всё в прежнее состояние и перезагрузил)

  Ответить  
 
 автор: Лена   (14.03.2009 в 16:38)   письмо автору
 
   для: Владимир55   (14.03.2009 в 00:47)
 

Вместо вот этой строки:

$res1 = mysql_query("SELECT id FROM bot_knigi WHERE str = '$str'"); 


поставьте вот это:

$sql = "SELECT id FROM bot_knigi WHERE str = '$str'"; 
print $sql;
$res1 = mysql_query($sql);


Запустите скрипт еще раз.
Выведется строка. Покажите ее здесь.

  Ответить  
 
 автор: Гекко   (14.03.2009 в 11:44)   письмо автору
 
   для: Владимир55   (13.03.2009 в 22:50)
 

> Этот запрос выдает номера строк

Не номера строк, а их идентификаторы.

  Ответить  
 
 автор: Владимир55   (14.03.2009 в 11:48)   письмо автору
 
   для: Гекко   (14.03.2009 в 11:44)
 

Лингвистическая правка уместна. Но что это меняет?

  Ответить  
 
 автор: Гекко   (14.03.2009 в 17:30)   письмо автору
 
   для: Владимир55   (14.03.2009 в 11:48)
 

В таком случае (ищите "index.htm", а получаете "10.htm") путаница где-то не тут. Попробуйте на время отладки написать:

$str = 'index.htm';
$sql = "SELECT id, str FROM bot_knigi WHERE str = '" . mysql_escape_string($str) . "'";
$resl = mysql_query($sql);

if (mysql_num_rows($resl) < 1)
{
   echo "Названия '" .htmlspecialchars($str). "'  нет в таблице";
}

while ($r = mysql_fetch_assoc($resl)) {
 echo htmlspecialchars("{$r['id']}:{$r['str']}"), '<br/>';
}

Быть такого не может, чтобы вывелись левые названия страниц. Только index.htm, если он есть в таблице.

[поправлено модератором]

  Ответить  
 
 автор: Владимир55   (14.03.2009 в 18:31)   письмо автору
 
   для: Гекко   (14.03.2009 в 17:30)
 

Я удалил из срипта абсолютно всё, что не касается ошибки исполнения SELECT, и осталось буквально три строки, из которых со всей очевидностью следовало, что SELECT работает неверно, выдавая идентификатор строки, не соответствующей условиям запроса. За этими манипуляциями провел вчерашний и сегодняшний день, перепробовав все возможное вплоть до перезагрузки сервера. Хотел даже в техподдержку написать, чтобы версию мускула проверили.

А проблема оказалась простой до смешного! И лечится
$id1 = "";

Впредь мне будет наука - переменные надо очищать!

  Ответить  
Rambler's Top100
вверх

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