所以,我在使用mysql_real_escape_string
时收到此警告Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'username'@'localhost' (using password: NO) in /home/path/php/functions.php on line 11
网站的其余部分工作正常,连接到数据库和所有,但我在使用此功能时出错。
它在我的localhost测试服务器上完全正常。
有什么想法吗?
我在自己的自制字符串卫生功能中使用上述功能:
function sani($string){
$string = strip_tags($string);
$string = htmlspecialchars($string);
$string = trim(rtrim(ltrim($string)));
$string = mysql_real_escape_string($string);
return $string;
}
我每次查询时都会使用此功能......
function mm_mysqlquery($query) {
if (MM_DEBUG == true) { echo "Query: $query <br>"; mm_log("Query: $query"); } //print query if MM_DEBUG
$link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ("mysql_error: " . mysql_error());
$db_selected = mysql_select_db(DB_NAME);
return mysql_query($query, $link);
}
事先感谢!
答案 0 :(得分:8)
第一点:如果您从mysql_real_escape_string()
收到错误,那是因为您在连接到数据库之前调用了该函数。
看起来您在运行查询之前就已连接到数据库。因此,在致电mm_mysqlquery()
功能之前,您所做的任何事情都无法建立连接。
mysql_real_escape_string()
函数需要与数据库的实时连接,因此它可以针对连接的字符集进行正确的转义。因此,您需要在之前连接。
最好还是这样做,因为如果你在单个PHP请求的过程中进行多次查询,那么连接一次并为所有查询使用相同的连接的开销就会减少。
其次,请不要提出使用addslashes()
的建议 - 它与mysql_real_escape_string()
的做法不同。这两者不可互换。你应养成使用mysql_real_escape_string()
的习惯。
第三,您的sani()
函数显示出一种常见的误解。
function sani($string){
$string = strip_tags($string);
$string = htmlspecialchars($string);
$string = trim(rtrim(ltrim($string)));
$string = mysql_real_escape_string($string);
return $string;
}
常见的误解是你需要所有这些函数才能在SQL语句中使字符串安全。你没有。只需要mysql_real_escape_string()
。此示例中的所有其他函数都不会阻止SQL注入。
如果您在HTML演示文稿中输出字符串并希望降低XSS攻击的风险,那么这些函数很有用,但mysql_real_escape_string()
无关紧要。
在适当的背景下使用每种类型的消毒方法。
答案 1 :(得分:0)
string mysql_real_escape_string(string $ unescaped_string [,resource $ link_identifier])
其中$ unescaped_string是您的字符串,$ link_identifier是您的数据库资源。
MySQL连接。如果链接 标识符未指定,最后一个 mysql_connect()打开的链接是 假定。如果没有找到这样的链接,它 将尝试创建一个好像 没有调用mysql_connect() 参数。如果没有找到连接 或建立,E_WARNING级别 生成错误。