1

重複の可能性:
LIMITのPHP PDO bindValue

さて、ここに私のクエリがあります:

$db->sqlquery("
    SELECT a.*, c.`category_name`
    FROM `articles` a LEFT JOIN `articles_categorys` c
    ON c.`category_id` = a.`category_id`
    WHERE a.`active` = 1
    AND a.`category_id` IN (?)
    ORDER BY a.`date`
    DESC LIMIT ?", array($config['article_rss_categorys'], $limit)
);

確認すると、$config['article_rss_categorys']が設定され、その0,1,2,4,6,7、も$limit設定され、15です。

これが私のクエリコードです

    try
    {
        $this->STH = $this->database->prepare($sql);

        foreach($objects as $k=>$p)
        {
            // +1 is needed as arrays start at 0 where as ? placeholders start at 1 in PDO
            if(is_numeric($p))
            {
                $this->STH->bindValue($k+1, $p, PDO::PARAM_INT);
            }
            else
            {
                $this->STH->bindValue($k+1, $p, PDO::PARAM_STR);
            }
        }

        return $this->STH->execute();

        $this->counter++;
    }

    catch (PDOException $e)
    {
        $core->message($e->getMessage());
    }

なぜ失敗しているのかわかりませんが、愚かなことを見逃しているのでしょうか?

phpmyadminでクエリをテスト?し、正しいものに置き換えました。データベースが正常に機能するように機能します。

次に、そのように結果を取得して出力しようとします。

while ($line = $db->fetch())
{
    // make date human readable
    $date = $core->format_date($line['date']);

    $output .= "
        <item>
            <title>{$line['category_name']} > {$line['title']}</title>
            <link>http://www.prxa.info/index.php?module=articles_comments&amp;aid={$line['article_id']}</link>
            <pubDate>{$date}</pubDate>
            <guid>http://www.prxa.info/index.php?module=articles_comments&amp;aid={$line['article_id']}</guid>
        </item>";
}

これは私のフェッチコードです:

public function fetch()
{
    $this->STH->setFetchMode(PDO::FETCH_ASSOC); 
    return $this->STH->fetch();
}
4

1 に答える 1

1

私の知る限り、バインド パラメータは単一の値しか表すことができません。あなたはこれをやろうとしています:

... WHERE foo IN (?) ...

次に、結果のクエリが次のようになることを期待して、値の配列をバインドします (私が推測します)。

... WHERE foo IN (1, 2, 3, ...) ...

それは可能ではありません。句内で使用しようとしている一連の値の値に対してパラメーターが必要です。IN

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

編集:

単一のレコードしか返されない理由をもう少し説明すると、数値以外の値を文字列としてバインドしているため、PHP は配列を value の文字列に変換しますstring(5) "Array"。この文字列はデータベースに渡され、整数にキャストされる可能性があります (これはデータベースが予期しているものであり、ほとんどのデータベースのデフォルト設定は強制型であるため)。この文字列が integer にキャストされている可能性があり、次0のようなクエリが生成されます。

... WHERE foo IN (0) ...

...そして明らかに、追跡が困難なバグにつながります。

于 2012-10-13T03:12:17.177 に答える