如何限制从其他类访问mysql连接?

时间:2012-01-13 22:34:43

标签: php mysql

燮!我们有mysql连接的核心类,而不是包含插件,我们需要插件无法访问我们的DB而没有核心类方法。

的index.php

<?php
    class Core
    {
        function connect()
        {
            $db = @mysql_connect($host, $user, $pass);
            @mysql_select_db($base, $db);
        }

        function query($sql)
        {
            return mysql_query($sql);
        }
    }

    global $c;
    $c = new Core();

    include('plugin.php');
    $p = new Plugin();
    echo $p->not_work_connection();
    echo $p->work_connection();
?>

plugin.php

<?php
    class Plugin
    {
        function not_work_connection()
        {
            $sql = 'SELECT * FROM `net_country` LIMIT 0 , 1';
            $result = mysql_query($sql); 
            while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
            {
                return print_r($row, 1);
            }
        }

        function work_connection()
        {
        global $c;
            $result =$c->query('SELECT * FROM `net_country` LIMIT 0 , 1'); 
            while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
            {
                return print_r($row, 1); 
            }
        }
    }
?>

我需要从包含的脚本中限制访问,但是可以使用核心方法进行查询。我怎么能成功呢?

3 个答案:

答案 0 :(得分:4)

没有第二个参数的mysql_query使用mysql_connect使用的最后一个链接,所以你可以在真正的连接之后创建一个虚拟连接:

<?php
class Core
{
    private $db;
    function connect()
    {
        $this->db = @mysql_connect($host, $user, $pass);
        @mysql_select_db($base, $db);

        //dummy 
        @mysql_connect();
    }

    function query($sql)
    {
        //notice second param
        return mysql_query($sql, $this->db);
    }
}

global $c;
$c = new Core();

include('plugin.php');
$p = new Plugin();
echo $p->not_work_connection(); //doing a mysql_query will use the dummy resource and fail
echo $p->work_connection();
?>

答案 1 :(得分:3)

为每个类创建在数据库上单独连接到单独的用户并在例如Plugin类中保持对此连接的处理,并使用数据库库对此句柄进行操作。我认为这是一个很好的解决方案。

当然,您要为用户设置权限。 (每个类或一组类的单独用户)

答案 2 :(得分:3)

不太确定这是否有帮助,但我通常做的是有一个用于sql连接的类,另一个用于我将操作的特定表(保存,更新,加载,删除函数)

然后在我的索引或任何页面中执行以下操作:

include_once("class/sql.php")
$db = new DB();
include_once("class/table.php")
$table = new TableClass();

$result =$db->query($table->load(parameters)); 
        while($row = mysql_fetch_array($result)) 
        {
            return print_r($row, 1); 
        }

这样的事情只是简短但希望它有所帮助。