从PDO维基
当在仿真模式(它是在默认情况下),PDO替换占位符 与实际数据。并且使用“惰性”绑定(使用execute()中的数组),PDO将每个参数视为一个字符串。结果, 准备了LIMIT?,?查询变为LIMIT'10','10',这是导致查询失败的无效 语法。
解决方案关闭模拟(因为MySQL可以正确排列所有 占位符)。
$start_record = 1;//$_GET['page'];
$ids = array('pid_b', 'pid_l', 'pid_g');
// THIS MY CONDITION FOR TESTING PURPOSES ONLY
$testVar = 1;
//Set up parameters for lazy binding
$params =$ids;//Fill array with ids
array_push($params,$testVar);
array_push($params,$start_record);
$qMarks = str_repeat('?,', count($ids) - 1) . '?';
// NOW WE BUILD THE QUERY
$sqlQuery = "SELECT * FROM inventory_tbl ";
$sqlQuery .= "WHERE `consignor_record_id` IN ($qMarks) ";
$sqlQuery .= "AND $testVar == ? AND `inventory_status` <> 'active' " ;
$sqlQuery .= "ORDER BY `created_date` DESC LIMIT ?, 50 ;";
//To turn emulation off, one can run this code (or set in a connection options array):
$conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$productSearch = $dbh->prepare($sqlQuery);
$productSearch->execute($params);
//Remove echos after testing
echo $sqlQuery;
echo "<br>";
var_dump($params);
结果
SELECT * FROM inventory_tbl WHERE `consignor_record_id` IN (?,?,?) AND 1 == ? AND `inventory_status` <> 'active' ORDER BY `created_date` DESC LIMIT ?, 50 ;
PARAMS懒惰结合
array(5) { [0]=> string(5) "pid_b" [1]=> string(5) "pid_l" [2]=> string(5) "pid_g" [3]=> int(1) [4]=> int(1) }
它绝对是 – cmorrissey 2015-01-09 18:24:31
我不相信这是除开'LIMIT'如你所说。我很好奇@cmorrissey是怎么想的。 – 2015-01-09 18:25:19
本着教育的精神,你介意解释吗? – SWL 2015-01-09 18:27:22