mysql_real_escape_string删除变量内容

时间:2013-07-24 17:40:27

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

好的伙计们,我遇到了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'代替(真实的),它工作正常(但我想这是较弱的保护)。

任何想法? 谢谢。

3 个答案:

答案 0 :(得分:2)

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

您需要使用mysql_connect()不推荐

进行连接

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

答案 1 :(得分:1)

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)

答案 2 :(得分: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();