1

好的,伙计们,我遇到了 mysql_real_escape_string 的问题。这是一个带有标题和内容的简单 POST 表,理论上应该可以正常工作(由我)。

$db = new mysqli('...','...','...','...') or die ('error with connection');
$db->set_charset('utf8');

$title  = trim($_POST['title']);
$contents   = trim($_POST['contents']);

$title = mysql_real_escape_string($title);
$contents = mysql_real_escape_string($contents);

$sql = "INSERT INTO posts SET title = '$title', contents = '$contents'";
$query = $db->query($sql);

当我在 'mysql_escape_string' 之前和之后放置 'echo' 时,我发现:

echo 'before' . $title;
$title = mysql_real_escape_string($title);
echo 'after' . $title;

它在“之前”行上回显标题,但在“之后”行上回显空白 $title。

注意:当我使用 'mysql_escape_string' 代替(真实的)时,它工作正常(但我想这是较弱的保护)。

有任何想法吗??谢谢你。

4

3 回答 3

2

mysql_real_escape_string()在“mysql”扩展建立的连接上下文中工作,但你使用“mysqli”。

您需要不推荐使用 mysql_connect() 进行连接

或者您需要使用 mysqli 的新方法,例如准备好的语句或mysqli_real_escape_string()

于 2013-07-24T17:44:40.753 回答
2

原因title为空是因为mysql_real_escape_string正在返回FALSE。发生这种情况是因为它需要一个 MySQL 连接到数据库,你有 MySQLi。从文档中,

A MySQL connection is required before using mysql_real_escape_string() otherwise an error of level E_WARNING is generated, and FALSE is returned

解决问题的方法是使用mysqli_real_escape_string来匹配您的数据库连接,如其他答案中所建议的那样。显然,为了安全起见,最好使用准备好的语句。

此外,还需要提供数据库链接。由于您使用的是 OO 样式,因此这样做是

$db = new mysqli()
$title = $db->real_escape_string($title)
于 2013-07-24T17:48:28.747 回答
0

您不应该将用户生成的字符串插入到 sql 中。使用准备好的语句: http: //php.net/manual/en/mysqli.quickstart.prepared-statements.php

在你的情况下:

$db = new mysqli('...','...','...','...') or die ('error with connection');
$db->set_charset('utf8');

$title  = trim($_POST['title']);
$contents   = trim($_POST['contents']);

$sql = $db->prepare("INSERT INTO posts (title, contents) VALUES (?,?)");
$sql->bind_param('ss', $title, $contents);
$sql->execute();
于 2013-07-24T17:45:30.463 回答