Новичок
![](./im/images/pips1.gif)
Покинул форум
Сообщений всего: 5
Дата рег-ции: Янв. 2012
Помог: 0 раз(а)
![](./templates/InvisionExBB/im/spacer.gif)
|
Задача: записать в таблицу значения форм. Если форма с таким именем есть, то обновить значение, если нет - вставить. Как я понял, для этих целей и создан REPLACE. Вот пример кода, которые вставляет значения:
PHP:
скопировать код в буфер обмена
$id_model = $_POST['modelID']; mysql_query('SET AUTOCOMMIT=0'); // начало глобальной транзакции foreach ($_POST as $k => $v) { $query = "REPLACE INTO avto.param VALUES ( '$id_model', (SELECT id_param FROM param_spr WHERE name_param = '$k'), '$v', (SELECT id_group FROM param_spr WHERE name_param = '$k') )"; if(!$q) { echo("Bad query from replace old parameter ($k): ". mysql_error()); } else { } } }
Структура таблицы:
CODE ( SQL):
скопировать код в буфер обмена
CREATE TABLE `param` ( `id_model` varchar(20) CHARACTER SET utf8 NOT NULL, `id_param` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `value` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `id_group` tinyint(2) DEFAULT NULL, PRIMARY KEY (`id_model`,`id_param`) ) 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:
скопировать код в буфер обмена
NULL string(284) "REPLACE INTO avto.param VALUES ( 'pc6', (SELECT id_param FROM param_spr WHERE name_param = 'assembly'), 'Australia', (SELECT id_group FROM param_spr WHERE name_param = 'assembly') )"
А точнее - сначала количество строк в результате - почему-то NULL, и сам дамп строки запроса. Ошибок не возникает, но значения в таблицу не вставляются и не меняются. Пробовал менять запрос на
CODE ( SQL):
скопировать код в буфер обмена
INSERT INTO avto.param VALUES ( 'pc6', (SELECT id_param FROM param_spr WHERE name_param = 'assembly'), 'Australia', (SELECT id_group FROM param_spr WHERE name_param = 'assembly') ) ON DUPLICATE KEY UPDATE value = 'Australia'
но результат тот же. Что самое интересное - если выполнить этот же запрос в phpmyadmin, то все прекрасно работает. У меня куча других запросов с подзапросами, так что врятли это дело в подзапросах. Кавычек, сложных выражений со скобками тоже нет - только минимум кавычек. Опять-таки, есть другие запросы, которые работают без косых кавычек``. Пробовал проверить, может я чего-то перемудрил с обработкой ошибок и она просто не работает? Нет, если REPLACE заменить на INSERT (синтаксис абсолютно одинаковый), то сразу же выскакивает ошибка о существовании уже такого уникального ключа, так что явной ошибки в запросе нет.
Итого:
1. Запрос теоретически рабочий, я его вижу на экране и привел сюда. NULL как результат mysql_num_rows настораживает.
2. В эту ветку кода действие попадает, иначе я бы не видел запросов. mysql_error также работает
3. Наконец, phpmyadmin запрос выполняет правильно, скрипт - нет, но и ошибок нет.
Помогите, пожалуйста.
|