Я только начал изучать концепцию объектно-ориентированного программирования и собрал класс для подключения к базе данных, выбора базы данных и закрытия соединения с базой данных. Пока все работает нормально, кроме закрытия соединения с базой данных.
class Database { private $host, $username, $password; public function __construct($ihost, $iusername, $ipassword){ $this->host = $ihost; $this->username = $iusername; $this->password = $ipassword; } public function connectdb(){ mysql_connect($this->host, $this->username, $this->password) OR die("There was a problem connecting to the database."); echo 'successfully connected to database<br />'; } public function select($database){ mysql_select_db($database) OR die("There was a problem selecting the database."); echo 'successfully selected database<br />'; } public function disconnectdb(){ mysql_close($this->connectdb()) OR die("There was a problem disconnecting from the database."); } } $database = new database('localhost', 'root', 'usbw'); $database->connectdb(); $database->select('msm'); $database->disconnectdb();
Когда я пытаюсь отключиться от базы данных, появляется следующее сообщение об ошибке:
Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource in F:\Programs\webserver\root\oop\oop.php on line 53
Я предполагаю, что это не так просто, как размещение метода connectdb в скобках функции mysql_close, но не может найти правильный способ сделать это.
благодаря
Я бы добавил переменную connection / link в ваш класс и использовал деструктор. Это также избавит вас от необходимости забывать закрыть соединение, потому что это происходит автоматически.
Это ссылка $ this->, которую вам нужно передать в mysql_close ().
class Database { private $link; private $host, $username, $password, $database; public function __construct($host, $username, $password, $database){ $this->host = $host; $this->username = $username; $this->password = $password; $this->database = $database; $this->link = mysql_connect($this->host, $this->username, $this->password) OR die("There was a problem connecting to the database."); mysql_select_db($this->database, $this->link) OR die("There was a problem selecting the database."); return true; } public function query($query) { $result = mysql_query($query); if (!$result) die('Invalid query: ' . mysql_error()); return $result; } public function __destruct() { mysql_close($this->link) OR die("There was a problem disconnecting from the database."); } }
Пример использования:
<?php $db = new Database("localhost", "username", "password", "testDatabase"); $result = $db->query("SELECT * FROM students"); while ($row = mysql_fetch_assoc($result)) { echo "First Name: " . $row['firstname'] ."<br />"; echo "Last Name: " . $row['lastname'] ."<br />"; echo "Address: " . $row['address'] ."<br />"; echo "Age: " . $row['age'] ."<br />"; echo "<hr />"; } ?>
Редактировать:
Поэтому люди действительно могут использовать класс, я добавил недостающие свойства / методы.
Следующим шагом будет расширение метода запроса, включение защиты от инъекции и любых других вспомогательных функций.
Я внесла следующие изменения:
Если я сделал опечатку или ошибку, оставьте конструктивный комментарий, чтобы я мог исправить это для других.
вы ничего не возвращаете из connectdb()
но вы возвращаете эту функцию в mysql_close()
.
Вы должны знать, что функции mysql_*
были введены в PHP 4, что более 1-го года назад. Этот API очень старый, и процесс начал фактически обесценивать это расширение .
Вы не должны в 2012 году писать новый код с mysql_*
.
Существуют две очень хорошие альтернативы: PDO и MySQLi . Оба из них уже написаны с учетом объектно-ориентированного кода, и они также дают вам возможность использовать подготовленные заявления .
Этот пример, который вы показали в оригинальной записи, написанной с помощью PDO, будет выглядеть так:
//connect to the the database $connection = new PDO('mysql:host=localhost;dbname=msm', 'username', 'password'); //disconnects $connection = null;
Конечно, есть более сложный случай использования, но точка ожидания – время для развития.
mysql_close требует отключения параметра, но вы ничего не предоставляете.
класс База данных { private $ host, $ username, $ password, $ con; public function __construct ($ ihost, $ iusername, $ ipassword) { $ this-> host = $ ihost; $ this-> username = $ iusername; $ this-> password = $ ipassword; $ this-> con = false; } public function connect () { $ connect = mysql_connect ($ this-> host, $ this-> имя пользователя, пароль $ this->); return $ connect; } public function connectdb () { $ conn = $ this-> connect (); если ($ сопп) { $ this-> con = true; эхо "Успешно подключено.
«; return true; } else { echo "Извините, не удалось подключиться.
«; return false; } } публичная функция select ($ database) { если ($ this-> кон) { если (mysql_select_db ($ базы данных)) { echo "Успешно подключенная база данных. $ database.
«; return true; } еще { echo "Неизвестная база данных.
«; } } else { echo "Нет активного соединения.
«; return false; } } public function disconnectdb () { если ($ this-> кон) { если (mysql_close ($ this-> подключения ())) { $ this-> con = false; echo "Успешно отключен.
«; return true; } } еще { echo "Не удалось отключить.
«; return false; } } } $ database = новая база данных ('localhost', 'root', ''); $ Database-> connectdb (); $ Database-> выберите ( 'databaseoffacebook'); $ Database-> disconnectdb ();
Объектно-ориентированное программирование хорошо работает с PDO и mysqli. Попробуйте
<?php class Database{ private $link; //private $host,$username,$password,$database; //private $status; public function __construct(){ $this->host = 'localhost'; $this->username = 'root'; $this->password = ''; $this->database = 'workclass'; $this->link = mysqli_connect($this->host,$this->username,$this->password); $this->status = mysqli_select_db($this->link,$this->database); if (!$this->status) { return $this->status="Failed to Connected with Database"; }else{ return $this->status="Database is connected"; } } } $object = new Database(); echo $object->status; ?>