PHP PDO: вызов функции-члена prepare () & list? - PullRequest
0 голосов
/ 06 декабря 2010

Неустранимая ошибка: вызов функции-члена prepare () для необъекта

Это то, что я получаю, когда пытаюсь сделать:

$sql = $connect->prepare ("SELECT id, pwd, firstname, lastname, approved, user_level FROM users WHERE $user_cond AND banned = 0"); // SELECT
$sql->execute ();
$sql->setFetchMode(PDO::FETCH_ASSOC);
$num = $connect->rowCount();

Я продолжаю переписывать мою систему, убираю все mysql_ * и вместо этого использую pdo.

Это то, что было раньше:

$result = mysql_query("SELECT `id`,`pwd`,`firstname`,`lastname`,`approved`,`user_level` FROM users WHERE 
           $user_cond
            AND `banned` = '0'
            ") or die (mysql_error()); 
$num = mysql_num_rows($result);

Что я сделал не так?

А со списком () у меня есть:

list($id,$pwd,$firstname,$lastname,$approved,$user_level) = mysql_fetch_row($result);

вместо mysql_fetch_row ($ result); что мне делать в PDO?

Мой объект PDO / соединение:

try{
$connect = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF-8", DB_USER, DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(PDOException $pe)
{
  die('Could connect to the database because: ' .$pe->getMessage());

} * * тысяча двадцать-один

Ответы [ 4 ]

1 голос
/ 06 декабря 2010

Похоже на проблему с областью действия.

Вы присваиваете $connect в функции, классе, пространстве имен или выполняете подготовку в функции, классе или пространстве имен?

если вы присваиваете $connect внутри функции, то эта функция должна возвращать соединение PDO. Я бы представил статический экземпляр, например, так:

class Database extends PDO
{
    private $instance = null;
    public static function Instance()
    {
        if(self::$instance == null)
        {
            self::$instance = new Database();
        }
        return self::$instance;
    }

    private function __construct(){}
    private function __connect()
    {
        try 
        {
            parent::__construct("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF-8", DB_USER, DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION))
        }catch(PDOException $e)
        {
            die($e->getMessage());
        }
    }
}

тогда используйте так:

$Database = Database::Instnace();

$Database->prepare("...");
1 голос
/ 06 декабря 2010

Поскольку вы используете prepare, вы должны сделать $ cond именованным параметром, а затем сделать это: в этом примере это просто user_id, но вы можете иметь несколько условий и несколько именованных параметров, просто bind (), каждое из которых одинаково

$sth = $pdo->prepare ("SELECT id, pwd, firstname, lastname, approved, user_level FROM users WHERE user_id = :cond AND banned = 0"); 
$sth->bindParam(':cond', $some_user_id);
$sth->execute ();
$a = $sth->fetch( PDO::FETCH_ASSOC );

$ a будет вашим вспомогательным массивом, print_r ($ a), чтобы увидеть, что в нем

1 голос
/ 06 декабря 2010

Неустранимая ошибка: вызов функции-члена prepare () для необъекта

обычно означает, что что-то не удалось, и ваша переменная не соответствует ожидаемой. $connection вероятно false.

PDOStatement :: выборка

list($id,$pwd,$firstname,$lastname,$approved,$user_level) = $sql->fetch();

Также звоните rowCount в заявлении, а не в соединении:

$sql->rowCount();
0 голосов
/ 06 декабря 2010

Ошибка наиболее вероятна из-за сбоя соединения MySQL - поэтому $connect не является допустимым объектом PDO - поэтому, как говорится в ошибке, вы пытаетесь вызвать метод для объекта, который его не поддерживает.Как выглядит код обработки вашего соединения?Вы проверили, было ли соединение успешно создано?

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