0

プリペアドステートメントでphpmysqli拡張機能を使用していますが、1つのクエリでクエリオブジェクトが作成されていません。

コードは次のとおりです。

$sqlq = "SELECT id,name FROM productcategories JOIN products ON productcategories.productid = products.id WHERE categoryid=?";
if($allsubcats)
{
    foreach($allsubcats as $key => $data)
    {
        $sqlq .= " OR categoryid=?";
    }
}
echo $sqlq;
if($query = $this->mysqli->connection->prepare($sqlq))
{
    $query->bind_param("i", $cat);
    if($allsubcats)
    {
        foreach($allsubcats as $key => $data)
        {
            $query->bind_param("i", $data[0]);
        }
    }
    $query->execute();
    $query->bind_result($id,$name);
    $query->store_result();
    if($query->num_rows > 0)
    {
        while($row = $query->fetch())
        {
            $allprods["id"] = $id;
            $allprods["name"] = $name;
        }
    }
    $query->close();
}

問題:

if($query = $this->mysqli->connection->prepare($sqlq))
Theif()はfalseを返しているため、$queryオブジェクトを作成せず、if内のコードを実行していません。

echo $sqlq;リターン:

"SELECT id、name FROM productcategories JOIN products ON productcategories.productid = products.id WHERE categoryid =?OR categoryid =?OR categoryid =?OR categoryid =?OR categoryid =?OR categoryid =?"

何も悪いことはありません。

どんな助けでも大歓迎です、

ありがとう、ニコ

4

3 に答える 3

2

通常、私はこれを投稿するとすぐに自分で解決しましたが、他の誰かが助けを求めるとすぐに物事をよりよく見ることができますか?

ともかく、

SELECT id、name FROM productcategories JOIN products ON productcategories.productid = products.id WHERE categoryid =?またはcategoryid=?またはcategoryid=?またはcategoryid=?またはcategoryid=?またはcategoryid=?

になるはずだった

SELECT productcategories.id、products.name、products.id FROM productcategories JOIN products ON productcategories.productid = products.id WHERE categoryid =?またはcategoryid=?またはcategoryid=?またはcategoryid=?またはcategoryid=?またはcategoryid=?

于 2009-07-21T04:14:10.640 に答える
1

ねえニコ。あなたはすでにそれに答えているので、これはあなたの質問に対する答えではありません。ただの一方的な提案。そのクエリが実行される頻度や、クエリに追加できるカテゴリの数はわかりませんが、WHEREIN構文の使用を検討することをお勧めします。

それ以外の:

WHERE foo = ? OR foo = ? OR foo = ? OR foo = ?

使用する:

WHERE foo IN (?,?,?,?)

クエリを読みやすくし、アプリケーションの時間をわずかに節約します。(MySQLに送信するデータが少なく、PHPでは文字列が小さい)

于 2009-07-21T05:03:49.263 に答える
0

実際には、mysqliオブジェクト自体ではなく、接続オブジェクトでprepareを呼び出すとは思いません。

すなわち


if($query = $this->mysqli->connection->prepare($sqlq))

する必要があります


if($query = $this->mysqli->prepare($sqlq))


チェックアウトの最初の例を編集します:http:
//php.net/manual/en/mysqli.prepare.php

Edit2:

ああ、そうだね。

補足として、テーブルのエイリアスを検討する必要があります。


SELECT pc.id,p.name,p.id
FROM productcategories pc
JOIN products p ON pc.productid = p.id
WHERE categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=? OR categoryid=?
于 2009-07-21T04:12:14.593 に答える