当我将代码移动到另一台服务器时,mysql_real_escape_string停止工作

时间:2012-01-10 18:35:30

标签: php mysql mysql-real-escape-string

以下代码在我的本地xampp安装(Windows 7)中运行得非常好,但是当我将其移植到Win2K8 R2服务器时,mysql_real_escape_string部分不起作用。当我评论它时,它工作正常。我很确定这与php.ini文件有关,但无法确定它是什么。也许我的代码应该以不同的方式编写。

function add_asset($asset_type_ID, $org_ID, $asset_desc, $asset_cost, $asset_value, $purchase_date) {
    global $db;
    $asset_desc = mysql_real_escape_string($asset_desc);
    $query = "INSERT INTO assets
                 (asset_ID, asset_type_ID, org_ID, asset_desc, asset_cost, asset_value, purchase_date)
              VALUES
                 (DEFAULT, '$asset_type_ID', '$org_ID', '$asset_desc', '$asset_cost', '$asset_value', '$purchase_date')";
    $add_asset = $db->exec($query);
    $last_asset_ID = $db->lastInsertId();
    return $last_asset_ID;

具体来说,当记录输入mysql时,asset_desc字段为空。

谢谢!

更新:浏览完PHP错误日志后,我发现了以下内容:

  

[function.mysql-real-escape-string]:用户''@ localhost'拒绝访问(使用密码:否)

4 个答案:

答案 0 :(得分:1)

你可能会想到"魔术引号"

http://php.net/manual/en/security.magicquotes.disabling.php

答案 1 :(得分:1)

看起来您在开发系统上连接到数据库时使用的任何凭据都在服务器上失败。

mysql_real_escape_string()需要有效的MySQL连接才能正常工作;如果您没有连接到数据库,它将失败。

  • 检查您所拨打的代码中的mysql_connect();从错误消息中,您的开发系统似乎依赖于runtime default values for the Mysql extension

  • 或者,服务器系统上的mysql_real_escape_string()可能无法访问连接资源。来自the documentation for mysql_real_escape_string()(强调我的):

      

    link_identifier

         

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

    也许你的dev服务器可能配置成调用mysql_connect()没有参数确实建立了与MySQL数据库服务器的连接。最可能的原因是dev MySQL服务器允许匿名连接,或者php.ini指定有效的默认凭证。

    然而,这在生产上失败,很可能是因为生产MySQL服务器不允许匿名连接,并且没有在php.ini中指定默认凭据。

    检查您的代码,了解在没有mysql_real_escape_string()首先被呼叫的情况下可以接听到mysql_connect()的呼叫的情况(请注意,与PDO建立连接不计入这种情况)。

  • 由于您正在使用PDO,请考虑切换到prepared statements,这将完全消除对mysql_real_escape_string()的需求。

答案 2 :(得分:0)

此功能已在php 5.3中弃用 http://php.net/manual/en/function.mysql-escape-string.php

您必须重写代码,理想情况下从现在开始使用PDO并使用预准备语句。

答案 3 :(得分:0)

快速回答:

首先连接数据库

然后使用mysql_real_escape_string。

不是相反......