1

我在下面使用这个类来连接到我的 sql db。一切都很好,但我认为我没有以正确的方式使用它。当我的网站上加载一个页面时,会调用一些函数来显示文本、赞助商......并且每个函数都会创建一个 mysql 对象。这是错的吗??它会产生过多的连接问题吗?我应该创建一个对象并将其传递给函数的参数吗?或者有没有办法让这个对象成为全球性的?

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;
    }
}
4

2 回答 2

2

您应该能够实例化对象一次并多次调用查询方法。它应该防止它为每个查询建立连接。

$mysql = new clsMysql();

$mysql->fxQuery("select * from something");

$mysql->fxQuery("Another Query");

$mysql->fxQuery("Yet another query...");
于 2012-10-02T02:15:25.647 回答
0

以一种简单的方式:

// 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();
    }

}

在其他课程上,您可以extend上课system

// 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');
于 2012-10-02T05:53:52.403 回答