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