PHP类-如何只连接到数据库一次
我试着做一个简单的SQL类。 只有一个问题:PHP类-如何只连接到数据库一次,php,class,load,Php,Class,Load,我试着做一个简单的SQL类。 只有一个问题: function __classDBREAD($table, $where, $value, $back) { $link = mysql_connect('127.0.0.1','XXXX','XXXXXX'); mysql_select_db('XXXX', $link); mysql_set_charset('utf8'); $sql = "SELECT * FROM $table WHERE $wh
function __classDBREAD($table, $where, $value, $back)
{
$link = mysql_connect('127.0.0.1','XXXX','XXXXXX');
mysql_select_db('XXXX', $link);
mysql_set_charset('utf8');
$sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
$result = mysql_query($sql, $link) or die(mysql_error());
$row = mysql_fetch_assoc($result);
return $row[$back];
mysql_close($link);
}
现在,如何只连接到SQL一次,并添加诸如“dbUpdate”、“dbInsert”和“dbRead”之类的函数,而不必每次连接到数据库
teamspeak连接也是如此
这里有一个例子:
require_once ("lib/TeamSpeak3/TeamSpeak3.php");
$ts3_VirtualServer = TeamSpeak3::factory("serverquery://XXXXX:XXXX@127.0.0.1:10011/?server_port=XXXX");
$__varTeamspeakClients = $ts3_VirtualServer->clientList();
$__intTeamspeakClientsOnline = $ts3_VirtualServer["virtualserver_clientsonline"] - 1;
$ts3_VirtualServer->request('clientupdate client_nickname='.$this->__classRndString(8));
同样的问题。当我将类包含到页面中时,如何只定义一次连接?首先,您不应该使用mysql函数。它们已弃用,使用起来很危险。但是,夸张地说,你可以使用globals 在函数外部(在全局范围内)定义连接,然后使用
global
为函数提供访问权限。现在,您所要做的就是在所有需要它的函数中包含一个“全局”行
$link = mysql_connect('127.0.0.1','XXXX','XXXXXX');
function __classDBREAD($table, $where, $value, $back)
{
global $link;
mysql_select_db('XXXX', $link);
mysql_set_charset('utf8');
$sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
$result = mysql_query($sql, $link) or die(mysql_error());
$row = mysql_fetch_assoc($result);
return $row[$back];
mysqli_close($link);
}
编辑…
我没有仔细阅读。我看到你在学习一门课,所以globals不是最好的选择。考虑这个…
class mydbclassthing {
private $conn;
public function __construct(){
$this->conn = mysql_connect('127.0.0.1','XXXX','XXXXXX');
}
function __classDBREAD($table, $where, $value, $back)
{
$link = $this->con;
mysql_select_db('XXXX', $link);
mysql_set_charset('utf8');
$sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
$result = mysql_query($sql, $link) or die(mysql_error());
$row = mysql_fetch_assoc($result);
return $row[$back];
mysql_close($link);
}
}
首先,您不应该使用mysql函数。它们已弃用,使用起来很危险。但是,夸张地说,你可以使用globals 在函数外部(在全局范围内)定义连接,然后使用
global
为函数提供访问权限。现在,您所要做的就是在所有需要它的函数中包含一个“全局”行
$link = mysql_connect('127.0.0.1','XXXX','XXXXXX');
function __classDBREAD($table, $where, $value, $back)
{
global $link;
mysql_select_db('XXXX', $link);
mysql_set_charset('utf8');
$sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
$result = mysql_query($sql, $link) or die(mysql_error());
$row = mysql_fetch_assoc($result);
return $row[$back];
mysqli_close($link);
}
编辑…
我没有仔细阅读。我看到你在学习一门课,所以globals不是最好的选择。考虑这个…
class mydbclassthing {
private $conn;
public function __construct(){
$this->conn = mysql_connect('127.0.0.1','XXXX','XXXXXX');
}
function __classDBREAD($table, $where, $value, $back)
{
$link = $this->con;
mysql_select_db('XXXX', $link);
mysql_set_charset('utf8');
$sql = "SELECT * FROM $table WHERE $where = '$value' LIMIT 1";
$result = mysql_query($sql, $link) or die(mysql_error());
$row = mysql_fetch_assoc($result);
return $row[$back];
mysql_close($link);
}
}
正如PHP文档所述,关于持久数据库连接(): 每一个实例都会创建并销毁一个PHP解释器实例 对web服务器的页面请求(对于PHP页面)。因为它是 在每次请求后销毁它获取的任何资源(例如 SQL数据库服务器的链接)在销毁时关闭。在里面 在这种情况下,尝试使用persistent不会带来任何好处 连接——它们根本不存在 如果您希望更高效地重用代码,那么采用面向对象的方法是关键 稍后我可能会考虑一个更好的解决方案,但我要做的是使用类成员存储到SQL的链接,这样就不必每次都创建它们:
class MySQL {
protected $mysql_link;
protected $server = '127.0.0.1'; //and so on...
public function __construct() {
$this->link = mysql_connect($this->server,$this->user,$this->password);
mysql_select_db($this->selected_db, $this->link);
mysql_set_charset('utf8');
}
public function link() {
return $this->link;
}
public function close() {
return mysql_close($this->link);
}
}
现在,在应用程序的其余部分使用OOP(类似于依赖项注入)将非常棒,但如果不是这样,无论如何,您都可以实例化正在创建的类,甚至可以将该对象存储在$\u会话变量中
使用$object->link()将始终返回该实例的链接,而不是每次需要执行任何查询时都创建新的链接,,正如PHP文档中关于持久数据库连接()所述: 每一个实例都会创建并销毁一个PHP解释器实例 对web服务器的页面请求(对于PHP页面)。因为它是 在每次请求后销毁它获取的任何资源(例如 SQL数据库服务器的链接)在销毁时关闭。在里面 在这种情况下,尝试使用persistent不会带来任何好处 连接——它们根本不存在 如果您希望更高效地重用代码,那么采用面向对象的方法是关键 稍后我可能会考虑一个更好的解决方案,但我要做的是使用类成员存储到SQL的链接,这样就不必每次都创建它们:
class MySQL {
protected $mysql_link;
protected $server = '127.0.0.1'; //and so on...
public function __construct() {
$this->link = mysql_connect($this->server,$this->user,$this->password);
mysql_select_db($this->selected_db, $this->link);
mysql_set_charset('utf8');
}
public function link() {
return $this->link;
}
public function close() {
return mysql_close($this->link);
}
}
现在,在应用程序的其余部分使用OOP(类似于依赖项注入)将非常棒,但如果不是这样,无论如何,您都可以实例化正在创建的类,甚至可以将该对象存储在$\u会话变量中
使用$object->link()将始终返回该实例的链接,而不是每次需要执行任何查询时都创建新的链接,,因为每个人都在环中抛出OOP(注意:我将执行PDO,因为我更了解它,但原理是一样的,只需替换连接即可): 需要注意的是,
singleton
模式通常使用最少。通常,最好使用新对象()
,而不为其指定单例。不过,我个人喜欢使用singleton
<强>简单演示-考虑此场景:>P/>
<?php
// Here is an example of the singlton with an echo
// which shows that the class is returning itself
// like a global
class DatabaseConnection
{
private static $singleton;
public function __construct()
{
// If your singleton is not set
if(!isset(self::$singleton)) {
echo 'NEW Object'.PHP_EOL;
// assign it this class
self::$singleton = $this;
}
else
echo 'SAME Object'.PHP_EOL;
// return this class
return self::$singleton;
}
}
function ReturnConnection()
{
return new DatabaseConnection();
}
class TestClass
{
public function __construct()
{
new DatabaseConnection();
}
}
function query($sql=false)
{
return ReturnConnection();
}
// The connection class wrapped in a function
$a = ReturnConnection();
// The function nested inside a class
$b = new TestClass();
// The function nested inside another function
$c = query();
由于每个人都在将OOP抛入环中(注意:我将进行PDO,因为我更了解它,但原理相同,只需替换连接):
需要注意的是,singleton
模式通常使用最少。通常,最好使用新对象()
,而不为其指定单例。不过,我个人喜欢使用singleton
<强>简单演示-考虑此场景:>P/>
<?php
// Here is an example of the singlton with an echo
// which shows that the class is returning itself
// like a global
class DatabaseConnection
{
private static $singleton;
public function __construct()
{
// If your singleton is not set
if(!isset(self::$singleton)) {
echo 'NEW Object'.PHP_EOL;
// assign it this class
self::$singleton = $this;
}
else
echo 'SAME Object'.PHP_EOL;
// return this class
return self::$singleton;
}
}
function ReturnConnection()
{
return new DatabaseConnection();
}
class TestClass
{
public function __construct()
{
new DatabaseConnection();
}
}
function query($sql=false)
{
return ReturnConnection();
}
// The connection class wrapped in a function
$a = ReturnConnection();
// The function nested inside a class
$b = new TestClass();
// The function nested inside another function
$c = query();
一方面,你不能把mysqli\u混为一谈mysqli\u关闭($link)
使用你的mysql\u
函数。不要mysqli\u关闭($link)代码>这样您就不必打开它了again@Fred-我修正了它。如果你熟悉OOP,请查看一个singleton
模式。看看你是否对此感兴趣(不过如果实现了,就不要使用太多…)。好吧,我想保留这个。那么,有没有办法连接到函数外部的DB并调用更新/选择/插入到函数中呢?首先,你不能将mysqli\u
beingmysqli\u close($link)
使用你的mysql\u
函数。不要mysqli\u关闭($link)代码>这样您就不必打开它了again@Fred-我修正了它。如果你熟悉OOP,请查看一个singleton
模式。看看你是否对此感兴趣(不过如果实现了,就不要使用太多…)。好吧,我想保留这个。那么,有没有办法连接到函数外部的DB并调用它来更新/选择/插入到函数中?嗯,是的,如果你想重新编写库,我想会的。我对那个图书馆不熟悉,所以我不能告诉你最好的处理方法。你会吗