【问题标题】:PHP MySQL PDO syntax error in BindparamBindparam 中的 PHP MySQL PDO 语法错误
【发布时间】:2015-04-10 12:32:11
【问题描述】:

您好,我正在尝试使用 PHP 使用 MySQL PDO 从表中选择一些随机行

$query = $conn->prepare("SELECT * FROM `products` WHERE `cat` = :cat ORDER BY RAND() LIMIT :limit_to");

$query->bindParam(':limit_to', $limit, PDO::PARAM_INT);
$query->bindParam(':cat', $cat, PDO::PARAM_INT);
$stmt = $query->execute();

但是这会引发类似这样的 mysql 语法错误,

"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 ''2'' at line 1"

是什么导致了这个错误,为什么?我没有看到任何错误

【问题讨论】:

  • $limit 有引号吗?似乎它来自错误消息中 2 周围的双单引号。也不确定限制中的“2”是这样吗?
  • No $limit 没有引号,$limit 来自一个整数 $_REQUEST['limit'] 我也使用 PDO::PARAM_INT 来确保它是整数,所以为什么我收到错误了吗?我也注意到了双引号
  • 你能包含一个var_dump()的变量吗?

标签: php mysql pdo


【解决方案1】:

问题是当您执行$limit = $_REQUEST['limit']; 时,变量$limit 的类型为string。

例如(都包含数字,但变量类型不同):

$varInt = 2;
$varString = "2";

var_dump ($varInt);
var_dump ($varString);

prints:
    int 2
    string '2' (length=1)

所以你准备好的语句将被绑定:

$limit = $_REQUEST['limit']; // $_REQUEST['limit'] = 2
$cat = 3;

SELECT * FROM `products` WHERE `cat` = :cat ORDER BY RAND() LIMIT :limit_to

与 :limit_to='2', :cat='3' 绑定

问题在于 LIMIT 语法。符号 '' 破坏了语法。您必须确保将整数变量绑定到 $limit。

// do it in first place you have access to $_REQUEST['limit'] or other global arrays , for example $_GET, $_POST

$limit = intval($_REQUEST['limit']); // $_REQUEST['limit'] = 2
 $cat = intval($blablabla); // or from any other source

$query = $conn->prepare("SELECT * FROM products WHERE 
                         cat = :cat ORDER BY RAND() 
                                    LIMIT :limit_to");

$query->bindValue(':limit_to', $limit, PDO::PARAM_INT);
$query->bindValue(':cat', $cat, PDO::PARAM_INT);
$stmt = $query->execute();

附言 使用 bindValue() ,在 99% 的情况下会更好。

【讨论】:

    猜你喜欢
    • 2014-08-11
    • 2012-06-15
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多