1

我对下面的代码有一些问题。我想要做的是判断一个标签是否已经存在于表标签中,如果存在,则获取id并将其放入id表 blog_post_tags 中,或者如果它不存在,则创建它,获取id并将其放入blog_post_tags 表。问题是,每当我尝试检查是否id已经存在时,我都会收到错误消息告诉我trying to get property of non object,但字段仍然被插入到另一个表中,并且带有idof 0(这不是标签的有效 id)。

这是代码:

foreach ($tags as $tag)
{
    //search for the tag to see if it exists 
    //the problem is located in this line of code
    if($select_stmt = $mysqli->prepare("SELECT id FROM tags WHERE name = ?"))
    {
        $select_stmt->bind_param("s",$tag);
        $select_stmt->execute();
        $result = $select_stmt->get_result();

        //if the tag exists
        if($select_stmt->num_rows != 0)
        {
            if($insert_stmt = $mysqli->prepare("INSERT INTO blog_post_tags (blog_post_id, tag_id) VALUES (?,?)"))
            {
                $insert_stmt->bind_param('ii', $blogid, $result);
                $insert_stmt->execute();
            }
        }
        else
        {
            if ($insert_stmt2 = $mysqli->prepare("INSERT INTO tags (name) VALUES (?)")) 
            {
                $insert_stmt2->bind_param('s', $tag);
                $insert_stmt2->execute();
                $tagid = $mysqli->insert_id;

                if ($insert_stmt3 = $mysqli->prepare("INSERT INTO blog_post_tags (blog_post_id, tag_id) VALUES (?, ?)"))
                {
                    $insert_stmt3->bind_param('ii', $blogid, $tagid);
                    $insert_stmt3->execute();
                }
            }
        }
    }
}

在此先感谢您的帮助。

编辑

不知何故,“试图获取非对象的属性”消失了,我怀疑它可能是与服务器的连接错误,但我真的不能说,仍然表 blog_post_tags 被填充的字段没有任何意义, “标签 ID = 0”。我怀疑这可能与此处表达的问题有关:php 准备了 stmt 问题-在每个结果循环中更新数据 ¿ 如果问题与上面的链接有关,我该如何更正我的代码?

4

2 回答 2

0

错误“试图获取非对象的属性”可能是因为 SQL 语句错误。我建议通过回显用于搜索记录并将该输出粘贴到 mysql 控制台中的 SQL 语句来调试您的脚本。另一件值得一提的是,“id”的列名除非用 tildas (`) 括起来,否则不起作用,因此您的语句应如下所示:

"SELECT `id` FROM `tags` WHERE `name` = '$name'"

希望有帮助。

于 2012-09-19T22:01:44.567 回答
0

好吧,我真的不知道它做了什么,但它似乎奏效了,这是没有任何错误的代码:

foreach ($tags as $tag)
        {
            //search for the tag to see if it exists
            if ($select_stmt = $mysqli->prepare("SELECT id FROM tags WHERE name = ?")) 
            {

                $select_stmt->bind_param("s", $tag);
                $select_stmt->execute();
                $select_stmt->store_result();

                if ($select_stmt->num_rows() > 0) 
                {

                    $select_stmt->bind_result($tagid);
                    $select_stmt->fetch();
                    if ($insert_stmt = $mysqli->prepare("INSERT INTO blog_post_tags (blog_post_id, tag_id) VALUES (?, ?)"))
                    {
                        $insert_stmt->bind_param('ii', $blogid, $tagid);
                        $insert_stmt->execute();
                    }
                }
                else
                {
                    if ($insert_stmt2 = $mysqli->prepare("INSERT INTO tags (name) VALUES (?)"))
                    {
                        $insert_stmt2->bind_param('s', $tag);
                        $insert_stmt2->execute();
                        $tagid = $mysqli->insert_id;

                        if ($insert_stmt3 = $mysqli->prepare("INSERT INTO blog_post_tags (blog_post_id, tag_id) VALUES (?, ?)"))
                        {
                            $insert_stmt3->bind_param('ii', $blogid, $tagid);
                            $insert_stmt3->execute();
                        }
                    }
                }
            }
         }

希望这可以帮助遇到类似问题的任何人,另外,我想知道这个解决方案是否是最佳的,或者是否有任何方法可以改进它。

于 2012-09-21T22:04:20.713 回答