2013-01-18 38 views
0
$insert = $dbh->prepare('INSERT INTO tags (tag_name) VALUES (:tag)'); 
    $insert->bindParam(':tag', $tag, PDO::PARAM_STR); 
    foreach($tags as $tag) { 
    $insert->execute(); 
    $tag_id = $dbh->lastInsertID(); 
echo $tag_id."+".$photo_id."<br />"; 
$sql = "INSERT INTO tagrefs (tag_id, photo_id) VALUES (:tag_id,:photo_id)"; 
$q = $dbh->prepare($sql); 
$q->execute(array(':tag_id'=>$tag_id, 
         ':photo_id'=>$photo_id)); 
    } 

这段代码将与上传照片相关的标签插入名为'tags'的表中。它将tag_id链接到名为'tagrefs'的表中的photo_id。这一切都很好,直到我使用了一个标签两次。这是合乎逻辑的,因为没有插入任何东西(标签是唯一的,我只是希望在'tagrefs'中的条目列出我已经存在的tag_id下一张照片的photo_id)在新的查询中链接现有的MySQL记录,PHP/PDO

我该如何让它使我的代码比较用户放入并且比较它们的标签,或者现有标签的值被返回并正确放入'tagrefs'中?非常感谢您的时间。

回答

1

如果使用INSERT ... ON DUPLICATE KEY UPDATE,那么即使执行UPDATE而不是插入,lastInsertID()也会返回AUTO_INCREMENT字段的匹配行值。

为了确保它也v5.1.12之前的作品在MySQL的版本,一个可以明确地设置插入ID与MySQL的LAST_INSERT_ID()功能:

INSERT INTO tags 
    (tag_name) 
VALUES 
    (:tag) 
ON DUPLICATE KEY UPDATE 
    id = LAST_INSERT_ID(id) 
+0

我不想进行任何更新。更改tag_id会将其链接到所有其他照片。 如果tag_id 1是tag_name Banana,则更新1到2将打破链接到Banana照片的tag_id 1的tagref记录,例如photo_id 50。 tagrefs: tag_id | photo_id 1 | 50 –

+1

@RudyvanSloten:无需更新数据(这由您在“UPDATE”子句中指定) - 该命令仅设置将由'lastInsertID()'返回的值。我当然不是建议任何记录的id被改变。很明显,你需要在'tag_name'上定义一个'UNIQUE'索引才能工作。 – eggyal

+0

$ insert = $ dbh-> prepare('INSERT INTO tags(tag_name)VALUES(:tag)ON DUPLICATE KEY UPDATE tag_name = $ tag');致命错误:调用第77行($ insert-> bindParam(':tag',$ tag,'')上*** \ upload.php中非对象的成员函数bindParam() PDO :: PARAM_STR);) –