所以,我在使用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
"; 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); }
先谢谢!
第一点:如果您收到错误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()
无关紧要.
在适当的上下文中使用每种类型的清理方法.