1

所以,我在使用 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

该网站的其余部分工作正常,连接到数据库和所有,但使用此功能时出现错误。

它在我的本地主机测试服务器上运行良好。

有任何想法吗?

我在自己的自制字符串清理功能中使用了上述功能:

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);
}

预先感谢!

4

2 回答 2

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()就无关紧要了。

在适当的环境中使用每种类型的消毒方法。

于 2010-10-12T04:25:09.553 回答
0

字符串 mysql_real_escape_string ( 字符串 $unescaped_string [, 资源 $link_identifier ] )

其中 $unescaped_string 是您的字符串, $link_identifier 是您的数据库资源。

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

PHP.NET mysql_real_escape_string 资源

于 2010-10-12T14:24:41.453 回答