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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Неясная ошибка MySQL при генерации запроса INSERT.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: INSERT формирует php из массива, а результат выдает непонятную ошибку.
biohazardo
Отправлено: 04 Февраля, 2012 - 17:47:24
Post Id



Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Для себя хочу функцию генерации запроса 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.     }


Помогите найти ошибку...
 
 Top
caballero
Отправлено: 04 Февраля, 2012 - 18:10:02
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




возьми строки в двойные кавычки и убери нафиг апострофы
что в этой каше разобрать можно


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
biohazardo
Отправлено: 04 Февраля, 2012 - 18:17:39
Post Id



Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




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.     }

(Отредактировано автором: 04 Февраля, 2012 - 18:21:36)

 
 Top
caballero
Отправлено: 04 Февраля, 2012 - 19:06:33
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




а query($q) что делает
может тем еще какие преобразования
слеши втыкает например или еще чего


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Panoptik
Отправлено: 04 Февраля, 2012 - 19:10:48
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




biohazardo пишет:
$rows[strlen($rows) - 1] = ""; //Стирает последнюю запятую из списка ячеек
$values[strlen($values) - 1] = ""; //Стирает посл. запятую из списка значений
вместо этого проще использовать implode


-----
Just do it
 
 Top
biohazardo
Отправлено: 04 Февраля, 2012 - 20:19:07
Post Id



Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




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.  


Как видно, никаких преобразований нету. Лишь проверка на удачность и вывод ошибки.
 
 Top
Саныч Модератор
Отправлено: 04 Февраля, 2012 - 20:40:44
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




biohazardo пишет:
return self::query($q); уводит на такую функцию:
Бредовая функция. mysql_query может вернуть не false, а 0, это корректно выполненый запрос, а обработан будет как ошибка.

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


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Panoptik
Отправлено: 04 Февраля, 2012 - 20:46:55
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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.  

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

(Отредактировано автором: 04 Февраля, 2012 - 20:47:17)



-----
Just do it
 
 Top
biohazardo
Отправлено: 04 Февраля, 2012 - 22:14:12
Post Id



Новичок


Покинул форум
Сообщений всего: 12
Дата рег-ции: Дек. 2011  


Помог: 0 раз(а)




Саныч пишет:
Бредовая функция. mysql_query может вернуть не false, а 0, это корректно выполненый запрос, а обработан будет как ошибка.

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


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

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


Не знаю почему, но эта мелочь позволила запросу выполниться... честно совсем не понимаю этого php))) Спасибо!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB