在以下查询中,我使用exp_lationships中的entry_id值来查找exp_channel_data中的最小值(一年)。我会给你一些虚拟数据。
entry_id 1有一年的2014年 entry_id 2有一年的2012年
第一个查询生成" 1,2"我保存为下一个提供WHERE参数。如果我输入" 1,2和#34;而不是:showid,它正常工作并显示2012,因为这是我设置的ORDER BY中的第一个。但是当查询按照下面的说明运行时,它会显示2014年。
$sql = 'SELECT DISTINCT parent_id FROM exp_relationships WHERE child_id = :entry_id AND grid_field_id IN (90, 91)';
$stmt = $conn->prepare($sql);
$showid = "";
try {
$stmt->execute(array('entry_id' => {entry_id}));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
$showid .= $row['parent_id'].", ";
}
$showid = substr($showid, 0, -2);
} catch(PDOException $e) { error_log($e->getMessage(),0); }
$sql = 'SELECT field_id_16 FROM exp_channel_data WHERE entry_id IN (:showid) ORDER BY field_id_16 ASC LIMIT 1';
$stmt = $conn->prepare($sql);
$year = "";
try {
$stmt->execute(array('showid' => $showid));
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
$year = $row['field_id_16'];
echo $year;
}
} catch(PDOException $e) { error_log($e->getMessage(),0); }
答案 0 :(得分:1)
这是因为默认情况下它会将$ showid强制转换为其原始类型,string或int。在你的情况下,我想如果将是字符串1, 2
。这样您就不能在IN
中注入变量值来模拟多个值。每个占位符都是一个值,IN (:placeholder)
只能引用一个值。您需要根据需要拆分尽可能多的占位符,即在此特定情况下,将2个占位符IN (?, ?)
拆分,然后将$showid
字符串内嵌到数组中。或者将$showid
内爆到数组中,然后将其拆分为IN
子句,我认为这两者都更糟糕。