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&aid={$line['article_id']}</link>
<pubDate>{$date}</pubDate>
<guid>http://www.prxa.info/index.php?module=articles_comments&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正确,参数占位符将取代单个标量值。不能绑定包含值列表的字符串,这将像一个碰巧包含逗号的字符串一样工作。