PDO действует по-разному на два очень похожих запроса - PullRequest
2 голосов
/ 17 сентября 2009

Следующий блок кода работает нормально (без ошибок)

$query = "select * from users where username = ?";
$statement = $sql->prepare($query);
echo gettype($statement); // -- This returns 'object'
$statement->bindParam(1, $username);

Следующее дает: Неустранимая ошибка: вызов функции-члена bindParam () для необъекта в /file.php в строке 39

$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
echo gettype($statement); // -- this returns 'boolean'
$statement->bindParam(1, $email); // -- this is line 39.

Теперь это странно.

На моей локальной машине и на моем удаленном хосте это никогда не было проблемой.

Эта ошибка появляется только на этой новой хостинговой компании, которую я пробую в течение месяца. Может ли это быть параметр конфигурации, когда они скомпилировали php?

-------- редактировать -------- Все еще пытаясь понять, что не так, я выяснил это.

<code>$query = "select userID, username from users";
$statement = $sql->prepare($query);    
$statement->execute();
$r = $statement->fetchAll(PDO::FETCH_ASSOC);

// display # of rows
echo "Rows returned: " . $statement->rowCount();

// display results array
echo '<pre>'; print_r($r); echo '
';

На сервере я получаю

Rows returned: 4

Array
(
    [0] => Array
        (
            [userID] => 1
            [username] => lyrae
        )

    [1] => Array
        (
            [userID] => 2
            [username] => jproffer
        )

    [2] => Array
        (
            [userID] => 3
            [username] => king
        )

    [3] => Array
        (
            [userID] => 4
            [username] => gergy
        )

)

Что правильно. Говорит, что возвращено 4 строки и отображает массив результатов. Однако на другом сервере я получаю

Rows returned: 0

Array
(
    [0] => Array
        (
            [userID] => 1
            [username] => lyrae
        )

    [1] => Array
        (
            [userID] => 2
            [username] => jproffer
        )

    [2] => Array
        (
            [userID] => 3
            [username] => king
        )

    [3] => Array
        (
            [userID] => 4
            [username] => gergy
        )

)

Таким образом, кажется также, что PDOStatement :: rowCount () не работает на сервере, а работает на другом.

Ответы [ 6 ]

2 голосов
/ 18 сентября 2009

Прочитайте это: $ Statement-> closeCursor ()

PDOStatement :: closeCursor () освобождает соединение с сервером, так что могут быть выполнены другие операторы SQL

Используете ли вы ту же базу данных на сервере, где, как вы говорите, у вас нет этой проблемы?

1 голос
/ 17 сентября 2009

Нашел решение проблемы.

Это весь блок кода ..

// check if username exists
$query = "select * from users where username = ?";
$statement = $sql->prepare($query);
$statement->bindParam(1, $username);
$statement->execute();


// check if email exists
$sql2 = new PDO('mysql:host=localhost; dbname=db', 'username', 'pw');
$query = "select * from users";
$statement = $sql2->prepare($query);
echo gettype($statement);
#$statement->bindParam(1, $email);

Так что по какой-то причине мне нужно создать новый экземпляр PDO. что странно, что на 2 других серверах мне не нужно это делать.

И, посмотрев дальше, я обнаружил, что PDO :: Prepare вызывает исключение PDO.

Вот оно:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.

Array
(
    [0] => HY000
    [1] => 2014
    [2] => Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
)

Может быть, это поможет кому-то в будущем:)

0 голосов
/ 07 октября 2009

У меня была такая же проблема с echo "Ряды возвращены:". $ Оператор-> сверка ();

Я получил -1 ряд, лол. Моя база данных - INFORMIX, и я нашла поисковую сеть. тот rowCount (); возвращает только затронутые строки в операторе DELETE, INSERT или UPDATE, выполненном соответствующим объектом PDOStatement.

С оператором SELECT вам нужно использовать функцию $ Оператор-> fetchColumn ();

Прочитайте это здесь: http://www.phpbuilder.com/manual/en/function.pdostatement-rowcount.php

0 голосов
/ 18 сентября 2009

Я бы лучше порекомендовал использовать это:

$email = 'fake@email.com';
$query = "select * from users where email = ?";
$statement = $sql->prepare($query);
$statement->execute(array($email));

Здесь не нужно использовать BindParam.

0 голосов
/ 17 сентября 2009

Вы пытались поместить строку $email= ниже bindParam (но перед тем, как выполнить)? bindParam передает параметр по ссылке, чтобы вы могли выполнить его как запрос, изменить значение переменной и выполнить снова.

Я думаю, что это, вероятно, ошибка установки PHP. Я слышал, как люди говорили, что в PDO было много ошибок до PHP 5.3, поэтому, возможно, посмотрите, сможете ли вы получить PHP до последней версии?

Вы также пытались поменять местами два запроса? Может быть, что-то сломалось после запуска одного запроса.

0 голосов
/ 17 сентября 2009

$ email не определен? Вы можете попробовать var_dump ($ email) тоже посмотреть, что там написано. Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...