Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql\u real\u escape\u字符串与php中的单例数据库?_Php_Mysql_Database - Fatal编程技术网

mysql\u real\u escape\u字符串与php中的单例数据库?

mysql\u real\u escape\u字符串与php中的单例数据库?,php,mysql,database,Php,Mysql,Database,我在使用数据库函数的php页面上遇到以下错误: 警告:mysql\u real\u escape\u string() [function.mysql real escape string]:拒绝用户访问 'apache'@'localhost' 我知道我必须与我的数据库建立一个工作连接,但问题是。连接到我的数据库的类如下所示: class Database { private static $instance = null; private static $conn;

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

警告:mysql\u real\u escape\u 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\u real\u escape\u string()函数

谢谢

这是le fix

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

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

用mysqli\u real\u escape\u string(Database::getConnection(),

替换了每一个mysql\u real\u escape\u string(),

我认为问题在于您使用的是
mysql\u real\u escape\u string()

它来自不同于
mysqli
的库,也许这就是为什么没有连接

从:

字符串mysql\u real\u escape\u字符串(字符串$unescaped\u string[,资源 $link_identifier=NULL])

这是第二个参数
$link\u identifier
的定义

MySQL连接。如果未指定链接标识符,则 假设mysql_connect()打开的最后一个链接。如果没有这样的链接 找到时,它将尝试创建一个,就像调用mysql_connect()一样 没有参数。如果找不到或未建立连接,将显示E_警告 将生成级别错误


一个可能的,但有点难看的解决方案,就是在db singleton中mysqli实例上的真正的_escape_string方法中添加一个包装器

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

另一种选择可能是使用mysqli库的过程版本(虽然,我还没有尝试过将两者混合使用,但我认为您可以):
mysqli\u real\u escape\u string

首先是
mysqli的函数调用中缺少了
mysqli
,这意味着没有创建到数据库的连接。使用
new mysqli('localhost'、'root'、'user'、'database')连接到数据库时,您是否遇到任何错误;
是的,这是因为我“审查”了我的真实用户名和密码,并意外地删除了a)。修复了该错误。使用
new mysqli('localhost','root','user','database')连接到数据库时是否出现任何错误?不。奇怪的是:例如,我有一个功能,可以向我的网站注册一个新用户。我可以填写登记表,按下登记按钮,然后得到这些错误的列表。但是当我用phpmyadmin查看我的数据库时,有一个新行,但所有列都是空的。
Mysqli
Mysql
使用不同的连接,这可能是问题所在。当您使用
mysqli
连接到数据库时,您不能使用
mysql\u real\u escape\u string()
。有没有办法改为更改数据库类?我有几十个mysql\u real\u escape\u string()函数,但只有一个连接到数据库的位置。如果不想删除所有mysql\u real\u escape\u string函数,可以尝试将调用更改为
mysqli\u real\u escape\u string
。我还没试过,但那可能管用。只要在呼叫之前建立了连接,就可以进行此操作。可能不是让mysql\u real\u escape\u字符串无处不在的最佳解决方案。但这可能是一个快速解决方案。为了获得更好的解决方案,您可以从mysqli准备的语句中获取一个队列。看看是否可以重构类来使用它。这样,您就可以在查询执行期间将转义字符串功能移动到类中。我可以试着替换所有的mysql文件。。。用mysqli_u2;。。。但是这个函数有两个参数。1个连接和1个要转义的字符串。这需要大量的重构(我们说的可能是几千行代码)。另外,my Database::getInstance()函数不返回连接,它返回一个数据库实例。所以这意味着更多的重构:我刚才遇到这个问题是因为我的网络主机抛出了这个问题,但我的开发环境没有。这一点很好。关于mysqli版本,我没有意识到这一点。也许您可以将代码转换为使用mysql过程函数。它的工作原理基本相同,只是它不是面向对象的。