Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果值已存在,则检索id PDO_Php_Mysql_Pdo - Fatal编程技术网

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

Php 如果值已存在,则检索id PDO,php,mysql,pdo,Php,Mysql,Pdo,我有两个表,它们与许多关系相链接,通常我使用Mysqli进行查询,但由于某些原因,现在我不得不使用PDO,因此我的问题是首先检查一个值是否不存在,然后将其添加到表标记中,如果没有,则获取值的id,并将相关数据添加到联接数据中 标记tagmap post一个标记可以属于多个帖子,一篇帖子可以有多个标记。我尝试了这个方法,但是当标记名已经存在时,我无法检索标记的id $sql = " INSERT INTO tag (name) SELECT * FROM (SELECT :nam

我有两个表,它们与许多关系相链接,通常我使用Mysqli进行查询,但由于某些原因,现在我不得不使用PDO,因此我的问题是首先检查一个值是否不存在,然后将其添加到表标记中,如果没有,则获取值的id,并将相关数据添加到联接数据中

标记tagmap post一个标记可以属于多个帖子,一篇帖子可以有多个标记。我尝试了这个方法,但是当标记名已经存在时,我无法检索标记的id

 $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() .'}}'; 
    }
谢谢你的帮助

如以下文件所述:

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

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

  • 标记
    表中的
    (名称)
    上定义一个键:

    ALTER TABLE tag ADD UNIQUE(名称);
    
  • 使用:

    插入标记(名称)值(?)
    重复密钥更新id=上次插入id(id);
    
    这将确保
    $db->lastInsertId()
    返回相关记录的ID,无论该记录是新插入的还是已经存在的


  • 在重复密钥更新时插入,然后选择tag.id。最好避免使用PDO::lastInsertId()。