получение mysql_insert_id () при использовании НА ДУБЛИРУЮЩЕМСЯ КЛЮЧЕВОМ ОБНОВЛЕНИИ с PHP

Вы должны иметь правильную иерархию. Во-первых, нет, у вас не может быть

#include <Cryptor/MD5Encryptor.h>

с вашими текущими настройками, не во время сборки библиотеки и не без выравнивания иерархии при установке ваших файлов (что может делать CMake).

То, что вы можете сделать, это:

#include <Cryptor/core/abstract/MD5Encryptor.h>

, если вы добавите свой проект в папку Cryptor вместо того, чтобы находиться в корне вашего проекта. Я бы посоветовал вам создать файл Cryptor.cmake, который позволил бы людям забирать вашу библиотеку после установки, чтобы им не нужно было знать, где находится библиотека или как называется библиотека.

23
задан Lightness Races with Monica 17 August 2011 в 23:26
поделиться

3 ответа

Вот ответ, предложенный Александром:

, когда вы используете id = LAST_INSERT_ID (id), он устанавливает значение mysql_insert_id = обновленный идентификатор, поэтому ваш окончательный код должен выглядеть следующим образом:

<?
    $query = mysql_query("
        INSERT INTO table (column1, column2, column3) 
        VALUES (value1, value2, value3) 
        ON DUPLICATE KEY UPDATE
            column1 = value1, 
            column2 = value2, 
            column3 = value3, 
            id=LAST_INSERT_ID(id)
    ");
    $my_id = mysql_insert_id();

Это вернет правильное значение $ my_id независимо от обновления или вставки.

36
ответ дан 29 November 2019 в 01:43
поделиться

Хотя и не используются mysql_insert_id () и ON DUPLICATE KEY UPDATE, альтернативный отличный способ получить значение любого поля при обновлении другого найденного здесь :

UPDATE table SET id=(@tempid:=id) , .... LIMIT 1;
SELECT @tempid;

Я использовал его, имея таблица с (id, status) 'id' автоинкрементом первичного индекса, а 'status' была полем, на котором было выполнено обновление, но мне нужно было получить 'id' обновленной строки. Это решение также подтверждает условия гонки как mysql_insert_id ().

1
ответ дан 29 November 2019 в 01:43
поделиться

Вы можете проверить, был ли запрос вставкой или обновлением (mysql_affected_rows (); возвращает 1 при вставке и 2 при обновлении).

Если это была вставка, используйте mysql_insert_id, если это было обновление, вам понадобится другой запрос.

<?php
$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);
if(mysql_affected_rows() == 1) { $id = mysql_insert_id(); }
else { // select ... 
}
?>

Я знаю, что это не совсем то, что вы ищете, но это лучшее, что я мог придумать

10
ответ дан 29 November 2019 в 01:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: