我有一个为个人信息创建的文本区域,带有主题。它被传递给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, '"'); //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()
解决了它。