2013-04-17 72 views
-1

我已經染上了簡單的標籤系統,foreach循環用2個MySQL查詢

我的PHP頁面得到的標記的字符串, 首先,它「exlpode」他們,然後我使用foreach循環來查找標籤ID在id-tagname表中, 一旦找到標籤ID,我將它放在另一個名爲articledtaged的表中,其中有兩個值,文章ID和標籤ID。

這是代碼:

if (isset($_POST['tag'])&&!empty($_POST['tag'])){ 
    $tag = $_POST['tag']; 
    $tagsarr = explode(",", $tag); 
    print_r ($tagsarr); 
    foreach($tagsarr as $key=>$row){ 
    echo $row ; 

    $tagidquery = "SELECT id FROM tags WHERE tagname = '$row'"; 
    $results = mysql_query($tagidquery); 
    $tagidarr = mysql_fetch_assoc($results); 
    $tagid = $tagidarr['id']; 
    echo $tagid; 

    $taginsertquery = "INSERT INTO tagedarticle (articleid,tagid) VALUES('$yourarticleid','$tagid')"; 
    mysql_query($taginsertquery); 
    } 

但第二部分只能使用一次,

舉例來說,如果我有3個標籤, 「酷」, 「精彩」, 「跛腳」,每用它自己的id(比如說4-6例子)。 結果將是

tagname  tagid  
cool   4 
wonderful (empty) 
lame  (empty) 

但是爲什麼?!

請指教。

+0

是結果在tagedarticle表(順便說一句標記爲與2克的),如果是的話,這些回聲的輸出是什麼? $ yourarticleid從哪裏來?注意:使用mysqli和準備好的語句,而不是mysql函數。 –

+0

這是迴應的結果,帶有文章ID和標籤ID的表格填充了3行,每個標籤一行,第一行獲取適當的標籤ID值,另外兩行是空的。因爲它確實回顯了標記名($ row),我知道它確實到達了下一個標記,並且它試圖將該標記號插入到表中。但循環在第一次之後不會獲得正確的標籤id值 – shultz

+0

您確定表標籤確實包含所有標籤嗎?此外,請確保您啓用所有警告並查看是否有幫助(我想它會)。 – Gutza

回答

1

如果你稍微改變了邏輯,該怎麼辦?你用逗號分解標籤值,爲什麼不使用IN語句把這個權利放到選擇查詢中。然後,您可以遍歷返回的標籤ID並將其插入到多個表中。

if (isset($_POST['tag']) && !empty($_POST['tag'])) { 
    $tag = "'" . str_replace(",", "','", $_POST['tag']) . "'"; 
    $tagidquery = "SELECT id FROM tags WHERE tagname IN ($tag)"; 
    $results = mysql_query($tagidquery); 
    while($row = mysql_fetch_assoc($results)) 
    { 
     $tagId = $row['id']; 
     $taginsertquery = "INSERT INTO tagedarticle (articleid,tagid) VALUES('$yourarticleid','$tagId')"; 
     mysql_query($taginsertquery); 
    } 
} 
+0

$標記需要一點按摩,然後才能將它彈出到SQL中。 – Gutza

+0

你不想交的值拋出直入SQL注入問題和額外的逗號查詢可能需要中剝離,所以這絕對是真實的 – DSlagle

+0

不,我明白這是一個原型,我們是不應該去關心安全現在 - 但它不會按照你寫的方式工作;每個值都需要用某種引號括起來。 – Gutza

0

清潔:


if (empty($_POST['tag'])) 
    return; 

$tagsarr = explode(",", $_POST['tag']); 
$tagsSQL = array(); 
foreach ($tagsarr as $tag) 
    $tagsSQL[] = '"'.mysqli_real_escape_string($link, trim($tag)).'"'; 

$tagidquery = "SELECT id FROM tags WHERE tagname IN (".implode(",", $tagsSQL.")"; 
$results = mysql_query($tagidquery); 
while($row = mysql_fetch_assoc($results)) { 
    $tagId = $row['id']; 
    $taginsertquery = "INSERT INTO tagedarticle (articleid,tagid) VALUES(".intval($yourarticleid).",".intVal($tagId).")"; 
    mysql_query($taginsertquery); 
} 
0

您可以使用mysqli的編制,其在循環中更好地工作,防止SQL enjection聲明:

if (isset($_POST['tag']) && !empty($_POST['tag'])) 
{ 
    $tag  = $_POST['tag']; 
    $tagsarr = explode(",", $tag); 
    $con  = new mysqli('host', 'username', 'password', 'database'); 
    $select = $con->prepare("SELECT id FROM tags WHERE tagname=? LIMIT 1"); 
    $insert = $con->prepare("INSERT INTO tagedarticle (articleid,tagid) VALUES(?,?)"; 
    foreach($tagsarr as $key=>$row) 
    { 
     $select->bind_param("s", $row); 
     $select->execute(); 
     $select->bind_result($id); 
     $select->fetch(); 

     $insert->bind_param('ss', $yourarticleid, $id); 
     $insert->execute(); 
    } 
    $select->close(); 
    $insert->close(); 
    $con->close(); 
}