1

以下のコードに問題があります。私がやろうとしているのは、タグが既にテーブル タグに存在するかどうかを確認することです。存在する場合は、取得してテーブル blog_post_tags にid配置するidか、存在しない場合は、作成して取得し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 は意味をなさないフィールドで埋められています。 「tag_id = 0」。ここで表現されている問題と関係があるのではないかと思います: php prepare stmt problem- update data at each result loop ¿

4

2 に答える 2

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 に答える
0

「オブジェクト以外のプロパティを取得しようとしています」というエラーは、おそらく SQL ステートメントが正しくないことが原因です。レコードの検索に使用した SQL ステートメントをエコーアウトしてスクリプトをデバッグし、その出力を mysql コンソールに貼り付けることをお勧めします。言及する価値があるもう 1 つのことは、"id" の列名はチルダ (`) で囲まないと機能しないため、ステートメントは次のようになります。

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

それが役立つことを願っています。

于 2012-09-19T22:01:44.567 に答える