有人能解释为什么在建立新网站时会出现这个错误吗?以及如何解决
警告:mysql_real_eescape_string()[function.mysql real-eescape-string]:无法在第8行的/home/sitename/public_html/cms/cms/admin/report.php中建立到服务器的链接
现在第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();
}
}
?>
您尚未建立到数据库的连接
此函数考虑了您正在使用的数据库(文档)上的字符集,因此它需要连接到数据库才能工作。在任何转义字符串之前运行此:
mysql_connect('server','username','password');
或者,考虑不使用mysql_*
,因为它已被弃用,可能会脱离维护,并且可能会从未来版本的PHP中删除。使用mysqli或PDO可能会更好。
编辑:看起来您可能已经在使用mysqli
由于添加了代码,我注意到您的查询是用mysqli_query
调用的。您可能使用mysqli
连接到数据库,在这种情况下,请更改以下行:
mysql_real_escape_string($report);
到此行:
mysqli_real_escape_string($con,$report);
这是两个不同的API,不共享连接对象,因此mysql_*
函数无法使用mysqli_*
连接。
话虽如此,你最好使用事先准备好的陈述
一行又一行的转义可以确保查询的安全,但它们代价高昂,并且会在代码中引入样板文件。
正如其他人所建议的那样,您可能希望查看准备好的声明:
$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();
之后的位置
根据文档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.
因此,我打赌你没有连接到你的数据库。
根本不要使用此函数。至少直接在应用程序代码中应该使用事先准备好的语句。这是唯一正确的解决方案。
至于为什么会出现这种错误,手册页面通常会对特定功能中出现的每个错误进行解释。