PHP PDO: как вернуть целое число - PullRequest
1 голос
/ 16 марта 2011

Я думаю, что это может быть ошибкой в ​​моем методе выборки данных 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, чтобы узнать правильный синтаксис для использования рядом с '' 0 ',' 6 '' в строке 32

Как это исправить?

РЕДАКТИРОВАТЬ:

Как и предполагалось, я изменил код в моем методе, как показано ниже,

# 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, чтобы найти правильный синтаксис для использования рядом с '' 6 '' в строке 32

РЕДАКТИРОВАТЬ:

Я только что изменил на

if(is_int($p)){..}

но все равно получаю ту же ошибку ... вздох ...

Ответы [ 4 ]

7 голосов
/ 16 марта 2011

вы должны передать свой параметр с типом PDO :: PARAM_INT, например:

$sth->bindParam(':limit', $limit, PDO::PARAM_INT);
2 голосов
/ 16 марта 2011

Вы не можете сделать это с помощью заполнителей.

PDO всегда цитирует параметры, которые не null, даже если они целые.Обычно это не так уж плохо, но предложения LIMIT не могут обрабатывать целые числа в кавычках.

Вам нужно будет вернуться к старому доброму объединению.Поскольку вы знаете, что они будут целыми числами, вы можете безопасно обращаться с ними в своем коде, вызывая intval или приведение к ним перед объединением.

$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}";
2 голосов
/ 16 марта 2011

Попробуйте удалить кавычки вокруг 0 и 6:

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

Это должен сделать запрос:

LIMIT 0,6

С кавычками 0 и 6, запрос:

LIMIT '0','6'

РЕДАКТИРОВАТЬ : Позвоните bindParam, прежде чем позвонить execute.

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));
0 голосов
/ 16 марта 2011

Попробуйте:

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

Обратите внимание на отсутствие кавычек вокруг 0 и 6 - это заставляет PHP рассматривать их как целые числа, а не строки, которые у вас были.

...