2012-06-11 38 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,所以我标记了它们,因为它将会是最适合你的。