我使用CodeIgniter,我有一个带有一些输入字段的公式。问题是,当我将特殊字符写入"&"等输入字段时,它会保存为&
,当我重新加载表单以编辑值时,它显示为这样。这会导致许多错误,需要解决。该值需要另存为"&"。
我对输入字段使用 form_validation,如下所示:
$this->form_validation->set_rules("input1", "Name", "required|trim");
$this->form_validation->set_rules("input2", "Name", "required|trim");
稍后,我将所有输入写入数组,并将其交给模型中的函数:
$input= array();
$input["input1"] = set_value("input1");
$input["input2"] = set_value("input2");
$this->MInput->update_input($input_id, $input);
模型如下所示:
function update_input($input_id, $input) {
if($this->db->update("pa_it_input", $input, "id = $input_id") === FALSE) {
$error = $this->db->error();
log_message("error", "Database error in MInput [".$error["code"]."] ".$error["message"]);
return FALSE;
}
我不知道是什么导致了错误。我已经检查了所有表是否都设置为 UTF-8,并且页面是否以 UTF-8 加载。
这是否涉及 PHP? 什么版本的 PHP? 它是否打开了"魔术引号"?
是否有任何代码调用htmlentities()
?
&
-> &
是"HTML 实体"问题,而不是"UTF-8"问题。
CodeIgniter带来了什么? 也许像这样一些无端的变化? 假设传入的"表单"文本的唯一用途是将其放在HTML中是错误的。 在你的例子中,它进入MySQL,它需要一个不同的转义机制。
Codeigniter 将特殊字符转换为 html 实体。这样做有一些安全问题。为了解决您的问题,php的htmlspecialchars_decode()
函数会有所帮助。
如果保存在数据库中的公式具有&
则在将内容传递给模型之前对其进行解码。
$input= array();
$input["input1"] = htmlspecialchars_decode(set_value("input1"));
$input["input2"] = htmlspecialchars_decode(set_value("input2"));
$this->MInput->update_input($input_id, $input);
这将保存"&"而不是'&'
但是如果您的数据库具有带有"&"的正确内容,并且它只是没有在编辑表单中正确显示"&"。然后,您需要在设置输入值的HTML页面上使用htmlspecialchars_decode()
函数。
<input type="text" name="input1" value="<?php echo htmlspecialchars_decode($formula_val); ?>" />