PHP PDO:如何返回整数

PHP PDO:如何返回整数,php,string,integer,pdo,prepared-statement,Php,String,Integer,Pdo,Prepared Statement,我想这可能是我的pdo获取数据方法中的一个缺陷 public function fetch_all($query, $params = array()) { try { # prepare the query $stmt = $this->connection->prepare($query); # if $params is not an array, let's ma

我想这可能是我的pdo获取数据方法中的一个缺陷

public function fetch_all($query, $params = array())
    {
        try
        {
            # prepare the query
            $stmt = $this->connection->prepare($query);

            # if $params is not an array, let's make it array with one value of former $params
            if (!is_array($params)) $params = array($params);

            # execute the query
            $stmt->execute($params);

            # return the result
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }
        catch (PDOException $e) 
        {
            # call the get_error function
            $this->get_error($e);
        }
    }
传递到此方法中的所有参数都将成为字符串,但我需要用于sql LIMIT查询的整数,如下所示

$sql = "
    SELECT *

    FROM root_pages
    ORDER BY root_pages.pg_created DESC

    LIMIT ?,?";

items = $connection->fetch_all($sql,array('0','6'));
它返回这个错误

2SQLSTATE[42000]:语法错误或 访问冲突:1064您有一个 SQL语法错误;检查 与您的MySQL相对应的手册 正确语法的服务器版本 在第32行的“0”和“6”附近使用

我怎样才能修好它

编辑:

根据建议,我将方法中的代码更改为下面的代码

# fetch a multiple rows of result as a nested array ( = multi-dimensional array)
    public function fetch_all($query, $params = array())
    {
        try
        {
            # prepare the query
            $stmt = $this->connection->prepare($query);

            # if $params is not an array, let's make it array with one value of former $params
            //if (!is_array($params)) $params = array($params);


            foreach($params as $k=>$p){
              if(is_numeric($p)){
                $stmt->bindParam($k+1, $p, PDO::PARAM_INT);
              }
              else{
                $stmt->bindParam($k+1, $p, PDO::PARAM_STR);
              }
            }
            $stmt->execute();


            # execute the query
            //$stmt->execute($params);

            # return the result
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        }
        catch (PDOException $e) 
        {
            # call the get_error function
            $this->get_error($e);
        }
    }

$items = $connection->fetch_all($sql,array(0,6));
然后我得到一个不同的错误

2SQLSTATE[42000]:语法错误或 访问冲突:1064您有一个 SQL语法错误;检查 与您的MySQL相对应的手册 正确语法的服务器版本 在第32行“6”附近使用

编辑:

我刚把它改成

if(is_int($p)){..}
但是仍然得到同样的错误。。。唉…

尝试删除
0
6
周围的引号:

$connection->fetch_all($sql,array(0,6));
这将使查询:

LIMIT 0,6
使用
0
6
上的引号,查询是:

LIMIT '0','6'

编辑:在调用之前调用
执行

foreach($params as $k=>$p){
  if(is_int($p)){
    $stmt->bindParam($k+1, $p, PDO::PARAM_INT);
  }
  else{
    $stmt->bindParam($k+1, $p, PDO::PARAM_STR);
  }
}
$stmt->execute();
然后调用
fetch\u all
,如下所示:

$connection->fetch_all($sql,array(0,6));
尝试删除
0
6
周围的引号:

$connection->fetch_all($sql,array(0,6));
这将使查询:

LIMIT 0,6
使用
0
6
上的引号,查询是:

LIMIT '0','6'

编辑:在调用之前调用
执行

foreach($params as $k=>$p){
  if(is_int($p)){
    $stmt->bindParam($k+1, $p, PDO::PARAM_INT);
  }
  else{
    $stmt->bindParam($k+1, $p, PDO::PARAM_STR);
  }
}
$stmt->execute();
然后调用
fetch\u all
,如下所示:

$connection->fetch_all($sql,array(0,6));
尝试:

请注意
0
6
周围缺少引号-这使得PHP将它们视为整数,而不是字符串。

尝试:


请注意
0
6
周围缺少引号-这使得PHP将它们视为整数,而不是字符串。

您应该使用类型PDO::PARAM_INT传递参数,如:

$sth->bindParam(':limit', $limit, PDO::PARAM_INT);

您应该使用类型PDO::PARAM_INT传递参数,如:

$sth->bindParam(':limit', $limit, PDO::PARAM_INT);

您不能通过占位符执行此操作。

PDO总是引用非
null
的参数,即使它们是整数。通常这不是一件坏事,但是
LIMIT
子句不能处理带引号的整数

你需要回到传统的连接方式。因为您知道这些将是整数,所以可以在串联之前通过调用或调用它们在代码中安全地处理它们

$limit = intval($thing_that_provides_limit);
$offset = intval($thing_that_provides_offset);
$sql = "
    SELECT *

    FROM root_pages
    ORDER BY root_pages.pg_created DESC

    LIMIT {$offset}, {$limit}";

您不能通过占位符执行此操作。

PDO总是引用非
null
的参数,即使它们是整数。通常这不是一件坏事,但是
LIMIT
子句不能处理带引号的整数

你需要回到传统的连接方式。因为您知道这些将是整数,所以可以在串联之前通过调用或调用它们在代码中安全地处理它们

$limit = intval($thing_that_provides_limit);
$offset = intval($thing_that_provides_offset);
$sql = "
    SELECT *

    FROM root_pages
    ORDER BY root_pages.pg_created DESC

    LIMIT {$offset}, {$limit}";

当为PDO语句传递要执行的参数数组时,所有值都被视为PDO::PARAM_STR。@lauthiamkok:尝试使用
bindParam
告诉PDO您正在使用INTs。(见编辑后的答案)谢谢你的帮助。不过我还是有个错误。。。请检查我的编辑上面。谢谢。当为PDO语句传递要执行的参数数组时,所有值都被视为PDO::PARAM_STR。@lauthiamkok:尝试使用
bindParam
告诉PDO您正在使用int。(见编辑后的答案)谢谢你的帮助。不过我还是有个错误。。。请检查我的编辑上面。谢谢。如果(!is_array($params))$params=array($params),您可能仍然需要
@Rocket:你说得对!它正在工作!非常感谢。我可以问一下-为什么
$k+1
?谢谢这是
$k+1
,因为PHP中的数组是零索引的,但是
bindParam
希望第一个参数是
1
,而不是
0
(依此类推)。如果(!is_array($params))$params=array($params),您可能仍然需要
@Rocket:你说得对!它正在工作!非常感谢。我可以问一下-为什么
$k+1
?谢谢这是
$k+1
,因为PHP中的数组是零索引的,但是
bindParam
希望第一个参数是
1
,而不是
0
(依此类推)。谢谢你,Charles。我能问一下-什么是占位符?谢谢,谢谢你,查尔斯。我能问一下-什么是占位符?谢谢。不使用LIMIT子句,因为它仍然返回字符串(请参阅接受的答案);不使用LIMIT子句,因为它仍然返回字符串(请参阅接受的答案)