2012-06-11 18 views
7

Ở đâu có quá nhiều cách để đạt được kết quả tương tự, tôi tự hỏi đó là cách hiệu quả nhất để khởi tạo kết nối mysql.Cách hiệu quả nhất để kết nối với cơ sở dữ liệu mysql trên nhiều tệp (PHP)

Lưu ý: Gần đây tôi cũng đã phát hiện trong tài liệu PHP rằng mysql_connect bây giờ là BẤT CỨ, tất cả các mã của tôi hiện đang sử dụng mysql_connect. Có đủ lý do để chuyển đổi không?

gì tôi đang cố gắng làm là:

  1. tạo database.php.
  2. Các trang PHP sẽ kết nối với cơ sở dữ liệu sẽ bao gồm tệp này để tôi không phải viết nhiều mã để kết nối với cơ sở dữ liệu.

Vậy cơ sở dữ liệu này nên làm gì, để có hiệu quả nhất.

1. $con = mysql_connect("etc"...) 
    mysql_select_db("databse") 

// từ đây tôi có thể bao gồm tệp này và bắt đầu thực hiện truy vấn. - Làm việc nhưng tôi không chắc chắn nếu nó là cách tốt nhất.

2. //database.php 
    $mysqli = new mysqli('localhost', 'user', 'pwd', 'database'); 
    // in other files 
    $mysqli->query("SELECT ...") 
  1. hoặc tôi nên sử dụng kết nối liên tục? (Trang web này là khá cơ sở dữ liệu nặng, và có sẽ được rất nhiều thế hệ trang, không quá 100 người dùng đồng thời đăng nhập)

Cảm ơn bạn trước

+0

Điều bạn đang làm có vẻ ổn. Các kết nối – bumperbox

+1

được sử dụng lại nếu các thông tin tương tự được sử dụng để kết nối, do đó không cần phải lo lắng nhiều; nhưng có bạn lại được khuyến khích di chuyển từ mysql ngay khi bạn có thể. http://php.net/manual/en/mysqlinfo.api.choosing.php –

+0

@bumperbox nó nói trong hướng dẫn sử dụng là "nó đã không được chấp nhận như của PHP 5.5.0 và sẽ bị xóa trong tương lai" vì vậy phụ thuộc Làm thế nào bạn đang sử dụng php trong tương lai bạn có thể có vấn đề nếu nó bị loại bỏ và máy chủ của bạn chỉ có phiên bản mới hơn của php –

Trả lời

6

Tôi vừa thay đổi tất cả các chức năng của phần mở rộng MySQL trong mã của tôi thành PDO ngay hôm nay.

Để được linh hoạt nhất, bạn nên tạo "database.php" với một kết nối chung như thế này:

<?php 
$pdo = new PDO('mysql:host=example.com;dbname=database;charset=UTF-8', 
       'username', 
       'password'); 

Sau đó, trong trang khác, sử dụng require() để bao gồm các tập tin như thế này:

<?php 
require('database.php'); 

// Example with 'query' 
$queriedSQL = $pdo->query('SELECT * FROM table'); 

// Example with 'prepare' 
$preparedSQL = $pdo->prepare('SELECT * FROM other_table WHERE id = ?'); 
$preparedSQL->setFetchMode(PDO::FETCH_ASSOC); 

while($result = $queriedSQL->fetch(PDO::FETCH_ASSOC)) { 
    $preparedSQL->execute(array($result['id'])); 
    $preparedSQLResult = $preparedSQL->fetch(); 
    // Process code here 
} 

Nói cách khác, bạn có thể đặt "index.php" làm lõi và sau đó xử lý URL hoặc $_GET[] để bao gồm tệp tương ứng (như tất cả hệ thống CMS, Wordpress, v.v.).

Bằng cách đó bạn có thể tránh thay đổi số lượng mã khi một số dữ liệu (máy chủ, tên người dùng, mật khẩu và/hoặc tên cơ sở dữ liệu) thay đổi.

Về kết nối liên tục, PHP cho phép, nhưng có những hạn chế như bạn có thể tìm thấy trong here.

+0

tại đây: $ result = $ SQL-> fetch (PDO :: FETCH_ASSOC) ý của bạn là $ readySQL-> fetch? Tôi không thấy $ SQL khai báo ở bất cứ đâu – 40Plot

+0

@stackplasm Xin lỗi, ý tôi là $ queriedSQL, tôi quên thay đổi tên biến khi tôi thêm ví dụ chuẩn bị. Tôi đã chỉnh sửa ngay bây giờ. –

3

Điều đầu tiên bạn nên làm là tạo tệp mysql.config.php.

<?php 
define('MYSQL_HOST',''); 
define('MYSQL_USER',''); 
define('MYSQL_PASSWORD',''); 
define('MYSQL_DATABASE',''); 
?> 

