PDO查询变量问题?

时间:2014-06-14 20:41:06

标签: php pdo mysqli

在以下查询中,我使用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); }

1 个答案:

答案 0 :(得分:1)

这是因为默认情况下它会将$ showid强制转换为其原始类型,string或int。在你的情况下,我想如果将是字符串1, 2。这样您就不能在IN中注入变量值来模拟多个值。每个占位符都是一个值,IN (:placeholder)只能引用一个值。您需要根据需要拆分尽可能多的占位符,即在此特定情况下,将2个占位符IN (?, ?)拆分,然后将$showid字符串内嵌到数组中。或者将$showid内爆到数组中,然后将其拆分为IN子句,我认为这两者都更糟糕。