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

时间:2014-12-17 22:47:15

标签: javascript php jquery mysql ajax

我创建了一个textarea,用于个人信息,包含主题。它被传递给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);

所以,如果我写下一条消息说,我是猫+狗的忠实粉丝。 &#34;有时&#34;鸟类。我的输出是:

I\'m a big fan of cats   dogs

它总是在引号和撇号前添加斜杠,总是用空格替换+符号,并且在&符号后面没有任何内容。我已尝试在Javascript中替换这样的字符:

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

但这也不起作用。如何从数据库中的textarea中保存这些字符,不加改变?

2 个答案:

答案 0 :(得分:2)

我猜,您通过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 },

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

答案 1 :(得分:0)

我建议您尝试htmlspecialchars()而不是htmlentities()。我在使用htmlentities()时遇到了一些问题并输出了过去的数据。使用htmlspecialchars()解决了它。