【问题标题】:PHP PDO: how to return integerPHP PDO:如何返回整数
【发布时间】:2011-03-16 15:51:19
【问题描述】:

我认为这可能是我的 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)){..}

但仍然出现相同的错误...叹息...

【问题讨论】:

  • 你可能还需要if (!is_array($params)) $params = array($params);
  • @Rocket:你是对的!它现在正在工作!非常感谢。我可以问 - 为什么$k+1?谢谢!
  • 它是 $k+1,因为 PHP 中的数组是零索引的,但 bindParam 希望第一个参数是 1,而不是 0(等等)。

标签: php string integer pdo prepared-statement


【解决方案1】:

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

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

【讨论】:

  • 不使用 LIMIT 子句,因为它仍然返回一个字符串(请参阅接受的答案)
【解决方案2】:

您不能通过占位符来做到这一点。

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

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

$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}";

【讨论】:

  • 谢谢你,查尔斯。我可以问 - 什么是占位符?谢谢。
【解决方案3】:

尝试删除 06 周围的引号:

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

这应该进行查询:

LIMIT 0,6

06 上加上引号,查询是:

LIMIT '0','6'

编辑:在拨打execute之前先拨打bindParam

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_all

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

【讨论】:

  • 当传递参数数组以执行 PDO 语句时,所有值都被视为 PDO::PARAM_STR。
  • @lauthiamkok:尝试使用bindParam 告诉 PDO 您正在使用 INT。 (见编辑答案)
  • 感谢您的帮助。我仍然收到一个错误...请检查我上面的编辑。谢谢。
【解决方案4】:

试试:

$items = $connection->fetch_all($sql,array(0,6));

注意 06 周围没有引号 - 这使得 PHP 将它们视为整数,而不是您拥有的字符串。

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 2020-05-09
    • 2019-06-07
    • 2011-07-24
    • 2021-09-20
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多