2014-10-19 2 views
0

Когда я исполняювыбора и вставки не выбирая

INSERT INTO `survey` 
    (`id`,`name`,`date_start`,`date_end`) 
    values 
    (:id,:name,NULL,DATE_ADD(NOW(), INTERVAL 1 MINUTE)) 
    on duplicate key UPDATE `name`=:name; 
    SELECT coalesce(:id,LAST_INSERT_ID()) as 'id' 

он вставляет новые данные тонкие, но не выбирает идентификатор (который необходим в дальнейшем в моем PHP кода)

Я пытался this suggestion

$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); 

но SQL кидает ошибки (из-за дублирования параметров)

SELECT ASCII(substr(`perm` FROM floor(:i/8)+1))&(1<<(:i%8))>0 as perm FROM `user` WHERE `id`=:id 

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

ответ

1

Вы не можете запускать два запроса одновременно, только один в то время.

Если вы хотите сделать все сразу, создайте хранимую процедуру.

То же самое касается сложных запросов, когда он усложняется, вы хотите иметь свою логику в базе данных.

Вот пример:

DELIMITER // 
CREATE PROCEDURE sp_insert_survey(IN `p_id`, 
            IN `p_name`, 
            IN `p_date_start`, 
            IN `p_date_end`) 
    BEGIN 
    INSERT INTO `survey`(`id`,`name`,`date_start`,`date_end`) 
    VALUES (p_id, p_name, p_date_start, p_date_end); 

    SELECT `id`,`name`,`date_start`,`date_end` 
    FROM survey WHERE `id` =LAST_INSERT_ID(); 
    END // 
DELIMITER ; 

Вызвать зр из PDO:

$stmt = $db->prepare('CALL sp_insert_survey(?, ?, ?, ?)'); 

затем выборки данных в качестве SELECT запроса.

+0

Этот ответ на самом деле выглядит так, как будто мой код будет легче читать, спасибо за это – Isaac

+0

@ Исаак действительно, очиститель для обертывания запросов в хранимую процедуру, он также дает вам право изменять его, не касаясь кода PDO – meda

0

Набрав это, один из похожих вопросов, который появился справа getting last inserted row id with PDO (not suitable result), дал подходящий ответ в самом вопросе, хотя я немного сомневаюсь, учитывая, что метод ставится под сомнение.

$db->lastInsertId(); 

Кажется, работает для меня, но в этом вопросе связана она не работает, как требуется для вопрошающего, так что я не полностью решен с этим ответом. Кажется, он немного взломан.