Как преобразовать mysql в соединение с базой данных mysqli в конструкторе

#php #mysql #mysqli

#php #mysql #mysqli

Вопрос:

Я просто пытаюсь преобразовать mysql в соединение с базой данных mysqli в конструкторе.

db.php

 <?php
define('SERVER', 'localhost');
define('USERNAME', 'root');
define('PASSWORD', 'password');
define('DATABASE', 'database');
class DB {
    function __construct(){
        $connection = mysqli_connect(SERVER, USERNAME, PASSWORD,DATABASE);
    }
}
?>
  

users.php

 <?php
class Users {
    function __construct(){
        $db = new DB();
    }

    public function read(){
        $query = mysqli_query($db,"select use_id, use_name, use_email FROM users");
        while ($row = mysqli_fetch_array($query,MYSQLI_ASSOC)){
            $data[] = $row;
        }
        return $data;
    }
}
?>
  

result.php

 <?php require_once('db.php'); ?>
<?php require_once('users.php'); ?>
<?php
$Users = new Users();
$users = $Users->read();
?>
  

Я пытался изменить методы mysql на mysqli, но он не подключается, и я где-то читал, что создание экземпляра соединения с БД в конструкторе — плохая идея: пожалуйста, можете ли вы объяснить почему, и если есть лучший способ сделать соединение с БД легко доступным в каждом классе, который в нем нуждается?

Комментарии:

1. Вам необходимо расширить класс в вашем user.php class User extends DB{ ... }

2. @PrateekGupta ему это НЕ нужно!

3. о, извините, я не видел, что он включил db.php на странице результатов.

4. Покажите свой код на основе mysqli и объясните, где конкретно у вас возникли проблемы.

5. @MikeBrant Я только что изменил код mysql на mysqli

Ответ №1:

 <?php
define('SERVER', 'localhost');
define('USERNAME', 'root');
define('PASSWORD', '');
define('DATABASE', 'wall');
 $db = mysqli_connect(SERVER, USERNAME, PASSWORD,DATABASE);


class Users {
   private $db;

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

    public function read(){
        $query = mysqli_query($this->db,"select * FROM users");
        while ($row = mysqli_fetch_array($query,MYSQLI_ASSOC)){
            $data[] = $row;
        }
        return $data;
    }
}

//$db = new DB();
$U = new Users($db);
$users = $U->read();

 foreach($users as $user){
        echo $user['username'] ;
    }

?>
  

Ответ №2:

Лучшей практикой будет передача DB экземпляра Users классу. Представьте, что у вас есть Registration класс, Login класс и т.д. Будут ли все их конструкторы создавать новое соединение с MySQL? Это не выглядит хорошей идеей, поскольку все они могут использовать одно и то же соединение с базой данных.

 class Users {

    private $db;

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

....
}

$db = new DB();
$users = new Users($db);
  

Ответ №3:

Как указано в руководстве mysqli_connect , принимает 4-й параметр в качестве базы данных. попробуйте

 $connection = mysqli_connect(SERVER, USERNAME, PASSWORD, DATABASE);
if (!$connection) {
    die('Connect Error (' . mysqli_connect_errno() . ') '
            . mysqli_connect_error());
};
  

Комментарии:

1. @bryan Проблема в том, что значение $ db здесь не отображается $query = mysqli_query ($ db, «выберите use_id, use_name, use_email ОТ пользователей»);

2. Хм, вижу, что смотрю сейчас, не знаю, почему это когда-нибудь сработает. DB Класс довольно бесполезен. Вы можете либо отказаться от класса и просто подключиться после defines и использовать global $connection (не рекомендую это), либо увеличить класс DB для фактического выполнения запросов. бесстыдный плагин к вспомогательному классу db, который я сделал github.com/flyinbryan125/DB-Helper