PDO准备问号不适用于数字

时间:2013-05-11 15:20:14

标签: php sql pdo sql-like

我有这个:

$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'pass');

$max = 10;
$min = 0;
$q = $_GET['q'];

$result = $pdo->prepare("SELECT * FROM fruits WHERE name LIKE ? LIMIT ?, ?");
$result->execute(array('%'.$q.'%', $min, $max));

然而,当我用LIMIT 0,10替换LIMIT并从它运行的数组中删除$ min和$ max时,它不起作用(不返回任何内容)。 我究竟做错了什么?我尝试使用'0'而不是0,但它也不起作用......

2 个答案:

答案 0 :(得分:1)

我的猜测是数字被绑定为字符串。从手册:

  

具有与绑定参数一样多的元素的值数组   在正在执行的SQL语句中。所有值均视为   PDO :: PARAM_STR。

因此,您应该使用bindValue而不是执行快捷方式。

答案 1 :(得分:1)

PDO :: execute将所有参数转义为STRING。

$pdo = new PDO('mysql:host=localhost;dbname=mydb', 'user', 'pass');

$max = 10;
$min = 0;
$q = (isset($_GET['q']) && is_string($_GET['q'])) ? $_GET['q'] : '';

$stmt = $pdo->prepare('SELECT * FROM fruits WHERE name LIKE ? LIMIT ?, ?');
$stmt->bindValue(1, "%{$q}%", PDO::PARAM_STR);
$stmt->bindValue(2, $min    , PDO::PARAM_INT);
$stmt->bindValue(3, $max    , PDO::PARAM_INT);
$stmt->execute();