我尝试做一个简单的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 $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"answers";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));
同样的问题。当我将Class包含到页面中时,如何只定义一次连接?
既然每个人都把他们的OOP扔进了环(注意:我要做PDO,因为我更了解它,但原理是一样的,只是替换连接):
<?php
class DatabaseConnection
{
# Create a singleton to store the connection for reuse
private static $singleton,
$con;
# save connection to singleton and return itself (the full object)
public function __construct()
{
# If your singleton is not set
if(!isset(self::$singleton))
# assign it this class
self::$singleton = $this;
# return this class
return self::$singleton;
}
# This is a connection method because your __construct
# is not able to return the $pdo connection
public function connection($host='hostname',$username='username',$password='password',$database='database')
{
# In the connection, you can assign the PDO to a static
# variable to send it back if it's already set
if(self::$con instanceof 'PDO)
return self::$con;
# If not already a PDO connection, try and make one
try {
# PDO settings you can apply at connection time
$opts = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,PDO::ATTR_EMULATE_PREPARES => false);
# Assign your PDO Conneciton here.
self::$con = new PDO("mysql:host={$host};dbname={$database}",$username,$password,$opts);
# Return the connection
return self::$con;
}
catch (PDOException $e){
exit('Database error');
}
}
}
你可以在任何地方使用它,在你的函数,类,你的名字之外。它每次都会返回相同的连接。如果您使用带有自动加载功能的spl_autoload_register()
,您将全部设置好,甚至不必每次都显式地使用require_once()
!
<?php
require_once('class.DatabaseConnection.php');
// Instantiate connection class
$pdo = new DatabaseConnection();
// Assign the connection to $con (or whatever variable you like)
$con = $pdo->connection();
需要注意的是,singleton
模式通常很少使用。通常最好使用new Objects()
,而不给它分配singleton
。不过,我个人更喜欢singleton
。
简单演示-考虑以下场景:
<?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();
上述singleton
的使用将产生:
NEW Object
SAME Object
SAME Object
首先,您根本不应该使用mysql_*函数。它们已被弃用,使用起来很危险。但是,假设您可以使用全局变量。
定义函数外部的连接(在全局作用域中),然后使用global
给函数访问它的权限。现在你所要做的就是在所有需要它的函数中包含这一行"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);
}
编辑…
我没有仔细读这篇文章。我看到你正在处理一个类,所以全局变量不是最好的选择。考虑这个. .
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文档中关于持久数据库连接的说明(http://php.net/manual/en/features.persistent-connections.php):
)为每个PHP解释器创建和销毁一个实例页面请求(PHP页面)到您的web服务器。因为它是在每次请求之后销毁,它获得的任何资源(例如(到SQL数据库服务器的链接)在它被销毁时关闭。在在这种情况下,您不会从尝试使用持久化中获得任何好处连接——它们根本不存在。
如果你想更有效地重用代码,使用面向对象的方式是关键。
我以后可能会考虑一个更好的解决方案,但我要做的是使用类成员来存储到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(类似于依赖注入)将是非常棒的,但如果没有,无论如何,您始终可以实例化您正在创建的类,甚至将该对象存储在$_SESSION变量中。
使用$object->link()将始终返回该实例的链接,而不是每次需要执行任何查询时创建新的链接,