php pdo сохранить данные запроса - PullRequest
0 голосов
/ 01 октября 2011
: Call to a member function rowCount() on a non-object in C:\wamp\www\prjy\classes\user.php on line 34

Строка 29-32

$this->sth = $this->dbh->prepare("SELECT id, userlevel FROM users WHERE username = ? AND password = ?");
$this->sth->bindParam(1, $username);
$this->sth->bindParam(2, $password);
$this->data = $this->sth->execute();

Строка 34

if ($this->data->rowCount() > 0)

Я хочу сохранить объект результата в другой переменной, чтобы я мог выполнить другой запрос и в зависимости отрезультат, я возвращаю то, что правильно ... Не могу ли я сохранить результат (execute ()) в переменной, как указано выше?Как мне решить это иначе?

Ответы [ 5 ]

1 голос
/ 01 октября 2011

Мэтт правильный ;PDOStatement::execute() возвращает логическое значение.

А ДиЭхо частично правильно о PDOStatement::rowCount();в документах также говорится:

Если последний оператор SQL, выполненный связанным PDOStatement, был оператором SELECT, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором.Однако такое поведение не гарантируется для всех баз данных и не следует полагаться на переносимые приложения.

Если вы используете MySQL, будет работать , но имейте в виду, чтопоэтому он не может быть переносим на другие СУБД с.

Если переносимость не имеет значения, PDOStatement::rowCount() - это то, что вам нужно, и для этого вам нужно использовать это:

if ($this->sth->rowCount() > 0)

Однако вам нужно сохранить несколько PDOStatement объектов.Поэтому я предлагаю сделать что-то вроде следующего:

$stmt1 = $this->dbh->prepare( /* first select statement */ );
$stmt1->bindParam(1, $username);
$stmt1->bindParam(2, $password);

$stmt2 = $this->dbh->prepare( /* second select statement */ );
$stmt2->bindParam(1, $username);
$stmt2->bindParam(2, $password);

if( $stmt1->execute() && $stmt2->execute() )
{
    if( $stmt1->rowCount() > 0 )
    {
        $result = $stmt1->fetchAll();
    }
    else if( $stmt2->rowCount() > 0 )
    {
        $result = $stmt2->fetchAll();
    }
}

или что-то похожее, в зависимости от того, по каким критериям вы хотите получить результаты одного из утверждений.однако помните, что для того, чтобы это работало, вам нужно активировать буферизованных запросов для MySQL в PDO (если это еще не было активировано):

$db = new PDO(
          'dsn connection string',
          'username',
          'password',
          array( PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true )
      );
1 голос
/ 01 октября 2011

Как насчет использования:

count($this->data)

для количества строк?

1 голос
/ 01 октября 2011

PDOStatement::rowCount() возвращает количество строк, затронутых последним оператором DELETE, INSERT или UPDATE , выполненным соответствующим объектом PDOStatement.

Для большинства баз данных PDOStatement::rowCount() не возвращает количество затронутых строк по заявлению SELECT. Вместо
используйте PDO::query(), чтобы выдать оператор SELECT COUNT(*) с теми же предикатами, что и предполагаемый оператор SELECT,
затем используйте PDOStatement::fetchColumn(), чтобы получить количество строк, которые будут возвращены.

Ссылка

0 голосов
/ 01 октября 2011

Вы не проверяете ошибки.PDOStatement::execute() возвращает false в случае ошибки.Вы должны проверить это!

if (!$this->data = $this->sth->execute()) { echo "ERROR!"; print_r($this->sth->errorInfo()); die(); }

или нечто подобное.Это, вероятно, причина.

0 голосов
/ 01 октября 2011

Перед вызовом rowCount () необходимо выполнить еще один тест:

$this->sth = $this->dbh->prepare("SELECT id, userlevel FROM users WHERE username = ? AND password = ?");
$this->sth->bindParam(1, $username);
$this->sth->bindParam(2, $password);
if($this->data = $this->sth->execute()) {
   if ($this->data->rowCount() > 0) {
      // do something here ..
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...