2013-01-18 98 views
1

我遇到了當前代碼的問題,實際上我不確定是否要以正確的方式進行。檢索一個ID數組?

我目前的腳本(總數)上傳照片並從MySQL數據庫返回id。當照片被選中時,它也被賦予標籤。爲了關聯這些標籤,我選擇了一個表格'tagrefs',它簡單地將tag_id和photo_id結合起來供以後查詢。表'標籤'由tag_id和tag_name組成。表'照片'有很多字段,唯一相關的是photo_id。

目前,我通過POST傳遞標籤。

 $tags = trim($_POST['tags']); 
    $tags = preg_replace('/\s+/', '', $tags); 
    $tags = htmlspecialchars($tags); 
    $tags = mysql_real_escape_string($tags); 
    $tags = strip_tags($tags); 
    $tags = explode(",", $tags); 

$insert = $dbh->prepare('INSERT INTO tags (tag_name) VALUES (:tag)'); 
$insert->bindParam(':tag', $tag, PDO::PARAM_STR); 
foreach ($tags as $tag) $insert->execute(); 


$select = $dbh->prepare('SELECT tag_id FROM tags WHERE tag_name = (:tag)'); 
$select->execute(); 
$result = $select->fetch(PDO::FETCH_ASSOC); 
print_r($result); 
print("\n"); 

直到$選擇它完美的作品。標籤被插入,照片上傳。桃色的。現在我需要寫一些能夠給我添加tag_name的tag_id的東西,然後我需要將它與photo_id結合並將其插入到'tagrefs'中。底部$ select是我未能嘗試通過將它們與用戶POSTs字符串進行比較來檢索我剛纔創建的tag_id。我想到的方式是檢索它們,然後用photo_id和tag_id創建一個新數組,然後將值插入'tagrefs'中。

這一切聽起來過於複雜,可能有一個更好/更安全的方式來做到這一點,但一小時的谷歌搜索沒有幫助。

+0

如果您的標籤是唯一的,爲什麼給它們一個標籤ID呢?爲什麼不直接使用標籤本身,並在'tagrefs'表中的兩列上創建多列索引,以確保同一標籤不能多次與同一張照片關聯?那麼你永遠不必查找這些ID,你可以參考標籤。 – glomad

+0

@ithcy主要是爲了節省空間並保存標記關聯(如果它們已更正)(拼寫錯誤都會記住)。如果我將標籤名稱保存在參考列中並編輯原始標籤,則這些更改將不會反映在參考中。 –

回答

1
foreach ($tags as $tag) $insert->execute(); 

不正確。沒有{},所以所有的foreach正在做的是一個執行呼叫,一遍又一遍。之後的其餘代碼不作爲foreach的一部分執行。因此,您插入所有標籤,然後當循環完成時,嘗試獲取您插入的LAST標籤的ID。假設這是TAG_ID一個AUTO_INCREMENT主鍵字段,你應該使用這樣的事:

foreach($tags as $tag) { 
    $insert->execute(); 
    $tag_id = $insert->lastInsertId(); 
    .... 
} 

,並沒有做專門的反正選擇。

+0

同意(和upvoted)這個答案,但原始代碼有一個額外的問題。如果爲兩張不同的照片輸入相同的tag_name,tag_name將在標籤表中輸入兩次。您需要檢查表中是否存在tag_name(並使用SELECT語句同時檢索tag_id),或者可以使用MySQL「INSERT ... ON DUPLICATE KEY UPDATE」語法(使用tag_name字段定義爲UNIQUE而不是UPDATE語句)來防止這個問題。 MySQL手冊說lastInsertID()應該在這種情況下正常工作(我還沒有測試過)。 – UltraOne

+0

@UltraOne數據庫中的tag_name是唯一的,它不會在那裏兩次。我只是沒有編寫一個能夠在PHP中捕獲到的錯誤消息。 馬克·B,我會盡量在一個位解決方案(: –

+0

的foreach($標記爲$標籤){$ 插入 - >執行(); $ = TAG_ID $ dbh-> lastInsertID(); \t回聲$ TAG_ID。 「+」。$ photo_id。「
」; \t $ sql =「INSERT INTO tagrefs(tag_id,photo_id)VALUES(:tag_id,:photo_id)」; \t $ q = $ dbh-> prepare($ sql); \t $ Q->執行(陣列( ':TAG_ID'=> $ TAG_ID,\t \t \t \t \t \t ':photo_id'=> $ photo_id)); } 這現在工作正常。我用$ dbh替換了你的$ insert。然而,當我上傳一張新照片並給它相同的標籤時,tagrefs將全部分配新的photo_id零(因爲它不返回插入的標籤,它們已經存在)。我如何解決這個問題? –