Điều thứ hai bạn nên làm là tạo tệp mysql.class.php xử lý tất cả chi tiết kết nối cơ sở dữ liệu (mô phỏng hành vi này). Chỉ cần thêm các hàm mới để mở rộng các chức năng như hàm numRows.

<?php 
require_once 'mysql.config.php'; 
class MySQL { 
private $query; 
private $result; 
public function __construct($host = MYSQL_HOST, $user = MYSQL_USER, $password = MYSQL_PASSWORD, $database = MYSQL_DATABASE) { 
    if (!$con = mysql_connect($host,$user,$password)) { 
     throw new Exception('Error connecting to the server'); 
    } 
    if (!mysql_select_db($database,$con)) { 
     throw new Exception('Error selecting database'); 
    } 
} 
public function query($query) { 
    $this->query = $query; 
    if (!$this->result = mysql_query($query)) { 
     throw new Exception('Error performing query '.$query); 
    } 
} 
public function numRows() { 
    if ($this->result) return mysql_num_rows($this->result); 
    return false; 
} 
} 
?> 

Điều cuối cùng bạn cần làm là sử dụng các tệp này trong ứng dụng của bạn.

<?php 
require_once 'mysql.class.php'; 
try { 
    $db = new MySQL(); 
    $db->query('SELECT username FROM login WHERE username = "'.$USERNAME.'" LIMIT 1'); 
    if ($db->numRows() == 1) print_json(array('user'=>true),true); 
    else print_json(array('user'=>false),true); 
} catch(Exception $e) { 
    echo $e->getMessage(); 
    exit(); 
} 
?> 
+4

Không ủng hộ điều này như là một giải pháp cho một người bắt đầu, ở tất cả. Nếu bạn định tạo một đối tượng để sử dụng trong nhiều tệp, sau đó móc đối tượng đó vào PDO (hoặc mysqli) nhưng không khuyến khích chức năng mysql. Thay đổi rất đơn giản cho câu trả lời của bạn ở trên sẽ khắc phục điều này! – Robbie

+0

Đồng ý. Tôi chưa học về PDO hoặc mysqli nhưng nếu bạn quyết định sử dụng mysql thì đây là cách để cung cấp một khung định hướng đối tượng dễ sử dụng. –

1

Vì trang web là cơ sở dữ liệu nặng, tôi khuyên bạn nên sử dụng PDO cho kết nối cơ sở dữ liệu. Cũng sử dụng các giao dịch cho nhiều truy vấn, để giảm lưu lượng truy cập PHP-MySQL.

chi tiết ở đây: http://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html

1

Liên quan đến ngôn ngữ lập trình PHP, MySQL là cơ sở dữ liệu trình điều khiển cũ, và MySQLi là người lái xe được cải thiện. MySQLi tận dụng các tính năng mới hơn của MySQL 5. Nâng cao nguyên văn từ php.trang web ròng:

  • giao diện hướng đối tượng
  • Hỗ trợ chuẩn bị phát biểu
  • Hỗ trợ Nhiều báo cáo
  • Hỗ trợ cho giao dịch
  • khả năng gỡ lỗi Enhanced
  • Embedded hỗ trợ máy chủ Bạn có thể lựa chọn về việc sử dụng mysql, mysqli hoặc PDO.

Nếu bạn chỉ đơn giản là tìm kiếm cơ sở dữ liệu quan hệ, bạn không cần phải nhìn xa hơn MySQL, mặc dù có nhiều tùy chọn sẵn có.

0

RE: "Tôi nên sử dụng kết nối liên tục"

số Nếu cơ sở dữ liệu của bạn là "nặng", kết nối persistant sẽ không thực sự giúp - trong thực tế, họ có thể cản trở với các kịch bản PHP mà ở lại mở một thời gian dài trong khi xử lý dữ liệu. Kết nối liên tục chỉ tăng tốc thời gian để kết nối với cơ sở dữ liệu Ở MỘT SỐ MÔI TRƯỜNG. Bạn CÓ THỂ có thể tiết kiệm một vài ms cho mỗi lần chạy tập lệnh, nhưng bạn sẽ mất nhiều chức năng dọn dẹp hơn để giải phóng khóa hoặc giao dịch trừ khi bạn viết cẩn thận. Vì vậy, trừ khi bạn có rất nhiều kịch bản rất ngắn, nhận được các kết nối db ngắn, sắc nét và sau đó chuyển sang, hoặc máy chủ DB là một chặng đường dài từ máy chủ web, đừng đổ mồ hôi vào thời điểm này.

PDO đã được đề xuất trong các câu trả lời khác, vì vậy tôi đã đánh dấu chúng là vì nó sẽ là tốt nhất cho bạn.

Các vấn đề liên quan