如果值已存在,则检索id PDO

时间:2014-05-21 08:46:15

标签: php mysql pdo

我有两个表与许多关系链接,通常我使用Mysqli进行查询,但现在由于某些原因我必须使用PDO,所以我的问题是第一个检查一个值是否存在,将其添加到表标记中,如果不是,请将值的 id 添加到连接数据中并添加相关数据。

tag-tagmap-post 标签可以属于很多帖子,帖子可以有多个标签我试试这个但是当标签名称已经存在时我无法检索到标签。

 $sql = "
    INSERT INTO tag (name)
    SELECT * FROM (SELECT :name) AS tmp
    WHERE NOT EXISTS (
    SELECT name FROM tag WHERE name =:name
    ) LIMIT 1";

    try {
        $db = getConnection();
        $stmt = $db->prepare($sql);  
        $stmt->bindParam(":name", $post->name);
        $stmt->execute();
        $test=$post->id = $db->lastInsertId();
        $db = null;
        //echo json_encode($post); 
    } catch(PDOException $e) {
        //error_log($e->getMessage(), 3, '/tmp/php.log');
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }

    $sql2="INSERT INTO tagmap (tag_id,post_id,user_id) VALUES(:id2,:post_id,:id)";//
    try {
        $db = getConnection();
        $stmt = $db->prepare($sql2);  
        $stmt->bindParam("id2", $test);//tag id
        $stmt->bindParam("post_id", $post->post_id);//post_id
        $stmt->bindParam("id", $id);
        $stmt->execute();
        //$post2->id = $db->lastInsertId();
        $db = null;
        echo json_encode(array("result"=>$test)); 
    } catch(PDOException $e) {
        //error_log($e->getMessage(), 3, '/tmp/php.log');
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }

感谢您的帮助!!!

1 个答案:

答案 0 :(得分:0)

正如PDO::prepare()所述:

  

除非启用仿真模式,否则不能在预准备语句中多次使用同名的命名参数标记。

也就是说,插入查询本身过于复杂(并且包含语法错误:LIMIT语法中没有INSERT子句。你可以改为:

  1. (name)表中tag上定义UNIQUE键:

    ALTER TABLE tag ADD UNIQUE (name);
    
  2. 使用INSERT ... ON DUPLICATE KEY UPDATE

    INSERT INTO tag (name) VALUES (?)
    ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id);
    

    这将确保$db->lastInsertId()返回相关记录的ID,无论是新插入还是已经存在。