1

我在使用数据库函数的 php 页面上收到以下错误:

警告:mysql_real_escape_string() [function.mysql-real-escape-string]:用户'apache'@'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;
        }
    }
}

如您所见,我为此使用了单例模式。但即使我放了一个

Database::getInstance();

在我的代码一开始打开连接时,我不断收到此错误。如何正确打开连接以便可以使用 mysql_real_escape_string() 函数?

谢谢。

这是修复

将此函数添加到数据库类:

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

将每一个 mysql_real_escape_string( 替换为 mysqli_real_escape_string(Database::getConnection(),

4

1 回答 1

2

我认为问题在于您正在使用mysql_real_escape_string().

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

mysql_real_escape_stringPHP 手册中的页面

字符串 mysql_real_escape_string ( 字符串 $unescaped_string [, 资源 $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

于 2012-04-21T17:33:03.850 回答