【问题标题】:how to bind limit value in pdo statement?如何在 pdo 语句中绑定限制值?
【发布时间】:2015-04-04 08:01:13
【问题描述】:

这是我的代码:

$sql="SELECT duration,address,roozhaye_bargozari, ";
        $sql.="ostan_name,city_name,cluster_name,education_node.name ";
        $sql.="FROM class ";
        $sql.="LEFT JOIN education_cluster ec ON ec.id=class.cluster_id ";
        $sql.="LEFT JOIN education_node ON education_node.id=class.node_id ";
        $sql.="LEFT JOIN ostan ON ostan.id=class.ostan_id ";
        $sql.="LEFT JOIN city ON city.id=class.city_id ";
        $sql.="WHERE class.master_id=? LIMIT ?,?";

        $result=$db->prepare($sql);
        $result->execute(array($master_id,$startpos,$endpos));
        $final_result=$result->fetchAll(PDO::FETCH_ASSOC);

当我使用此代码时,出现此错误消息: PDOException: SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 239 行的 C:\wamp\www\fani\inc\class\user.php 的第 1 行的 ''0','2'' 附近使用正确的语法

但如果我使用这个:

.
.
.
$sql.="WHERE class.master_id=? LIMIT $startpos,$endpos";

        $result=$db->prepare($sql);
        $result->execute(array($master_id);
        $final_result=$result->fetchAll(PDO::FETCH_ASSOC)

代码运行正常,有什么问题?

【问题讨论】:

标签: php mysql pdo


【解决方案1】:

仔细查看错误...

''0','2''

并注意那里的引号。 execute 导致查询失败,因为它添加了单引号并将整数视为字符串。您的第二个查询有效的原因是您将数字直接插入查询而不是绑定它们。为了让它工作,你需要做这样的事情......

$result=$db->prepare($sql);
$result->bindParam(1, $master_id, PDO::PARAM_INT);
$result->bindParam(2, $startpos, PDO::PARAM_INT);
$result->bindParam(3, $endpos, PDO::PARAM_INT);
$result->execute();
$final_result=$result->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

  • 是的,很好。但它很长。如何处理只执行?我发现了一些东西 ($PDO->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );),它的工作。但我不确定这是不是最好的方法
  • 我不确定,如果它有效,PDO 可能没有使用删除安全性的准备好的语句。我知道它很长,但是您不能将 LIMIT 与执行绑定。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 2021-04-24
  • 1970-01-01
  • 2012-01-27
相关资源
最近更新 更多