Đôi khi tôi thấy câu hỏi liên quan đến kết nối với cơ sở dữ liệu.
Hầu hết các câu trả lời không phải là cách tôi làm, hoặc tôi có thể không nhận được câu trả lời chính xác. Dù sao; Tôi chưa bao giờ nghĩ về nó bởi vì cách tôi làm nó phù hợp với tôi.
Nhưng đây là một suy nghĩ điên rồ; Có lẽ tôi đang làm sai tất cả, và nếu đúng như vậy; Tôi thực sự muốn biết cách kết nối đúng cách với cơ sở dữ liệu MySQL bằng PHP và PDO và làm cho nó dễ dàng truy cập.
Đây là cách tôi đang thực hiện:
Trước hết, đây là cấu trúc tệp của tôi (đã rút gọn) :
public_html/
* index.php
* initialize/
-- load.initialize.php
-- configure.php
-- sessions.php
index.php
Ở trên cùng, tôi có require('initialize/load.initialize.php');
.
load.initialize.php
# site configurations
require('configure.php');
# connect to database
require('root/somewhere/connect.php'); // this file is placed outside of public_html for better security.
# include classes
foreach (glob('assets/classes/*.class.php') as $class_filename){
include($class_filename);
}
# include functions
foreach (glob('assets/functions/*.func.php') as $func_filename){
include($func_filename);
}
# handle sessions
require('sessions.php');
Tôi biết có một cách tốt hơn, hoặc đúng hơn, để bao gồm các lớp, nhưng không thể nhớ nó là gì. Tôi vẫn chưa có thời gian để xem xét nó, nhưng tôi nghĩ đó là một cái gì đó với autoload
. đại loại như vậy ...
configure.php
Ở đây tôi về cơ bản chỉ ghi đè lên một số php.ini -properties và làm một số cấu hình toàn cầu khác cho trang web
connect.php
Tôi đã đặt kết nối vào một lớp để các lớp khác có thể mở rộng lớp này ...
class connect_pdo
{
protected $dbh;
public function __construct()
{
try {
$db_host = ' '; // hostname
$db_name = ' '; // databasename
$db_user = ' '; // username
$user_pw = ' '; // password
$con = new PDO('mysql:host='.$db_host.'; dbname='.$db_name, $db_user, $user_pw);
$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$con->exec("SET CHARACTER SET utf8"); // return all sql requests as UTF-8
}
catch (PDOException $err) {
echo "harmless error message if the connection fails";
$err->getMessage() . "<br/>";
file_put_contents('PDOErrors.txt',$err, FILE_APPEND); // write some details to an error-log outside public_html
die(); // terminate connection
}
}
public function dbh()
{
return $this->dbh;
}
}
# put database handler into a var for easier access
$con = new connect_pdo();
$con = $con->dbh();
//
Ở đây tôi tin rằng có chỗ cho sự cải tiến lớn vì gần đây tôi đã bắt đầu học OOP và sử dụng PDO thay vì mysql.
Vì vậy, tôi vừa làm theo một vài hướng dẫn dành cho người mới bắt đầu và thử những thứ khác nhau ...
Session.php
Bên cạnh việc xử lý các phiên thông thường, tôi cũng khởi tạo một số lớp thành một phiên như thế này:
if (!isset($_SESSION['sqlQuery'])){
session_start();
$_SESSION['sqlQuery'] = new sqlQuery();
}
Bằng cách này, lớp học này có sẵn khắp nơi. Đây có thể không phải là phương pháp hay (?) ...
Dù sao, đây là những gì mà cách tiếp cận này cho phép tôi làm ở mọi nơi:
echo $_SESSION['sqlQuery']->getAreaName('county',9); // outputs: Aust-Agder (the county name with that id in the database)
Bên trong tôi sqlQuery
- lớp , mà extends
tôi connect_pdo
- lớp , tôi có một public function gọi getAreaName
đó xử lý các yêu cầu đến cơ sở dữ liệu của tôi.
Tôi nghĩ là khá gọn gàng.
Hoạt động như một sự quyến rũ
Vì vậy, về cơ bản đó là cách tôi đang làm.
Ngoài ra, bất cứ khi nào tôi cần tìm nạp một thứ gì đó từ DB của mình từ không phải trong một lớp, tôi chỉ cần làm điều gì đó tương tự như sau:
$id = 123;
$sql = 'SELECT whatever FROM MyTable WHERE id = :id';
$qry = $con->prepare($sql);
$qry -> bindParam(':id', $id, PDO::PARAM_INT);
$qry -> execute();
$get = $qry->fetch(PDO::FETCH_ASSOC);
Vì tôi đã đặt kết nối vào một biến bên trong connect_pdo.php , nên tôi chỉ cần tham khảo nó và tôi đã sẵn sàng. Nó hoạt động. Tôi nhận được kết quả mong đợi của mình ...
Nhưng bất chấp điều đó; Tôi thực sự sẽ đánh giá cao nếu các bạn có thể cho tôi biết nếu tôi rời khỏi đây. Thay vào đó tôi nên làm gì, những lĩnh vực tôi có thể hoặc nên thay đổi để cải thiện, v.v.
Tôi háo hức học ...