2012-07-31 78 views
9

我在我的应用程序中使用了PDO。但是我在使用包含LIMIT的查询中的预处理语句时遇到问题。有什么问题?
代码:在查询中使用PDO预处理语句和LIMIT时出错

$start = 0; 
$rows = 20; 
$sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?"; 
$q = $db->prepare($sql); 
$q->execute(array($start , $rows)); 

错误:

check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', '20''

+0

@Maerlyn谢谢。我以前没有找到这篇文章。 – 2012-07-31 10:58:13

回答

-1

date是你有back-ticks

+0

这不是问题。即使没有连字符,它也可以工作 – 2012-07-31 10:55:44

0
$sql = "SELECT * FROM tbl_news ORDER BY `date` DESC LIMIT ?, ?"; 
3

来包装它保留字这是一个known bug这是固定在5.5.6从米埃默里。

来自文章: LIMIT不允许在任何情况下的变量。 它的参数必须是整数常量。

进一步修改:(关于此事的争用) 用户变量是预处理语句中LIMIT子句的接受参数,预处理语句的SQL语法可用于存储过程。

第三编辑: 这个link解释说这些应该与预处理语句一起工作。

+0

您链接的存储处理存储过程的错误,而不是准备好的语句。 – Maerlyn 2012-07-31 10:57:26

+0

@Maerlyn是啊,刚刚看到我自己,在看到您的评论之前做了修改。 – Fluffeh 2012-07-31 10:58:47

3

你可以这样做:

$sql = SELECT * FROM tbl_news ORDER BY date DESC LIMIT :start, :rows"; 
$q = $db->prepare($sql); 
$q->bindParam(':start', $start, PDO::PARAM_INT); 
$q->bindParam(':rows',$rows, PDO::PARAM_INT); 
+0

限制期望一个整数,强制你的限制变量是一个整数解决真正的问题(使用的变量不被识别为一个整数)绑定时强制它,你将永远不必担心限制变量的类型:)。所以这个答案应该被接受了。 – Terradon 2016-09-05 15:16:31

2

我只是偶然发现了同样的问题。对我来说,使用我自己的语句类(扩展PDOStatement)和我自己的​​方法修复了它。

这是类:

class MyPDOStatement extends PDOStatement { 

    public function execute($input_parameters = null) { 
    if (is_array($input_parameters)) { 
     $i = 1; 
     foreach ($input_parameters as $p) { 
     // default to string datatype 
     $parameterType = PDO::PARAM_STR; 
     // now let's see if there is something more appropriate 
     if (is_bool($p)) { 
      $parameterType = PDO::PARAM_BOOL; 
     } elseif (is_null($p)) { 
      $parameterType = PDO::PARAM_NULL; 
     } elseif (is_int($p)) { 
      $parameterType = PDO::PARAM_INT; 
     } 
     // parameters passed to execute() are input-only parameters, so use 
     // bindValue() 
     $this->bindValue($i, $p, $parameterType); 
     $i++; 
     } 
    } 
    return parent::execute(); 
    } 

} 

告诉PDO使用这个声明类而不是默认的,这样做:

$db = new PDO(...); 
$db->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement')); 

现在问题的代码将工作:

$start = 0; 
$rows = 20; 
$sql = "SELECT * FROM tbl_news ORDER BY date DESC LIMIT ?, ?"; 
$q = $db->prepare($sql); 
$q->execute(array($start , $rows)); 

你必须做的唯一事情就是绑定到语句的变量具有正确的类型pe,整数。如果您有数字字符串,例如从$_GET数组,你可以这样做:

if (isset($_GET['start']) && is_numeric($_GET['start']) 
    && is_int($_GET['start'] + 0) { 
    $start = (int) $_GET['start']; 
} 

如果是过去的事情更简单的方法,我不舒尔,但至少它为我工作得很好。

+0

'“如果有一种更简单的方法,我不确定......”“如果你没有注意到的话,有一个被接受的答案。 – 2013-03-03 19:26:52

相关问题