如何在mysqli_real_escape_string()

时间:2018-10-13 09:04:14

标签: php

我正在一个简单的消息传递网络上工作。该过程很简单,我输入带换行符的文本并将其保存在数据库中并在另一个div中显示。一切都很好,直到我使用mysqli_real_escape_string()删除了所有换行符并在一行中显示整个文本

$text = $_POST['new_text'];

$vaild_text = mysqli_real_escape_string($con,trim($text));
$vaild_text = strip_tags($vaild_text);  

$breaked_text = nl2br($vaild_text);   

$command = "INSERT INTO textTable (text_col)VALUES ('$breaked_text')";    
$query = mysqli_query($con,$command);

如果我删除mysqli_real_escape_string()的所有内容 效果很好,但是出于安全考虑,我不能

我什至更改了nl2br()的位置,并将其放在mysqli_real_escape_string()之前和之后      但这没用!

3 个答案:

答案 0 :(得分:2)

最安全的方法是使用Prepared Statements

// Strip the tags and convert the newlines to line breaks
$text = strip_tags($_POST['new_text']);   
$breaked_text = nl2br($text);

// Prepare the query
$statement = $con->prepare("INSERT INTO textTable (text_col) VALUES (?);");
$statement->bind_param("s", $breaked_text); // The "s" stands for Strings

// Execute the SQL query
$statement->execute();

使用 Prepared Statements 有一些好处:

  1. 它通过转义参数来防止SQL注入。
  2. 如果要多次执行查询,它会更快,因为查询仅是准备一次
  3. 无需将值连接到查询中。当然,当不使用准备好的语句时,sprintf()函数可以作为连接字符串的替代方法。我,但还是推荐准备好的声明。

您可以在以下答案中找到有关 Prepared Statements 的更多好处和示例:https://stackoverflow.com/a/5662391/3625118

有关bind_param()函数的更多信息,请参见here

答案 1 :(得分:0)

尝试一下?

$vaild_text = mysqli_real_escape_string($con,trim($text));
$vaild_text = str_replace('\\n', "\n", $vaild_text);

或者这个:

$text = str_replace("\n", '__NEWLINE__', $text)
$vaild_text = mysqli_real_escape_string($con,trim($text));
$vaild_text = str_replace('__NEWLINE__', "\n", $vaild_text);

是的,注释者是正确的,代码很奇怪,但是我想这是一个遗产。

答案 2 :(得分:0)

我刚刚找到了解决方法,只需使用id nl2br()即可显示文本

NSTableView