1

可能重复:
PHP PDO bindValue in LIMIT

好的,这是我的查询:

$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']is set and its 0,1,2,4,6,7, also $limitis set and it's 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"。然后这个字符串将被传递给数据库,并且可以被转换为一个整数(因为这是数据库所期望的,并且大多数数据库的默认设置将键入 coerce)。这个字符串有可能/很可能被强制转换为 integer 0,从而产生如下查询:

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

...显然会导致难以追踪的错误。

于 2012-10-13T03:12:17.177 回答