我刚刚在生产服务器上上传我的网站,我得到的错误:
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,你的问题现在解决..享受