大家好,我正在思考在mysql数据库中对多个表进行查询的最佳方法。我是否应该为每个不同的.php页面创建一个新的mysqli对象($mysqli = new mysqli("localhost", "root", "root", "db");)?
还是有一种方式可以在我的网站中所有php文件上重用这个对象?有什么建议吗?
class dbconn {
protected $database;
function __construct(){
$this->connect();
}
protected function connect() {
$this->database = mysql_connect('host', 'user', 'pass') or die("<p>Error connecting to the database<br /><strong>" . mysql_error() ."</strong></p>" );
mysql_select_db('databasename') or die("<p>Error selecting the database<br />" . mysql_error() . "</strong></p>");
}
function __destruct(){
mysql_close($this->database);
}
function db(){
if (!isset($this->database)) {
$this->connect();
}
return $this->database;
}
}
你需要为每个页面创建连接,因为每个 PHP 脚本的生命周期都是请求的时间。
但是,你可以将连接代码放在一个文件中,然后从所有页面中 include
它。
mysql_free_result()
。这些问题并不是在每个使用DB的地方都出现,而是在某些特定的地方。添加了mysql_free_result()
之后,这些问题就消失了。 - binaryLVconnect.php
文件,验证它被你的应用程序包含,并创建一个数据库连接。这取决于网站的结构。如果您有:
<a herf='login.php'>login</a>
<a herf='register.php'>register</a>
<a herf='about.php'>about</a>
...然后你需要在每个PHP文件中连接,例如在login.php
、register.php
和about.php
中。为了使它更容易,我会创建一个包含用户名/密码的config.php
文件,或者像Shad说的那样。
你可能也有一个包含以下内容的index.php
文件:
if ( !isset($_GET['module']) ) {
$_GET['module'] = 'about';
}
switch ( $_GET['module'] ) {
default:
case 'about':
include 'about.php';
break;
case 'login':
include 'login.php';
break;
case 'register':
include 'register.php';
break;
}
还有HTML代码:
<a herf='?module=login'>login</a>
<a herf='?module=register'>register</a>
<a herf='?module=about'>about</a>
index.php
中连接,然后将连接传递给所有其他相关文件。
对我来说,第二种方法似乎更常见,即更直观、更方便,这也是我经常使用的。
我相信,在某些情况下,使用持久连接并在需要时保留/释放连接(无论是为事务还是单个查询)可能是值得的(从性能角度考虑)。例如,我现在正在使用的简单系统需要70ms-100ms才能生成,而执行SQL查询只需要40ms-50ms。如果采用“单一连接”方法,这意味着连接在大约50%的时间内被浪费,而使用持久连接的“保留/释放连接”方法则不会有这样的问题。
还有一件事——我建议您创建一些包装器,即一些DBConnection
类,它在构造函数中连接到数据库,并具有像select()
(返回数据数组)、selectValue()
(返回单个值,例如$db->selectValue('select count(*) from user')
将返回(int)$numberOfUsers
)、一些插入和更新的exec()
等方法。
index.php
文件),或者像我给出的第一个代码片段那样(在这种情况下,他需要一种从代码中的许多地方创建连接的方法,因为可能没有通用的初始化脚本)。 - binaryLV
display_errors
设置为false
,则在错误时不应该回显任何内容,这在生产服务器上是必须的。并且,应该将该信息记录下来,而不是通过添加@
前缀或类似方式默默忽略它,因为可能还涉及其他(意外的)错误,例如Fatal error: Call to undefined function mysql_connect
。我曾经在PHP/Oracle中遇到过这种情况 - 在迁移到新服务器后,花了一些时间才找出为什么看不到输出和没有错误记录。但由于用户/密码是由用户输入的,所以必须保留该@
前缀... - binaryLVdisplay_errors
并且不会使用die
。所采取的行动不应该取决于display_errors
的值 - 它只是一个配置值,指定是否打印错误消息 - 对于开发来说不可替代,对于生产来说致命。而die
不是一个好的结果,因为它不是dbconn
应该决定用户是否应该看到错误消息或执行脚本是否应该静默停止。使用dbconn
类的代码必须决定它。 - binaryLV$dbc
是对象属性,而不是类属性。对于新对象,它的值最初为NULL
。 - binaryLV