db_query + UPDATE + поле auto_increment = неожиданное приращение

Главные вкладки

Аватар пользователя Ctrl Ctrl 29 июля 2010 в 18:29

Всем, удачного дня!

Наткнулся на странное явление.
При написании модуля использовал такую строку:
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 остается прежний

Не понимаю, почему используя запрос через Друпал происходит прибавление значения?
Wacko

Комментарии

Аватар пользователя Ctrl Ctrl 30 июля 2010 в 10:00

Xermit wrote:
Вам наверное сюда
http://bugs.mysql.com/bug.php?id=12434
и у меня тот же вопрос
зачем вам понадобилось обновление по сути ключевого поля во время обновления записи?

В том-то и дело, что мне не нужно обновлять ключевое поле, а мне его "любезно" увеличивают каждый раз на единицу.
Зачем вы меня оправляете на сайт по MySQL-ю, если я уже писал, что
Ctrl wrote:
Это поле в базе со свойством автоинкремента, однако если это делать через консоль или phpmyadmin, то id остается прежний

Аватар пользователя Ctrl Ctrl 30 июля 2010 в 12:34
function modulename_editworkrow() {                                                                                                                        

    //читаем новые значения
    $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

id      122
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 Wacko

Аватар пользователя Ctrl Ctrl 30 июля 2010 в 10:41

Убрал лишний кусок от другого скрипта

try {
...
}
catch (PDOException $e) {
    echo 'Database error: '.$e->getMessage();
}
  return NULL;
}

Полный код:

try {
    //читаем новые значения
    $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;
}

Проблема продолжается

Аватар пользователя natbampo natbampo 30 июля 2010 в 11:46

Это что такое:
<?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);
?>
???

Немножко отличается от правильного кода в первом посте, разве нет?

Аватар пользователя Ctrl Ctrl 30 июля 2010 в 12:36

natbampo wrote:
Это что такое:
<?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 - не помогло Sad
+ опечатка Wacko (когда копировал сюда продублировалось)
Сейчас строка выглядит:
       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);

Аватар пользователя xxandeadxx xxandeadxx 30 июля 2010 в 12:37

"Ctrl" wrote:
//Определяем действие над таблицей
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);
}

вообще то в конце case принято ставить break http://ru2.php.net/manual/en/control-structures.switch.php