mysql_real_escape_string()[function.mysql-real-escape-string]阻止服务器连接

时间:2013-08-14 10:20:55

标签: php mysql-real-escape-string

有人可以解释为什么在设置新网站时出现此错误?以及如何解决它

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/sitename/public_html/cms/cms/admin/report.php on line 8

现在第8行的内容:

$report = mysql_real_escape_string( $report );

修改

<?php

require_once('auth.php'); require('core/plugin.php');
// session details  are here 
require('core/connection.php');
if($session_id == $session_id){
    $report = $_POST['reportmsg'];
    $report = strip_tags( $report );
    $report = mysql_real_escape_string( $report );
    $report = trim( $report );
    if($report == ""){
        die("textarea void");
        exit();
    } elseif($report == $report) {
        $sql="INSERT INTO report (site_id, date, time, ticket_id, bug)
        VALUES
        ( 
            '$session_id',
            '$date',
            '$time',
            '$ticket_id',
            '$report'
        )";
        if (!mysqli_query($con,$sql)) {
            die("Failed  to connect");
            exit();
        }
        echo ("<font style='font-family:Tahoma;'>ticket sent</font>");
        exit();
    }
}
?>

3 个答案:

答案 0 :(得分:4)

您尚未建立与数据库的连接

此函数会考虑您正在使用的数据库上的字符集(documentation),因此需要连接到数据库才能工作。在之前运行任何转义字符串:

mysql_connect('server','username','password');

或者,考虑不使用mysql_*,因为它已弃用,可能不属于维护范围,可能会从未来的PHP版本中删除。您最好使用mysqliPDO

修改:您可能已在使用mysqli

由于您添加了代码,我注意到您的查询是使用mysqli_query调用的。您可能使用mysqli连接到数据库,在这种情况下,请更改以下行:

mysql_real_escape_string($report);

到这一行:

mysqli_real_escape_string($con,$report);

这是两个不同的API,不共享连接对象,因此您的mysql_*函数无法使用mysqli_*连接。

话虽如此,您最好使用prepared statements ...

转义的行和行可以使您的查询安全,但它们很昂贵,并在您的代码中引入boilerplate

正如其他人所建议的那样,您可能希望改为准备好的陈述:

$stmt = mysqli_prepare($con, "INSERT INTO `report` (site_id, date, time, ticket_id, bug) VALUES (?,?,?,?,?)");
mysqli_stmt_bind_param($stmt, "issis", $session_id, $date, $time, $ticket_id, $report);
mysqli_stmt_execute($stmt);

在旁注上,重新:die()exit()

您在代码中使用了几次:

die("textarea void");
exit();

这两个函数是别名(die()exit()执行完全相同的操作),并且您的代码永远不会到达exit()。您可以在exit();

之后删除die();语句

答案 1 :(得分:0)

根据文件http://www.php.net/manual/en/function.mysql-real-escape-string.php

A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned. If link_identifier isn't defined, the last MySQL connection is used.

因此,我打赌你没有连接到你的数据库。

答案 2 :(得分:0)

根本不要使用此功能。至少直接在应用程序代码中。应该使用准备好的陈述。这是唯一合适的解决方案。

至于为什么会出现此错误,a manual page通常会解释您使用特定功能获得的每个错误。