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