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 :: REPLACE INTO не работает

 PHP.SU

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


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

> Описание: а через phpmyadmin - работает
Daytona
Отправлено: 21 Июня, 2012 - 14:48:21
Post Id


Новичок


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


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




Задача: записать в таблицу значения форм. Если форма с таким именем есть, то обновить значение, если нет - вставить. Как я понял, для этих целей и создан REPLACE. Вот пример кода, которые вставляет значения:
PHP:
скопировать код в буфер обмена
  1. $id_model = $_POST['modelID'];
  2.     mysql_query('SET AUTOCOMMIT=0'); // начало глобальной транзакции
  3.     mysql_query('START TRANSACTION');
  4.     foreach ($_POST as $k => $v) {
  5.         $query = "REPLACE INTO avto.param
  6.                                 VALUES (
  7.                                         '$id_model', (SELECT id_param
  8.                                                 FROM param_spr
  9.                                                 WHERE name_param = '$k'),
  10.                                         '$v', (SELECT id_group
  11.                                                 FROM param_spr
  12.                                                 WHERE name_param = '$k')
  13.                                 )";
  14.                 $q = mysql_query($query);
  15.                 if(!$q) {
  16.                   echo("Bad query from replace old parameter ($k): ". mysql_error());
  17.                   mysql_query('ROLLBACK');
  18.                   exit();
  19.                 } else {
  20.                 $r = mysql_num_rows($q); var_dump($r);
  21.                 }
  22.         var_dump($query);
  23.           }
  24.         }


Структура таблицы:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE `param` (
  2.  `id_model` varchar(20) CHARACTER SET utf8 NOT NULL,
  3.  `id_param` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  4.  `value` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  5.  `id_group` tinyint(2) DEFAULT NULL,
  6.  PRIMARY KEY (`id_model`,`id_param`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


Apache/2.2.17 (Ubuntu)
Версия MySQL-клиента: 5.1.62
phpMyAdmin : 3.3.10deb1

Предварительная проверка и обезопасивание значений проводятся перед этим. Финальный COMMIT идет дальше. Два подзапроса выбирают id из таблицы-справочника, чтобы записать именно его в таблицу, а не строку имени поля формы. set charset utf8 также в начале делается. Чтобы иметь возможность увидеть текст запроса, я его засунул в $query. Итак, на экран возвращается серия запросов типа
PHP:
скопировать код в буфер обмена
  1. NULL
  2. string(284) "REPLACE INTO avto.param
  3. VALUES (
  4.                 'pc6', (SELECT id_param
  5.                         FROM param_spr
  6.                         WHERE name_param = 'assembly'),
  7.                 'Australia', (SELECT id_group
  8.                                 FROM param_spr
  9.                                 WHERE name_param = 'assembly')
  10. )"

А точнее - сначала количество строк в результате - почему-то NULL, и сам дамп строки запроса. Ошибок не возникает, но значения в таблицу не вставляются и не меняются. Пробовал менять запрос на
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO avto.param
  2. VALUES (
  3.                 'pc6', (SELECT id_param
  4.                         FROM param_spr
  5.                         WHERE name_param = 'assembly'),
  6.                 'Australia', (SELECT id_group
  7.                                 FROM param_spr
  8.                                 WHERE name_param = 'assembly')
  9. ) ON DUPLICATE KEY UPDATE value = 'Australia'


но результат тот же. Что самое интересное - если выполнить этот же запрос в phpmyadmin, то все прекрасно работает. У меня куча других запросов с подзапросами, так что врятли это дело в подзапросах. Кавычек, сложных выражений со скобками тоже нет - только минимум кавычек. Опять-таки, есть другие запросы, которые работают без косых кавычек``. Пробовал проверить, может я чего-то перемудрил с обработкой ошибок и она просто не работает? Нет, если REPLACE заменить на INSERT (синтаксис абсолютно одинаковый), то сразу же выскакивает ошибка о существовании уже такого уникального ключа, так что явной ошибки в запросе нет.

Итого:
1. Запрос теоретически рабочий, я его вижу на экране и привел сюда. NULL как результат mysql_num_rows настораживает.
2. В эту ветку кода действие попадает, иначе я бы не видел запросов. mysql_error также работает
3. Наконец, phpmyadmin запрос выполняет правильно, скрипт - нет, но и ошибок нет.

Помогите, пожалуйста.
 
 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