Странное поведение mysql_query('UPDATE... ')

Axion

Новичок
Странное поведение mysql_query('UPDATE... ')

Приветствую!

Не могу разглядеть у себя ошибку - может кто-то из сообщества с лучшим зрением ткнет меня носом?

Суть такова: есть некая форма из которой POST'ом передается ряд значений такому вот скрипту:

PHP:
$sql='UPDATE `cat_news` SET 
`news_date`="'.$temp_date.'", `preambula`="'.addslashes($_POST['preambula']).'", 
`news_body`="'.addslashes($_POST['news_body']).'" WHERE `id`='.$_GET['id'];
$db->update_sql($sql);
Как видно, этот скрипт дергает метод класса $db для выполнения запроса. Вот код этого метода:

PHP:
function update_sql($sql) {
      $this->last_query = $sql;
      $r = mysql_query($sql);
      if (!$r) {
         $this->last_error = mysql_error();
         return false;
      }
      $rows = mysql_affected_rows();
      if ($rows == 0) return true;  
      else return $rows;
   }
То есть совсем ничего хитрого. Но тем не менее при исполнении такого запроса - в строке в таблице, опреленной $_GET['id'], все значения сбрасываються в пустые. Причем если я сделаю вывод текста запроса на екран, а потом Ctrl+C/Ctrl+V в любой MySQL менеджер, то запрос отрабатывает как надо. Если я ставлю в $sql произвольный запрос без переменных (например, "UPDATE cat_news SET preambula = 'abcdef' WHERE id = 5") - он тоже срабатывает. Проверил нужные значения в массивах $_POST и $_GET - все на месте...
На всякий случай структура искомой таблицы:

CREATE TABLE `cat_news` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`news_date` date NOT NULL,
`preambula` varchar(1000) NOT NULL,
`news_body` varchar(4000) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Заранее благодарен за ответы.

-~{}~ 03.05.09 19:35:

Проблема приобрела другой характер. Скрипт, в котором выполняются SQL-запросы почему-то выполняеться 2 раза.

Прошу модераторов закрыть топик, т.к. к данной ветке он, как оказалось, отношения не имеет :)
 

Фанат

oncle terrible
Команда форума
ну, про двойное добавление тут много тем.
а вот почему экранируются не все параметры запроса - загадка.

смысла, кстати, в отдельном методе update_sql лично я не вижу совершенно
 

Axion

Новичок
Автор оригинала: *****
ну, про двойное добавление тут много тем.
а вот почему экранируются не все параметры запроса - загадка.

смысла, кстати, в отдельном методе update_sql лично я не вижу совершенно
Выяснил - виноват YSlow - плагин к Файрбагу, который плагин к Файрфоксу.

А отдельный метод update_sql в таком виде сам по себе и не нужен, это я его для форума упростил. Я использую другой метод, который вызывает его и производит еще ряд операций. Просто решил, что публиковать >100 строк кода на форуме не стоит.

а вот почему экранируются не все параметры запроса - загадка
Вы про temp_date? Ну так я его получаю не от пользователя. Зачем экранировать заведомо известное значение?
 

Фанат

oncle terrible
Команда форума
Не только temp_date.
а экранирование, вообще-то, устроено по принципу не "откуда пришло", а "куда пойдет"
 

Axion

Новичок
*****
Вы имеете ввиду экранирование кавычек? Кажется я не улавливаю терминологию.
 

Фанат

oncle terrible
Команда форума
Не только кавычек. Экранируется порядка десятка спецсимволов.
 

Axion

Новичок
Растолкуйте, если Вам не сложно, что Вы имеете ввиду.

А то PHP для меня еще малознаком. Трудновато адаптироваться после програмирования под Win32 - уж сильно отличается идеология. Потому что после Вашего замечания кинулся курить всякие FAQ и ToDo, наткнулся только на использование [m]mysql_escape_string[/m]. Вы это имели ввиду?
 

Фанат

oncle terrible
Команда форума
Я имел в виду, что для базы данных не имеет никакого значения, откуда пришли данные. Cинтаксис составления запроса никак не зависит от источника данных. Абсолютно для всех полей правила совершенно одинаковые. С точки зрения запроса $temp_date ничем не лучше, чем $_GET['id']
 

Фанат

oncle terrible
Команда форума
Я, конечно, понимаю, что $temp_date генерируется наверняка прямо в скрипте, из ничего. Но удержать в голове все невозможно, и в какой-то момент такая практика даст прокол, когда автор просто не учтет все возможные пути попадания данных в запрос, и мы услышим об очередном случае SQL injection. Лучше уж единообразно для всех.

$_GET['id'], я надеюсь, был принудительно приведен к целочисленному типу? Почему-то мне кажется, что нет.
 

Axion

Новичок
$_GET['id'] - уже :) - [m]intval[/m]

Я, конечно, понимаю, что $temp_date генерируется наверняка прямо в скрипте, из ничего. Но удержать в голове все невозможно, и в какой-то момент такая практика даст прокол, когда автор просто не учтет все возможные пути попадания данных в запрос, и мы услышим об очередном случае SQL injection. Лучше уж единообразно для всех.
Да, это верно. Просто я говорю - нет еще привычки. Под win32 (VCL), моей обычной средой программирования, это берет на себя библиотека. В параметризированный запрос - хоть пятьдесят спецсимволов всунь :)
Ну ничего - теперь я себя самодисциплинирую :)

Еще раз спасибо.
 

Фанат

oncle terrible
Команда форума
так это. никто не запрещает тебе параметризованные использовать в пхп.
mysqli, pdo, или какие-то самописные библиотеки, которых как грязи...
 

Axion

Новичок
Уже видел - на будущее - буду использовать, ибо удобно.

Все таки - объемная штука - PHP :) Все тут есть. И маны хорошие :) - легко курятся. Эх-х - пошел теперь разбираться с GD-библиотекой - графики строить :)

Вам в карму +1, не поленились разъяснить истины, которые оказались азбучными. Респект.
 
Сверху