在php中使用singleton数据库的mysql_real_escape_string?

时间:2012-04-21 17:20:55

标签: php mysql database

我在使用数据库功能的php页面上出现以下错误:

  

警告:mysql_real_escape_string()   [function.mysql-real-escape-string]:拒绝用户访问   '阿帕奇' @ 'localhost' 的

我知道我必须与我的数据库有一个有效的连接,但这里是'问题'。连接到我的数据库的类如下所示:

class Database
{
    private static $instance = null;
    private static $conn;

    private function __construct()
    {
        try {
            self::$conn = new mysqli('localhost', 'root', 'user', 'database');
        } catch (Exception $ex) {
            $errorpager = new CustomPageGenerator();
            $errorpager->generateErrorPage("Connection to database failed. Please try again later.");
        }
    }

    public static function getInstance()
    {
        try {
            if (self::$instance == null) {
                self::$instance = new Database();
            }
            return self::$instance;
        } catch (Exception $ex) {
            $errorpager = new CustomPageGenerator();
            $errorpager->generateErrorPage("Connection to database failed. Please try again later.");
            return false;
        }
    }

    public function query($sql)
    {
        try {
            return self::$conn->query($sql);
        } catch (Exception $ex) {
            $errorpager = new CustomPageGenerator();
            $errorpager->generateErrorPage("Connection to database failed. Please try again later.");
            return false;
        }
    }
}

如您所见,我使用Singleton模式。但即使我放了一个

Database::getInstance();

在我的代码的最开头打开连接我一直收到这个错误。如何正确打开连接以便我可以使用mysql_real_escape_string()函数?

感谢。

这是le fix

将此功能添加到Database类:

public static function getConnection()
{
    self::getInstance();
    return self::$conn;
}

替换每一个mysql_real_escape_string(使用mysqli_real_escape_string(Database :: getConnection(),

1 个答案:

答案 0 :(得分:2)

我认为问题在于您使用的是mysql_real_escape_string()

这是来自与mysqli不同的库,也许这就是没有连接的原因?

来自mysql_real_escape_string page in the PHP manual

  

string mysql_real_escape_string(string $ unescaped_string [,resource   $ link_identifier = NULL])

这是第二个参数$link_identifier的定义。

  

MySQL连接。如果未指定链接标识符,则   假设mysql_connect()打开的最后一个链接。如果没有这样的链接   发现,它会尝试创建一个,就像调用mysql_connect()一样   没有争论。如果未找到或建立连接,则为E_WARNING   生成级别错误。


一种可能的,但有点丑陋的解决方案是,只需在db单例中的mysqli实例上的real_escape_string方法中添加一个包装器。

public function escapeString($value){
    return $this->conn->real_escape_string($value);
}

另一个替代方案可能是使用mysqli库的程序版本(尽管我实际上并没有尝试过看看你是否可以混合两者,但我认为你可以):mysqli_real_escape_string