2012-06-11 74 views
7

有很多方法可以實現相同的結果,我想知道哪種方法是初始化mysql連接的最有效方式。通過多個文件(PHP)連接到mysql數據庫的最有效方法

注意:最近我還在PHP文檔中發現mysql_connect現在是DISCOURAGED,我所有的代碼都使用mysql_connect。是否有足夠的理由來切換?

我想要做的是:

  1. 創建爲database.php。
  2. 要連接到數據庫的PHP頁面將包含此文件,這樣我就不必編寫大量的代碼來連接到數據庫。

那麼這個database.php應該怎麼做,才能最有效率。

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

//從這裏我可以包含這個文件並開始查詢。 - 有效,但我不確定它是否是最好的方法。

2. //database.php 
    $mysqli = new mysqli('localhost', 'user', 'pwd', 'database'); 
    // in other files 
    $mysqli->query("SELECT ...") 
  1. 或者我應該使用持久連接? (該網站是相當數據庫爲重,並有將是大量的頁面生成的,不超過100個用戶同時登錄)

預先感謝您

+0

你在做什麼看起來很好。 – bumperbox

+1

如果使用相同的證書進行連接,則重用連接,因此不需太擔心;但是,是的,你鼓勵儘快從mysql移動路線。 http://php.net/manual/en/mysqlinfo.api.choosing.php – 2012-06-11 03:56:04

+0

@bumperbox它在手冊中說,由於「它已被棄用到PHP 5.5.0,將來會被刪除」,所以依賴你將來如何使用php你可能會遇到問題,如果它被刪除,並且你的主機只有更新版本的php –

回答

6

我只是今天將代碼中的MySQL擴展的所有功能都改爲PDO。

爲了最靈活的,你應該創建「database.php中」有這樣的一般連接:

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

然後在其他頁面上,使用require()包括像這樣的文件:

<?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 
} 

以其他方式,您可以使「index.php」爲核心,然後處理URL或$_GET[]以包含相應的文件(如所有CMS系統,Wordpress等)。

這樣,您可以避免在某些數據(主機,用戶名,密碼和/或數據庫名稱)發生更改時更改代碼量。

關於持續連接,PHP允許它,但也有缺點,你可以在here找到。

+0

here:$ result = $ SQL-> fetch(PDO :: FETCH_ASSOC) 您的意思是$ preparedSQL-> fetch?我沒有看到任何聲明的$ SQL – 40Plot

+0

@stackplasm對不起,我的意思是$ queriedSQL,當我添加準備示例時,我忘記更改變量名稱。我剛剛編輯。 –

3

你應該做的第一件事是創建一個mysql.config.php文件。

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

你應該做的第二件事是建立負責處理所有的數據庫連接信息(模仿這種行爲)一個mysql.class.php文件。只需添加新功能來擴展功能,如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; 
} 
} 
?> 

您需要做的最後一件事就是在您的應用中使用這些文件。

<?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

不贊成將此作爲一個人開始的解決方案。如果你要創建一個對象用於多個文件,那麼將該對象掛接到PDO(或mysqli),但不鼓勵mysql函數。非常非常簡單的修改你的答案可以解決這個問題! – Robbie

+0

同意。我還沒有了解PDO或mysqli,但是如果你決定使用mysql,這是提供一個易於使用的面向對象框架的方法。 –

1

關於PHP編程語言,MySQL是舊數據庫驅動程序,庫MySQLi是改進的驅動程序。 MySQLi利用了MySQL 5的新特性。從php中逐字提取。淨場地:

  • 面向對象的接口
  • 支持預處理語句
  • 支持多個語句
  • 支持交易
  • 增強的調試功能
  • 嵌入式服務器支持 您可以選擇基本上使用mysql,mysqli或PDO。

如果你只是在尋找一個關係數據庫,你需要看看沒有比MySQL更進一步,儘管有很多選項可用。

0

RE:「我應該用持久連接」

號如果你的數據庫是「重」,持續性連接不會真正幫助 - 事實上,他們可能會與留開很長一段時間的PHP腳本阻礙同時處理數據。持續連接只會加快連接到數據庫的時間。您可以在每次腳本運行時節省幾個ms,但除非您仔細編寫,否則將失去更多運行清理功能來釋放鎖定或事務。所以除非你有很多非常短的腳本獲得短而尖的數據庫連接,然後繼續前進,或者數據庫服務器距離網絡服務器還有很長的路要走,否則不要爲此着迷。

在其他答案中已經提出了PDO,所以我標記了它們,因爲它將會是最適合你的。