3

因此,以下代码一直困扰着我:

    $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 函数?

4

1 回答 1

4

这是一个已知问题,为什么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()它是因为执行时的绑定导致所有参数被绑定为字符串。

正如您的常识所指出的,您可以禁用仿真模式并让 MySQL 自行整理占位符,尽管这可能不适用于所有 DB 驱动程序(尽管适用于 MySQL),方法是:

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

或者,intval如果您希望这样做,您可以对 int 进行 or 类型转换并将其直接放在语句中。

于 2013-04-13T03:55:16.567 回答