2013-04-17 75 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(); 
}