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个用户同时登录)

先感谢您

4

5 回答 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 允许这样做,但您可以在此处找到一些缺点。

于 2012-06-11T04:12:47.837 回答
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();
}
?>
于 2012-06-11T04:01:26.880 回答
1

由于该站点的数据库很重,我建议您使用 PDO 进行数据库连接。还使用事务进行多个查询,以减少 PHP-MySQL 流量。

详细信息:http ://www.phpro.org/tutorials/Introduction-to-PHP-PDO.html

于 2012-06-11T04:02:03.340 回答
1

相对于 PHP 编程语言,MySQL 是旧的数据库驱动程序,而 MySQLi 是改进的驱动程序。MySQLi 利用 MySQL 5 的新功能。从 php.net 站点逐字删除:

  • 面向对象的接口
  • 支持准备好的报表
  • 支持多个语句
  • 交易支持
  • 增强的调试功能
  • 嵌入式服务器支持 您可以选择使用 mysql、mysqli 或 PDO。

如果您只是在寻找一个关系数据库,那么您只需要查看 MySQL,尽管有很多可用的选项。

于 2012-06-11T04:04:04.660 回答
0

RE: "should I use persistent connection"

No. If your database is "heavy", persistant connections won't really help - in fact, they may hinder with PHP scripts that stay open a long time while processing data. Persistent connections only speed up the time to connect to the database IN SOME CIRCUMSTANCES only. You MAY be able to save a few ms per script run, but you'll lose more running clean up functions to release locks or transactions unless you write carefully. So unless you have lots of very, very short scripts getting short, sharp db connections and then moving on, or the DB server is a long way from the web server, don't sweat on this point.

PDO has been suggested in other answers, so I've marked them up as it's going to be the best for you.

于 2012-06-11T04:15:05.600 回答