4

我刚刚将我的网站上传到生产服务器上,但出现错误:

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 或 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

我的 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>

编辑 2

好的,问题是我在 mysql 服务器上没有任何 www-data 用户。所以我只是在mysql中添加了没有密码且没有权限的用户www-data,这工作正常。我将在未来尝试使用许多提到的 PDO 引用。感谢所有试图帮助我的人。

4

5 回答 5

11

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

停止使用mysql_real_escape_stringPDO。要么使用 PDO 的字符串引用函数,要么更好地使用准备好的和参数化的查询和bind你的值

于 2013-08-22T12:44:27.017 回答
3

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

于 2013-08-22T12:30:48.337 回答
1

我在尝试在 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;
  }
}
于 2015-02-25T17:59:11.800 回答
1

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

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

于 2016-07-21T09:11:36.257 回答
-14

请注意,这个答案很糟糕,并且会让您面临安全漏洞。这是错误的解决方案。不要这样做。进一步查看问题的实际解决方案。这个答案被接受的事实只是意味着两个人不知道他们在做什么。

这是因为您的 mysql 数据库中没有 www-data!

您可以通过 phpmyadmin 添加 www-data 用户并赋予该用户任何权限,它应该可以工作

于 2013-09-11T13:56:01.453 回答