Всем, удачного дня!
Наткнулся на странное явление.
При написании модуля использовал такую строку:
db_query("UPDATE {modulename_works} SET work_name = '%s', work_norm = %f WHERE work_id = %d", $work_name, $work_norm, $work_id);
Интересно то, что когда она отрабатывает, то work_id изменяется на +1
Это поле в базе со свойством автоинкремента, однако если это делать через консоль или phpmyadmin, то id остается прежний
Не понимаю, почему используя запрос через Друпал происходит прибавление значения?
Комментарии
Вам наверное сюда
http://bugs.mysql.com/bug.php?id=12434
и у меня тот же вопрос
зачем вам понадобилось обновление по сути ключевого поля во время обновления записи?
В том-то и дело, что мне не нужно обновлять ключевое поле, а мне его "любезно" увеличивают каждый раз на единицу.
Зачем вы меня оправляете на сайт по MySQL-ю, если я уже писал, что
что-то не верится, выложите весь листинг функции
//читаем новые значения
$work_id = $_POST['id'];
$work_oper = $_POST['oper'];
$work_name = $_POST['work_name'];
$work_norm = $_POST['work_norm'];
//Определяем действие над таблицей
switch ($work_oper) {
case 'edit': $stm = db_query("UPDATE {modulename_works} SET work_name = '%s', work_norm = %f WHERE work_id = %d", $work_name, $work_norm, $work_id);
case 'add': $stm = db_query("INSERT INTO {modulename_works} (work_name, work_norm) VALUES ('%s', %f)", $work_name, $work_norm);
case 'del': $stm = db_query('DELETE FROM {modulename_works} WHERE work_id = %d', $work_id);
}
return NULL;
}
-- Структура таблицы `drupal5_modulename_works`
--
CREATE TABLE IF NOT EXISTS `drupal5_modulename_works` (
`work_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`work_name` VARCHAR(100) NOT NULL DEFAULT '',
`work_norm` FLOAT(3,1) UNSIGNED NOT NULL DEFAULT '0.1',
PRIMARY KEY (`work_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=124 ;
//Пример запроса вызова с передачей значений через POST
oper edit
work_name Амортизатор задний замена
work_norm 0.6
//Или в таком виде:
work_name=%D0%90%D0%BC%D0%BE%D1%80%D1%82%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80+%D0%B7%D0%B0%D0%B4%D0%BD%D0%B8%D0%B9+%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D0%B0&work_norm=0.6&oper=edit&id=122
В резултате получаем строку в таблице с work_id = 123
Убрал лишний кусок от другого скрипта
...
}
catch (PDOException $e) {
echo 'Database error: '.$e->getMessage();
}
return NULL;
}
Полный код:
//читаем новые значения
$work_id = $_POST['id'];
$work_oper = $_POST['oper'];
$work_name = $_POST['work_name'];
$work_norm = $_POST['work_norm'];
//Определяем действие над таблицей
switch ($work_oper) {
case 'edit': $stm = db_query("UPDATE {modulename_works} SET work_name = '%s', work_norm = %f WHERE work_id = %d LIMIT 1", $work_name, $work_norm = %f WHERE work_id = %d LIMIT 1", $work_name, $work_norm, $work_id);
case 'add': $stm = db_query("INSERT INTO {modulename_works} (work_name, work_norm) VALUES ('%s', %f)", $work_name, $work_norm);
case 'del': $stm = db_query('DELETE FROM {modulename_works} WHERE work_id = %d', $work_id);
}
}
catch (PDOException $e) {
echo 'Database error: '.$e->getMessage();
}
//echo db_result($stm);
return NULL;
}
Проблема продолжается
Это что такое:
<?php
db_query("UPDATE {modulename_works} SET work_name = '%s', work_norm = %f WHERE work_id = %d LIMIT 1",
$work_name, $work_norm = %f WHERE work_id = %d LIMIT 1", $work_name, $work_norm, $work_id);
?>
???
Немножко отличается от правильного кода в первом посте, разве нет?
Да, это я уже экспериментировал, добавлял LIMIT 1 - не помогло
+ опечатка
Сейчас строка выглядит:
case 'edit': $stm = db_query("UPDATE {modulename_works} SET work_name = '%s', work_norm = %f WHERE work_id = %d", $work_name, $work_norm, $work_id);
вообще то в конце case принято ставить break http://ru2.php.net/manual/en/control-structures.switch.php
Да, точно!
Проблема была именно в отсутствии оператора break
При много благодарен!!!