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

Tam*_*nik 4 php mysql apache warnings function

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

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
Run Code Online (Sandbox Code Playgroud)

函数的代码是

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

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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

我的apache虚拟主机配置

<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>
Run Code Online (Sandbox Code Playgroud)

编辑2

好吧问题是我在mysql服务器上没有任何www-data用户.所以我刚刚添加了用户www-data,没有密码,也没有mysql的权限,这个工作正常.我将在未来尝试使用PDO引用,正如许多人提到的那样.谢谢大家试图帮助我.

dec*_*eze 11

您要么使用PDO,要么使用mysql扩展,不要同时使用两者.mysql_real_escape_string是mysql扩展的一个功能.它需要连接到数据库才能运行.在调用它时,它会尝试建立连接,如果您之前没有建立连接mysql_connect,则需要估计所需的登录凭据.在您的本地计算机上,您显然没有密码保护,并且MySQL用户的帐户名称与Web服务器运行的名称相同,因此它很幸运.在生产系统上,凭据不同,无法建立连接.

停止使用mysql_real_escape_stringPDO.使用PDO的字符串引用函数,或者更好地使用准备和参数化查询以及bind您的值.

  • 请注意,这肯定**不是解决方案**!如果您使用 PDO,请不要使用 `mysql_real_escape_string`!时期! (2认同)