mysql\u real\u escape\u字符串与php中的单例数据库?
我在使用数据库函数的php页面上遇到以下错误: 警告:mysql\u real\u escape\u string() [function.mysql real escape string]:拒绝用户访问 'apache'@'localhost' 我知道我必须与我的数据库建立一个工作连接,但问题是。连接到我的数据库的类如下所示: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;
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过程函数。它的工作原理基本相同,只是它不是面向对象的。