что не так с этим кодом PDO? - PullRequest
2 голосов
/ 07 марта 2011

Я создал имя файла database.php и вот его содержимое

<?php
#Start Session
session_start();
#Start Output Buffering
ob_start();
#Set Default TimeZone
date_default_timezone_set('Asia/Kolkata');

#Define Connection Constant
define('HOST','localhost');
define('USERNAME','user');
define('PASSWORD','pass');
define('DATABASE','database');
//Define Configuration Constant
define('DATE', date("d-F-Y/H:ia"));

#Connect to the database
try
{
    #Define Connection String Using PDO.
    $DBH = new PDO('mysql:host='.HOST.';dbname='.DATABASE,USERNAME,PASSWORD);

    #Set Error Mode to ERRMODE_EXCEPTION.
    $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $e)
{
    echo $e->getMessage();
    //Log Errors into a file
    file_put_contents("resources/logs/Connection-log.txt", DATE.PHP_EOL.$e->getMessage().PHP_EOL.PHP_EOL, FILE_APPEND);
}
?>

, и теперь я определил класс PHP и объявил метод, в котором я хочу получить некоторые значения, основанные насоединение выше.я включил файл database.php.

вот мой код.

include('../../config/database.php');
class Property
{
    public function getAllCountries()
    {
        #Query Using Prepared Statement
        $STH = $DBH->query('SELECT * FROM countries');

        #Set the Fetch Mode
        $STH->setFetchMode(PDO::FETCH_ASSOC);

        $countries = array();
        while($row = $STH->fetch())
        {
            $countries[] = $row['name'];
            return $countries;
        }
    }
}
$property = new Property;
echo $property->getAllCountries();

когда я инициализирую класс, у него не возникает никаких проблем, но когда я пытаюсь вызвать $ property-> getAllCountries ();метод, он дает мне следующую ошибку.

Notice: Undefined variable: DBH in /Applications/MAMP/htdocs/kokaris/administrator/resources/library/models/class.property.php on line 8

Fatal error: Call to a member function query() on a non-object in /Applications/MAMP/htdocs/kokaris/administrator/resources/library/models/class.property.php on line 8

что не так с моим кодом?

Ответы [ 2 ]

3 голосов
/ 07 марта 2011

Проблема в том, что $DBH находится вне зоны действия во время вызова $DBH->query(). $DBH находится в глобальной области видимости, тогда как вызов находится в области действия функции (getAllCountries). В отличие от некоторых других языков, глобальные переменные недоступны внутри функций, если вы не объявите их специально.

Обходной путь в одну строку для этого - использовать глобальное значение $DBH внутри функции:

public function getAllCountries()
{
    global $DBH;

    #Query Using Prepared Statement
    $STH = $DBH->query('SELECT * FROM countries');

Однако, это, вероятно, плохая идея, потому что вы теперь привязались к определенному способу обработки соединений с базой данных. Было бы лучше передать объект базы данных в качестве параметра конструктору, сохранить его в переменной объекта и извлечь его, когда вам нужно его использовать.

class Property
{
    protected $dbh;

    public function __construct($dbh) {
        $this->dbh = $dbh;
    }

    public function getAllCountries() {
        $STH = $this->dbh->query('SELECT * FROM countries');

        [snip]
    }    
}

Затем вам нужно будет инициализировать ваш класс с помощью объекта DB, переданного в качестве параметра:

$property = new Property($DBH);
echo $property->getAllCountries();
2 голосов
/ 07 марта 2011

попробуйте передать дескриптор dbh в конструкторе класса и зарезервировать имена переменных в верхнем регистре только для глобальных и констант ... Избегайте использования глобальных переменных в вашем классе ...

Второй выпуск: Возвращение стран за пределы цикла!

class Property
{

    protected $dbh;

    public function __construct($dbhandle) {
      $this->dbh = $dbhandle;
    }


    public function getAllCountries()
    {
        #Query Using Prepared Statement
        $sth = $this->dbh->query('SELECT * FROM countries');

        #Set the Fetch Mode
        $sth->setFetchMode(PDO::FETCH_ASSOC);

        $countries = array();
        while($row = $sth->fetch())
        {
            $countries[] = $row['name'];
        }

        // !! return goes here!
        return $countries;
    }
}

$property = new Property($DBH);
echo $property->getAllCountries();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...