#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