PHP在类外的函数中重用MySQL对象
我使用下面的这个类来连接我的sql数据库。一切都很好,但我认为我没有正确使用它。当一个页面加载到我的网站上时,会调用一些函数来显示文本、赞助商。。。每个函数创建一个mysql对象。错了吗??它是否会造成连接过多的问题?我应该创建一个对象并为函数传递一个参数吗??或者有没有办法使这个对象成为全局对象PHP在类外的函数中重用MySQL对象,php,mysql,class,Php,Mysql,Class,我使用下面的这个类来连接我的sql数据库。一切都很好,但我认为我没有正确使用它。当一个页面加载到我的网站上时,会调用一些函数来显示文本、赞助商。。。每个函数创建一个mysql对象。错了吗??它是否会造成连接过多的问题?我应该创建一个对象并为函数传递一个参数吗??或者有没有办法使这个对象成为全局对象 class clsMysql { var $con; var $last_id; function __construct($db = array()) {
class clsMysql
{
var $con;
var $last_id;
function __construct($db = array())
{
$this->con = mysql_connect($db['host'], $db['user'], $db['pass'], true, MYSQL_CLIENT_INTERACTIVE) or die ('Error connecting to MySQL');
mysql_select_db($db['db'], $this->con) or die('Database ' . $db['db'] . ' does not exist!');
}
function __destruct() {
mysql_close($this->con);
}
// fonction qui exécute la requête SQL
function fxQuery($sql) {
return mysql_query($sql, $this->con);
}
// fonction qui retourne la variable du résultat de la requête SQL
function fxGetVar($sql) {
return $this->fxFetchArray(0, $sql);
}
// fonction qui retourne un tableau contenant la ligne unique du résultat de la requête SQL
function fxGetRow($sql) {
return $this->fxFetchArray(1, $sql);
}
// fonction qui retourne un tableau contenant le résultat de la requête SQL
function fxGetResults($sql) {
return $this->fxFetchArray(2, $sql);
}
// fonction qui met la requête dans un tableau
function fxFetchArray($p, $sql)
{
$qry = $this->fxQuery($sql);
$nb = mysql_num_rows($qry);
$this->last_id = mysql_insert_id($this->con);
if ($nb > 0)
{
switch ($p)
{
// fxGetVar
case 0:
$rec = mysql_fetch_array($qry, MYSQL_NUM);
$mem_results = $rec[0];
break;
// fxGetRow
case 1:
$rec = mysql_fetch_array($qry, MYSQL_ASSOC);
foreach (array_keys($rec) as $field)
$mem_results[$field] = $rec[$field];
break;
// fxGetResults
case 2:
$ctr = 1;
while ($rec = mysql_fetch_array($qry, MYSQL_ASSOC))
{
foreach (array_keys($rec) as $field)
$mem_results[$ctr][$field] = $rec[$field];
$ctr++;
}
}
return $mem_results;
}
else
return null;
}
//fonction pour échapper les caractères pour les variables post ou get
//param: valeur
//retourne la valeur échappée
function fxEscape($values)
{
if (is_array($values))
$values = array_map(array($this, 'fxEscape'), $values);
else
{
// Stripslashes
if (get_magic_quotes_gpc())
$values = stripslashes($values);
if ((int)ini_get('magic_quotes_sybase'))
$values = str_replace("''", "'", $values);
$values = mysql_real_escape_string($values, $this->con);
}
return $values;
}
function fxGetLastId() {
return $this->last_id;
}
}
您应该能够实例化一次对象,并多次调用查询方法。它应该防止它为每个查询建立连接
$mysql = new clsMysql();
$mysql->fxQuery("select * from something");
$mysql->fxQuery("Another Query");
$mysql->fxQuery("Yet another query...");
以一种简单的方式:
// on the top of your code
$db = new clsMysql();
然后,在类方法或函数中:
// class
class abc {
public function xyz () {
global $db; // make it global here
// use it!
}
}
另一方面,更多OOP:
// main class
class system {
// variable to the store database object
public $db;
// constructor
public function __constructor() {
include('mysql.class.php'); // your mysql class file
$this->db = new clsMysql();
}
}
在其他类上,您可以扩展
类系统
// sample class
class sample extends system {
// sample function
public function sample_method() {
$this->db->fxQuery('SELECT * FROM table');
}
在课堂之外:
$app = new system();
$result = $app->db->fxQuery('SELECT 1');
添加
$GLOBALS['db']=new clsMysql()
在主脚本的顶部,并在所有函数中使用$GLOBALS['db']
。谢谢,这解决了我的问题