【问题标题】:What's wrong within SQL query?SQL 查询中有什么问题?
【发布时间】:2018-08-11 20:53:37
【问题描述】:

我正在使用此查询来获取行范围,例如 0-5 ,但我收到一条错误消息。

代码如下:

if(isset($_GET['page']) && isset($_GET['per'])){        
    $per = $_GET['per'];
    $pageNumber = $_GET['page'];
    $from = ($pageNumber * $per) - $per;
    $results = $pdo->prepare('SELECT * FROM users LIMIT :sfrom , :sto');
    $results->execute(array('sfrom' => $from , 'sto' => $per));
}

我收到以下错误:

致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 ''5' , '5'' 附近使用的正确语法

我认为这是因为 $from$per 是作为字符串插入的,或者我尝试使用 (int)$from(int)$per 将它们转换为 int 的东西 但是还是有同样的错误

【问题讨论】:

  • 您可以编辑您的代码以包含应用了强制转换的版本吗?那应该可以解决它。
  • 请注意,没有 ORDER BY 的 LIMIT 是毫无意义的
  • @tadman ,MYSQL 版本 4.6.5.2 ,它在我设备上的 Xampp 上运行
  • @jack 这不是我要问的。我的意思是带有(int) 的代码版本。

标签: php mysql sql pdo mariadb


【解决方案1】:

传递的值必须是整数,但强制转换是不够的。

使用PDOStatement::bindParam

指示PDO绑定参数的类型为整数

然后在最后一步调用PDOStatement::execute(不带参数)。

$results = $pdo->prepare('SELECT * FROM users LIMIT :sfrom , :sto');
$results->bindParam(':sfrom', (int)$from, PDO::PARAM_INT );
$results->bindParam(':sto',   (int)$to,   PDO::PARAM_INT );
$results->execute();

http://php.net/manual/en/pdostatement.bindparam.php

【讨论】:

    【解决方案2】:

    $per$from 设置为数字字符串是完全可以的。确保您没有将 "'5'" 作为值传递。将"'5'" 转换为int 会产生0。试试

    // remove " and ' then cast to int
    $yourNumber = (int) str_replace(['"', "'"], '', $yourInput);
    

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 2010-12-23
      • 2010-10-21
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多