Member 14093672 Ответов: 1

Разница между 2 классами PHP pdo?


Привет,

Есть ли кто-нибудь поблизости, чтобы дать некоторую информацию относительно разницы между двумя запросами, классом соединения pdo и тем, что лучше и почему?

Что я уже пробовал:

PDO подключение к базе данных класс 1
class DB extends PDO {

    protected $db_name = "yog";
    protected $db_user = "root";
    protected $db_pass = "";
    protected $db_host = "localhost";

    public function __construct() {
        try {
            parent::__construct("mysql:host={$this->db_host};dbname={$this->db_name}", $this->db_user, $this->db_pass);
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    } 


PDO подключение к базе данных класс 2
class DB {

    private $dbHost     = "localhost";
    private $dbUsername = "root";
    private $dbPassword = "";
    private $dbName     = "yog";

    public function __construct(){
        if(!isset($this->db)){
            // Connect to the database
            try{
                $conn = new PDO("mysql:host=".$this->dbHost.";dbname=".$this->dbName, $this->dbUsername, $this->dbPassword);
                $conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $this->db = $conn;
            }catch(PDOException $e){
                die("Failed to connect with MySQL: " . $e->getMessage());
            }
        }
    }   

Mohibur Rashid

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

Member 14093672

Привет Мохибур Ас Салам о Аликум, пожалуйста, любезно дайте некоторое объяснение и почему мы не можем использовать его в простых терминах, пожалуйста. Спасибо Спасибо

1 Ответов

Рейтинг:
1

Mohibur Rashid

Валейкум Салам.

Кажется, вы удалили расширение из второго класса. Теперь второй класс выглядит нормально.

Какой из них вы будете использовать, зависит от вашего подхода.
Но второй класс имеет переменную $db; которая не является частной. Может быть изменен вне класса, и в начале класса вы проверяете, существует ли $this->db или нет; в конструкции $this->db все равно не существует;


<?php
class cc {
  public function __construct() {
    $this->a = 10;
    $this->b = 20;
  }
}

$x= new cc();
print_r($x);


Результат:
cc Object
(
    [a] => 10
    [b] => 20
)

Что означает, что это работает; но не очень хорошая практика. Приведет к неожиданной катастрофе.

Ваш первый класс,
$db = new DB();
$res = $db->query("The Query");

Это имеет большое преимущество. Он позволит вам напрямую получить доступ к любой функции класса PDO без каких-либо ограничений. Это полезно, когда работаешь в команде. Вы все еще можете добавлять функции для выполнения дополнительной работы. И вы можете обернуть существующую функцию PDO, если вам нужно.

С другой стороны, со вторым классом вам придется реализовать много функций для доступа к отдельной функции, это будет проблематично в долгосрочной перспективе.

Итак, я все же предлагаю вам воспользоваться первым классом.




-------------ADDITIONAL-------------

О заданном вами вопросе, связанном с атрибутом set:
class DB extends PDO {
...
...
}

$conn = new DB();
conn->setAttribute(PDO::CONSTANT, PDO::CONSTANT); <-- this will solve your attribute setting issue. Please, take your time to understand how class, extended class  works. 

// This should work too
$conn->setAttribute(DB::CONSTANT, DB::CONSTANT);



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


Member 14093672

Джазакалла Хайр, я был в дилемме, и я не был уверен в том, как повлияет безопасность на приложение, использующее первый подход, пока не услышал от вас своевременный и экспертный совет.

Вы абсолютно правы, гораздо проще использовать доступ к данным PDO, используя первый подход. Я все еще учусь изо дня в день.

включают 'DB.php';
$con = новая БД();

Но единственный вопрос заключается в том, как мне установить

$con -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

а также повторно использовать соединение, если оно все еще открыто.


Есть ли способ связаться с вами по электронной почте, если вы не возражаете?

Еще раз миллион и миллиард благодарностей.

Mohibur Rashid

Я отвечу на ваш первоначальный вопрос позже. о том, чтобы связаться со мной, проще спросить Здесь. Потому что у многих людей есть хорошее предложение. И ради моей собственной безопасности(с точки зрения спама) Я не буду публиковать свой адрес электронной почты ни на одном форуме. И вы должны воздержаться от публикации своего адреса электронной почты

Mohibur Rashid

Я обновил ответ.

Member 14093672

Когда я попробовал что-либо из вышеперечисленного, я получаю ошибку undefined class constant.

Mohibur Rashid

В чем же ошибка?