PHP的mysql_real_escape_string():访问被拒绝的用户www-data'@'localhost'

我刚刚在生产服务器上上传我的网站,我得到的错误:

Warning: mysql_real_escape_string(): Access denied for user 'www-data'@'localhost' (using password: NO) in file.php on line 106 Warning: mysql_real_escape_string(): A link to the server could not be established in file.php on line 106 

该函数的代码是

 include('./../inc/conn.php'); if(isset($_GET['query']))$q = clean($_GET['query']); function clean($var){ return(mysql_real_escape_string($var)); } 

inc / conn.php的代码:

 try { $dns = 'mysql:host=localhost;dbname=mydatabase'; $user = 'root'; $pw = 'rootpw'; $options = array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION ); $db = new PDO( $dns, $user, $pw, $options ); } catch ( Exception $e ) { echo "Connection error : ", $e->getMessage(); die(); } 

我真的不知道发生了什么,因为我在本地开发Ubuntu的服务器上没有问题。 Mysql,apache和php版本是一样的。 唯一的是我在apache prod服务器上使用虚拟主机。 不知道发生了什么…有什么我错过了在Apache或PHPconfiguration之一?

编辑这里是我的文件夹的权利:

 sudo ls -l /home/user/public/domain.com/www/ total 28 drwxrwxr-x 13 user www-data 4096 Aug 22 12:30 adodb5 drwxrwxr-x 2 user www-data 4096 Aug 22 12:30 ajax drwxrwxr-x 2 user www-data 4096 Aug 22 12:31 css drwxrwxr-x 9 user www-data 4096 Aug 22 12:33 gfx drwxrwxr-x 2 user www-data 4096 Aug 22 12:33 inc drwxrwxr-x 2 user www-data 4096 Aug 22 12:34 js 

我的apache虚拟主机configuration

 <VirtualHost *:80> # Admin email, Server Name (domain name), and any aliases ServerAdmin contact@domain.com ServerName www.domain.com ServerAlias domain.com # Index file and Document Root (where the public files are located) DirectoryIndex index.html index.php DocumentRoot /home/user/public/domain.com/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /home/user/public/domain.com/www> Options FollowSymLinks AllowOverride All Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> # Log file locations LogLevel warn ErrorLog /home/user/public/domain.com/log/error.log CustomLog /home/user/public/domain.com/log/access.log combined </VirtualHost> 

编辑2

好,所以问题是我没有在MySQL服务器上的任何www数据用户。 所以我只是添加用户www数据没有密码,没有在mysql中的特权,这是工作正常。 我将会在未来尝试使用PDO报价。 感谢大家试图帮助我。

请注意,这个答案是可怕的,并为您解决安全漏洞。 这是错误的解决方案。 不要这样做。 进一步了解问题的实际解决方案。 这个答案被接受的事实只是意味着两个人不知道他们在做什么。

这是因为你的mysql数据库里没有www-data。

您可以通过phpmyadmin添加www-data用户,并给予该用户没有权限,它应该工作

您要么使用PDO,要么使用mysql扩展名,不要同时使用两者。 mysql_real_escape_string是mysql扩展的一个函数。 它需要连接到数据库才能正常工作。 当调用它的时候,它会尝试建立一个连接,如果你以前没有使用mysql_connect建立一个mysql_connect ,那么估计所需的登录凭证。 在你的本地机器上,你显然没有密码保护,而且MySQL用户的帐户名和Web服务器运行的名字是一样的,所以这真的很幸运。 在生产系统上,证书是不同的,它不能建立连接。

停止使用带有PDO的mysql_real_escape_string 。 请使用PDO的字符串引用函数,或者更好地使用准备和参数化的查询并bind您的值 。

mysql_real_escape_string需要一个有效的链接标识符(由mysql_connect()返回),请参阅http://php.net/manual/en/function.mysql-real-escape-string.php

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

您的连接由PDO打开,因此您没有任何有效的mysql_real_escape_string链接标识符。

尝试使用PDO::quote

当我尝试在Wordpress后端修改用户搜索时遇到了同样的问题,缺少一个适当的数据库连接(也不建议使用mysql_real_escape_string())。 全局变量在wp-config.php中定义。

这是工作功能。 注意$ con变量。 更多解释可在这里 。

 if(is_admin()) { add_action( 'pre_user_query', 'user_search_by_email' ); function user_search_by_email($wp_user_query) { if(false === strpos($wp_user_query->query_where, '@') && !empty($_GET["s"])) { $con = mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME); $wp_user_query->query_where = str_replace( "user_nicename LIKE '%".mysqli_real_escape_string($con, $_GET["s"])."%'", "user_nicename LIKE '%".mysqli_real_escape_string($con, $_GET["s"])."%' OR user_email LIKE '%".mysqli_real_escape_string($con, $_GET["s"])."%'", $wp_user_query->query_where); mysqli_close($con); } return $wp_user_query; } } 

当数据库连接设置为mysqli时,通常会出现此问题,要解决此问题并使用mysql_real_escape_string()(即使设置了mysqli)。 只要去php.ini找到:mysql.default_user参数,并将值设置为您的默认用户,例如:mysql.default_user = root

并重新启动Apache,你的问题现在解决..享受