Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Неясная ошибка MySQL при генерации запроса INSERT.
Форумы портала PHP.SU » » Работа с СУБД » Неясная ошибка MySQL при генерации запроса INSERT.

Страниц (1): [1]
 

1. biohazardo - 04 Февраля, 2012 - 17:47:24 - перейти к сообщению
Для себя хочу функцию генерации запроса INSERT по массиву. Написал, все вроде должно работать, но БД возвращает:
Цитата:
Запрос: INSERT INTO `categories`(`title`) VALUES('may')
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 '' at line 1


Если скопировать сам запрос из сообщения об ошибке в phpmyadmin - ЗАПРОС УСПЕШНО ВЫПОЛНИТСЯ..

Может какая нибудь проблема с кодировкой или что-то еще? Остальные запросы выполняются.

Сама функция:
PHP:
скопировать код в буфер обмена
  1. static function insert($table,$array)
  2.     {
  3.        $q = 'INSERT INTO `'.$table.'`';
  4.         $rows = $values = '';
  5.         if ($array){
  6.             foreach($array as $key => $value)
  7.             {
  8.                 $value = mysql_real_escape_string($value);
  9.                 $rows .= '`'.$key.'`,';
  10.                 if (!$value) $value = 'null';
  11.                 else $value = '\''.$value.'\'';
  12.                 $values .= $value.',';
  13.  
  14.             }
  15.         }
  16.         $rows[strlen($rows) - 1] = '';
  17.             $values[strlen($values) - 1] = '';
  18.         $q .= '('.$rows.') VALUES('.$values.')';
  19.         echo $q.'<br/>';
  20.         return self::query($q);
  21.        
  22.     }


Помогите найти ошибку...
2. caballero - 04 Февраля, 2012 - 18:10:02 - перейти к сообщению
возьми строки в двойные кавычки и убери нафиг апострофы
что в этой каше разобрать можно
3. biohazardo - 04 Февраля, 2012 - 18:17:39 - перейти к сообщению
caballero пишет:
возьми строки в двойные кавычки и убери нафиг апострофы
что в этой каше разобрать можно


PHP:
скопировать код в буфер обмена
  1.    static function insert($table,$array)
  2.     {
  3.        $q = "INSERT INTO `$table`"; //Первые слова запроса
  4.         $rows = $values = "";
  5.         if ($array){
  6.             foreach($array as $key => $value) //Создание скобок с названием таблиц - (`title`)
  7.  // И создает скобки со значенем - ('may')
  8.             {
  9.                 $value = mysql_real_escape_string($value);
  10.                 $rows .= "`$key`,";
  11.                 if (!$value) $value = "null";
  12.                 else $value = "'$value'";
  13.                 $values .= $value.",";
  14.  
  15.             }
  16.         }
  17.         $rows[strlen($rows) - 1] = ""; //Стирает последнюю запятую из списка ячеек
  18.             $values[strlen($values) - 1] = ""; //Стирает посл. запятую из списка значений
  19.         $q .= "($rows) VALUES($values)"; //Сборка текста запроса
  20.         echo $q."<br/>";
  21.         return self::query($q);
  22.        
  23.     }
4. caballero - 04 Февраля, 2012 - 19:06:33 - перейти к сообщению
а query($q) что делает
может тем еще какие преобразования
слеши втыкает например или еще чего
5. Panoptik - 04 Февраля, 2012 - 19:10:48 - перейти к сообщению
biohazardo пишет:
$rows[strlen($rows) - 1] = ""; //Стирает последнюю запятую из списка ячеек
$values[strlen($values) - 1] = ""; //Стирает посл. запятую из списка значений
вместо этого проще использовать implode
6. biohazardo - 04 Февраля, 2012 - 20:19:07 - перейти к сообщению
caballero пишет:
а query($q) что делает
может тем еще какие преобразования
слеши втыкает например или еще чего


return self::query($q); уводит на такую функцию:
PHP:
скопировать код в буфер обмена
  1.  
  2.    
  3.     static function query($q)
  4.     {
  5.        
  6.         $result = mysql_query($q);
  7.         if ($result) return $result;
  8.         else die(mysql_error().' '.$q.'');
  9.     }
  10.  


Как видно, никаких преобразований нету. Лишь проверка на удачность и вывод ошибки.
7. Саныч - 04 Февраля, 2012 - 20:40:44 - перейти к сообщению
biohazardo пишет:
return self::query($q); уводит на такую функцию:
Бредовая функция. mysql_query может вернуть не false, а 0, это корректно выполненый запрос, а обработан будет как ошибка.

Как пинимум условие нужно заменить на
8. Panoptik - 04 Февраля, 2012 - 20:46:55 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2.        static function insert($table,$array)
  3.         {
  4.            $q = "INSERT INTO `".$table."` "; //Первые слова запроса
  5.             $rows = $values = "";
  6.             if ($array){
  7.                 foreach($array as $key => $value) //чистим данный массива
  8.                 {
  9.                     $array[$key] = mysql_real_escape_string($value);
  10.                 }
  11.                 $rows = "`".implode("`,`",array_keys($array))."`";
  12.                 $values = "'".implode("','",$array)."'";
  13.             }
  14.             $q .= "($rows) VALUES($values)"; //Сборка текста запроса
  15.             echo $q."<br/>";
  16.             return self::query($q);
  17.            
  18.         }
  19.  

упростил. не знаю поможет ли
9. biohazardo - 04 Февраля, 2012 - 22:14:12 - перейти к сообщению
Саныч пишет:
Бредовая функция. mysql_query может вернуть не false, а 0, это корректно выполненый запрос, а обработан будет как ошибка.

Как пинимум условие нужно заменить на


Не сработало...

Зато...
Panoptik пишет:
упростил. не знаю поможет ли


Не знаю почему, но эта мелочь позволила запросу выполниться... честно совсем не понимаю этого php))) Спасибо!

 

Powered by ExBB FM 1.0 RC1