Php 我的pdo查询似乎失败了,我不知道';我不明白为什么

Php 我的pdo查询似乎失败了,我不知道';我不明白为什么,php,pdo,Php,Pdo,可能重复: 好的,我的问题是: $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` DE

可能重复:

好的,我的问题是:

$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\u rss\u categoris']
,其
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>";
}

据我所知,bind参数只能表示一个值。您正在尝试这样做:

... WHERE foo IN (?) ...
然后绑定一个值数组(我假设),期望得到的查询类似于:

... WHERE foo IN (1, 2, 3, ...) ...
那是不可能的。对于要在in子句中尝试使用的值集中的每个值,都需要一个参数:

... WHERE foo IN (?, ?, ?, ...) ...
编辑:

为了进一步解释为什么只返回一条记录,您将非数值绑定为字符串,因此PHP将数组转换为值为
string(5)“array”
的字符串。然后,该字符串将被传递到数据库,并可以转换为整数(因为这是数据库所期望的,大多数数据库上的默认设置将键入“强制”)。此字符串可能被转换为整数
0
,从而生成如下查询:

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

…这显然导致了一个难以追踪的bug。

据我所知,bind参数只能表示一个值。您正在尝试这样做:

... WHERE foo IN (?) ...
然后绑定一个值数组(我假设),期望得到的查询类似于:

... WHERE foo IN (1, 2, 3, ...) ...
那是不可能的。对于要在in子句中尝试使用的值集中的每个值,都需要一个参数:

... WHERE foo IN (?, ?, ?, ...) ...
编辑:

为了进一步解释为什么只返回一条记录,您将非数值绑定为字符串,因此PHP将数组转换为值为
string(5)“array”
的字符串。然后,该字符串将被传递到数据库,并可以转换为整数(因为这是数据库所期望的,大多数数据库上的默认设置将键入“强制”)。此字符串可能被转换为整数
0
,从而生成如下查询:

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

…这显然会导致一个难以追踪的bug。

如果在脚本之外运行查询,它是否有效?失败是什么意思?它是否没有得到预期的结果,或者是否抛出异常?如果是,什么例外情况?:)很抱歉,我的意思是,当我尝试获取结果时,它总是空白的。另外,Marabut是的,在我的帖子中,我说我在phpmyadmin中尝试过它。您是否在while循环中尝试了
var\u dump($line)
,而不是立即将其添加到字符串中?var_dump可能会提供有关
$line
的更多信息。按行排序的订单不应该在日期之后有结束报价吗?如果在脚本之外运行查询,它是否有效?您怎么说失败?它是否没有得到预期的结果,或者是否抛出异常?如果是,什么例外情况?:)很抱歉,我的意思是,当我尝试获取结果时,它总是空白的。另外,Marabut是的,在我的帖子中,我说我在phpmyadmin中尝试过它。您是否在while循环中尝试了
var\u dump($line)
,而不是立即将其添加到字符串中?var_dump可能会提供有关
$line
的更多信息。按行排序的订单是否应该在日期后有结束引号?+1正确,参数占位符将取代单个标量值。不能绑定包含值列表的字符串,这将像一个恰好包含逗号的字符串一样工作。+1正确,参数占位符将取代单个标量值。不能绑定包含值列表的字符串,这将像一个碰巧包含逗号的字符串一样工作。