SELECT和INSERT不选择

时间:2014-10-19 14:58:19

标签: php mysql pdo

执行时

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'

它可以很好地插入新数据,但不会选择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代码都没有重复的参数会非常凌乱,插入后单独选择可能不会返回我想要的id。任何建议都会很棒

2 个答案:

答案 0 :(得分: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调用sp:

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

然后将数据作为SELECT查询获取。

答案 1 :(得分:0)

在输入时,右侧getting last inserted row id with PDO (not suitable result)出现的类似问题之一在问题本身中给出了一个合适的答案,尽管考虑到该方法本身受到质疑,我有点怀疑。

$db->lastInsertId();

似乎对我有用,但在问题链接中,提问者的工作效果并不理想,所以我对此答案并不完全满意。它似乎有点像黑客。