跨多个文件连接MySQL数据库的最有效方法(PHP)

7
有很多方法可以实现相同的结果,我想知道初始化mysql连接的最有效方法是什么。
注意:最近我在PHP文档中发现mysql_connect现已不推荐使用,而我所有的代码目前都在使用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个用户同时登录)

谢谢您的提前帮助。


你所做的看起来很好。 - bumperbox
1
如果使用相同的凭据进行连接,则将重用连接,因此没有太多需要担心的事情;但是,您鼓励尽快从MySQL迁移。http://php.net/manual/en/mysqlinfo.api.choosing.php - user557846
@bumperbox 在手册中写道:“自 PHP 5.5.0 起,它已被弃用,并将在未来删除”,因此取决于您将来如何使用 php,如果它被删除且您的主机只有较新版本的 php,则可能会遇到问题。 - Aaron Rabinowitz
是的,这个问题很老了。现在(进入2016年),在处理MySQL时,绝对应该使用PDO。 - 40pro
他们真的需要更加突出问题被提问/回答的时间,因为随着时间的推移,必然会有很多过时的功能。 - bumperbox
根据你的需求,你应该使用mysqli或pdo。对我们来说,转移到mysqli更加简洁和简单。重要的是要避免绝对规则,因为它们通常是错误的(比如说,必须做x,而y是完全有效的选择)或者可能导致代码中的其他意外问题。 - Lizardx
5个回答

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允许,但是有缺点,您可以在这里找到。

这里:$result = $SQL->fetch(PDO::FETCH_ASSOC)你是不是想说 $preparedSQL->fetch?我没有看到任何地方声明了 $SQL。 - 40pro
@stackplasm 抱歉,我的意思是$queriedSQL,当我添加准备示例时,我忘记更改变量名称了。我刚刚编辑了。 - Fong-Wan Chau

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
同意。我还没有学习过PDO或mysqli,但如果您决定使用mysql,这是一种提供易于使用的面向对象框架的方法。 - Andrew

1

1
关于PHP编程语言,MySQL是旧的数据库驱动程序,而MySQLi是改进的驱动程序。 MySQLi利用了MySQL 5的新功能。以下内容摘自php.net网站:
  • 面向对象的接口
  • 支持预处理语句
  • 支持多个语句
  • 支持事务
  • 增强的调试能力
  • 嵌入式服务器支持
  • 您可以选择使用mysql、mysqli或PDO。
    如果您只是寻找关系型数据库,那么您无需再寻找其他选项,MySQL就足够了。

0

回复:"我应该使用持久连接吗"

不需要。如果你的数据库很重,持久连接并不能真正帮助提升性能,事实上,它们可能会影响那些需要长时间处理数据的PHP脚本。只有在某些情况下,持久连接才会加快与数据库连接的时间。在运行脚本时,你可以稍微节省几毫秒的时间,但是除非你小心编写代码以释放锁定或事务,否则你将会丢失更多的时间来清理函数。所以,除非你有许多非常短的脚本需要短暂的数据库连接,然后进行移动操作,或者DB服务器与Web服务器相距甚远,否则不必过分关注这一点。

其他答案中已经建议使用PDO,因此我标记了它们,因为它对你来说将是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接