Проблема с PHP PDO fetchOject - PullRequest
       30

Проблема с PHP PDO fetchOject

0 голосов
/ 21 сентября 2011

Кажется, что это ошибка или проблема, когда я использую PHP PDO fetchOject с запросом ниже,

Запрос:

SELECT 
    p.*,
    t.*

FROM root_pages AS p

LEFT JOIN root_templates AS t
ON p.tmp_id = t.tmp_id

WHERE p.pg_url = ?
AND ? IS NOT NULL

OR p.pg_url = ? 
AND p.pg_hide != ?

, вызываемый из класса DB PDO PHP,

$page = $this->database->fetch_object($sql,array(
            $pg_url,
            NULL,
            $pg_url,
            1
        ));

результат:

SQLSTATE [HY093]: недопустимый номер параметра: число связанных переменных не соответствует количеству токенов

PHP PDO FetchOject метод из класса PDO PDO,

# return the current row of a result set as an object
    public function fetch_object($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->fetchObject();
            //return $stmt->fetch(PDO::FETCH_OBJ);
        }
        catch (PDOException $e) 
        {
            # call the get_error function
            $this->get_error($e);
        }
    }

Все будет хорошо, если я вызову такой метод,

$page = $this->database->fetch_object($sql,array(
            $pg_url,
            1,
            $pg_url,
            1
        ));

Но я могу получить результатбез каких-либо ошибок при тестировании одного из приведенных ниже запросов с phpMyAdmin,

SELECT 
    p.*,
    t.*

FROM root_pages AS p

LEFT JOIN root_templates AS t
ON p.tmp_id = t.tmp_id

WHERE p.pg_url = 'exhibition sample 6' 
AND '1' IS NOT NULL

OR p.pg_url = 'exhibition sample 6' 
AND p.pg_hide != '1'

или

SELECT 
    p.*,
    t.*

FROM root_pages AS p

LEFT JOIN root_templates AS t
ON p.tmp_id = t.tmp_id

WHERE p.pg_url = 'exhibition sample 6' 
AND NULL IS NOT NULL

OR p.pg_url = 'exhibition sample 6' 
AND p.pg_hide != '1'

Любые идеи, которые я пропустил при использовании fetchOject?

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

$sql ="
SELECT 
    p.*,
    t.*

FROM root_pages AS p

LEFT JOIN root_templates AS t
ON p.tmp_id = t.tmp_id


WHERE p.pg_url = 'exhibition sample 6' 
AND ? IS NOT NULL

OR p.pg_url = 'exhibition sample 6' 
AND p.pg_hide != '1'
";

Нет ошибки с

$item = $connection->fetch_assoc($sql,1);

или

$item = $connection->fetch_assoc($sql,NULL);

метод fetch_assoc,

    # fetch a single row of result as an array ( =  one dimensional array)
public function fetch_assoc($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->fetch();
    }
    catch (PDOException $e) 
    {
        # call the get_error function
        $this->get_error($e);
    }


}

1 Ответ

0 голосов
/ 21 сентября 2011

То, что вы пытаетесь сделать (передать null в качестве параметра execute), невозможно. В документации указано:

input_parameters

Массив значений с таким количеством элементов, сколько имеется связанных параметров. в операторе SQL выполняется. Все значения рассматриваются как PDO :: PARAM_STR .

Если вы хотите передать null, вы должны связать параметры с помощью

$stmt->bindValue(1, null, PDO::PARAM_NULL);

или используйте эквивалентный синтаксис для именованных параметров.

...