2013-04-13 22 views
1

所以下面的代码已被窃听了我一下:PDO诠释占位符,让他们身边的报价

$stm = $pdo->prepare("SELECT * FROM urls WHERE account=? AND NOT deleted LIMIT ?, 4"); 
    $stm->execute($user, ($request-1)*4); 

每当我执行这个查询返回此错误:

Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', 4' at line 1' 

在寻找它它似乎使用?除非使用bindParam指定,否则占位符会自动将引号置于其周围。有没有办法解决这个问题,而不必使用bingparam函数?

+0

您还可以[关闭仿真模式](http://stackoverflow.com/tags/pdo/info) –

+0

@YourCommonSense是否有任何副作用? – lemondrop

+0

@lemondrop如果您需要使用PDO访问不同类型的数据库,则会导致查询失败,但是MySQL可以将其中大部分数据排序。 – Jon

回答

3

这是一个已知问题,并且为什么limit不应该真正用于绑定参数。但是,您可以通过单独绑定参数并将其命名为int来克服此问题。

$stm = $pdo->prepare("SELECT * FROM urls WHERE account=? AND NOT deleted LIMIT ?, 4"); 
$stm->bindValue(1, $user); 
$stm->bindValue(2, ($request-1)*4), PDO::PARAM_INT); 
$stm->execute(); 

如果你读它PDOStatement::execute()引起,因为在执行的原因,结合所有的参数被绑定为字符串。

由于Your Common Sense指出的那样,你可以禁用仿真模式,让MySQL的自行理清占位符,虽然这可能并不适用于所有DB驱动程序工作(尽管MySQL会)由:

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

或者你可以执行intval或类型转换为int,并将其直接放入您的语句中,如果您希望这样做。

+0

谢谢你的作品 – lemondrop