我有一个表单,大多数用户会粘贴电子邮件中的内容,所以这当然有一堆特殊/智能字符,因为Outlook。因此,我使用JS代码在通过ajax post提交之前替换字符。我也JSON.stringify它。我在SLIM v3上,所以它确实通过一个路由到一个控制器文件,然后最终一个服务文件。在服务文件中它有一个json_decode,然后它再次删除任何特殊/智能字符。然后将其保存到DB。此外,我正在使用PDO准备语句,该问题仅存在于centos apache上,但不存在于我的本地Windows开发环境中。
我的问题是有些内容会保存而有些内容则不会。不保存的唯一共性是有时内容中包含“from”一词。当我改为单词“from”到“From”时,它会保存。
很难找到它失败的地方,因为我得到的唯一错误是“方法不允许。必须是:POST”我的JS正在使用帖子,而Slim中的路由知道期待发布。
两次替换字符和stringify似乎有点矫枉过正,但我只想掩盖我的基础。
我正在寻找任何可以尝试的建议。
这是替换Microsoft字符的JS。我在stackoverflow上找到了它。
cleanText: function(text) {
var s = text;
// smart single quotes and apostrophe
s = s.replace(/[\u2018\u2019\u201A]/g, "\'");
// smart double quotes
s = s.replace(/[\u201C\u201D\u201E]/g, "\"");
// ellipsis
s = s.replace(/\u2026/g, "...");
// dashes
s = s.replace(/[\u2013\u2014]/g, "-");
// circumflex
s = s.replace(/\u02C6/g, "^");
// open angle bracket
s = s.replace(/\u2039/g, "<");
// close angle bracket
s = s.replace(/\u203A/g, ">");
// spaces
s = s.replace(/[\u02DC\u00A0]/g, " ");
return s;
}
这是我将其字符串化的地方:
collectFieldValues: function() {
var params = {
record: this.settings.record,
module: this.settings.module,
note: JSON.stringify(Notes.cleanText($('#mn-note').val())),
noteID: $('#note_id').val(),
visibility: $('#mn-visibility').val(),
};
return params;
},
这是PHP插入代码:
public function insert($table, $data, $display = false, $execute = true) {
$fields = $this->filter($table, $data);
$sql = "INSERT INTO " . $table . " (" . implode($fields, ", ") . ") VALUES (:" . implode($fields, ", :") . ");";
$bind = array();
foreach ($fields as $field) {
$bind[":$field"] = $data[$field];
}
if ($this->run($sql, $bind, $display, $execute) !== false) {
return intval($this->lastInsertId());
}
return 0;
}
这是在插入之前收集参数的地方:
$note = $this->target->insert('notes', [
"linkID" => $this->app->hasher->decode($attributes['record']),
'type' => $attributes['module'],
'visibility' => $attributes['visibility'],
'note' => $this->cleanText(json_decode($attributes['note'], true)),
'created' => $now->format('Y-m-d H:i:s'),
'author' => $userID,
]);
这是PHP代码,它在文本进入db之前清理它。有更全面的东西吗?我尝试使用neitanod / forceutf8包,但这没有帮助。
public function cleanText($string)
{
$search = [ // www.fileformat.info/info/unicode/<NUM>/ <NUM> = 2018
"\xC2\xAB", // « (U+00AB) in UTF-8
"\xC2\xBB", // » (U+00BB) in UTF-8
"\xE2\x80\x98", // ‘ (U+2018) in UTF-8
"\xE2\x80\x99", // ’ (U+2019) in UTF-8
"\xE2\x80\x9A", // ‚ (U+201A) in UTF-8
"\xE2\x80\x9B", // ? (U+201B) in UTF-8
"\xE2\x80\x9C", // “ (U+201C) in UTF-8
"\xE2\x80\x9D", // ” (U+201D) in UTF-8
"\xE2\x80\x9E", // „ (U+201E) in UTF-8
"\xE2\x80\x9F", // ? (U+201F) in UTF-8
"\xE2\x80\xB9", // ‹ (U+2039) in UTF-8
"\xE2\x80\xBA", // › (U+203A) in UTF-8
"\xE2\x80\x93", // – (U+2013) in UTF-8
"\xE2\x80\x94", // — (U+2014) in UTF-8
"\xE2\x80\xA6" // … (U+2026) in UTF-8
];
$replacements = [
"<<",
">>",
"'",
"'",
"'",
"'",
'"',
'"',
'"',
'"',
"<",
">",
"-",
"-",
"..."
];
return str_replace($search, $replacements, $string);
}