如何将文本字段('+<>$“)中的特殊字符保存到数据库中,然后使用 PHP 检索它们


How do I save special characters from a textfield ('+<>$") into a database, then retrieve them with PHP?

我有一个为个人信息创建的文本区域,带有主题。它被传递给Javascript/jQuery函数,该函数将其传递给PHP文件以存储在数据库中。但是,当使用特殊字符(如与号、小于、大于、撇号、加号和引号(时,它无法正确存储在我的数据库中。所以不用说,当我检索数据时,数据没有正确显示。

这是 HTML:

 <input id="pmsubject" placeholder="Subject"><br />
 <textarea id="pmtext" placeholder="Send a private message"></textarea>
 <button id="pmBtn" onclick="postPm(pmsubject,pmtext)">Send</button>

以下是Javascript/jQuery(部分(:

function postPm(subject,textarea){
    var data = $("#textarea").val();
    var data2 = $("#subject").val();

我做了一些错误检查和处理,然后用AJAX发送我的信息:

type: "POST",
url: "pm_system.php",
data:"data="+data+"&data2="+data2,

到目前为止一切顺利吧?这是我存储代码的pm_system.php部分:

$data = htmlentities($_POST['data']);
$data = mysqli_real_escape_string($db_con, $data);
$data2 = htmlentities($_POST['data2']);
$data2 = mysqli_real_escape_string($db_con, $data2);
$sql = "INSERT INTO pm(subject, message) 
        VALUES('$data2','$data')";
$query = mysqli_query($db_con, $sql);
mysqli_close($db_con);

因此,如果我写一条消息说,我是猫+狗和"有时"鸟类的忠实粉丝。我的输出将是:

我是猫狗的忠实粉丝

它总是在引号和撇号前面加上斜杠,总是用空格替换 + 号,& 符号后面什么都没有。我尝试在 Javascript 中替换这样的字符:

data = data.replace(/'"/g, '&quot;'); //Just using one for example

但这也行不通。如何将这些字符从文本区域保存在数据库中,原封不动?

我猜,你通过JavaScript函数接收的数据已经被转义了。因此,当您输入I'm a big fan of cats dog时,您会在PHP脚本中得到I''m a big fan of cats dogs。当您使用mysqli_real_escape()时,您将添加另一个转义字符。

因此,您可能希望在以下字符之前替换转义字符:

$data = stripslashes($_POST['data']);
$data = mysqli_real_escape_string($db_con, $data);
$data2 = stripslashes($_POST['data2']);
$data2 = mysqli_real_escape_string($db_con, $data2);
$sql = "INSERT INTO pm(subject, message) 
        VALUES('$data2','$data')";
$query = mysqli_query($db_con, $sql);
mysqli_close($db_con);

我不建议使用htmlentities()而是将数据"按原样"保存到数据库中,否则全文搜索等功能将无法正常工作。

+

号的问题可能是因为您将值作为查询字符串data:"data="+data+"&data2="+data2发送,而在 URL 中,+ 符号用于空格。要解决此问题,您应该将数据作为对象传递:

type: "POST",
url: "pm_system.php",
data: { "data": data, "data2": data2 },

这也应该修复大多数其他有问题的角色。

我建议尝试htmlspecialchars()而不是htmlentities()。过去,我在htmlentities()和输出数据方面遇到了一些麻烦。使用htmlspecialchars()解决了它。