【发布时间】:2016-05-13 09:17:29
【问题描述】:
要显示的字符串来自 MySQL 表。我使用 PDO 查询。该字符串包含双引号:
较旧的拼写(来自法语)。现在首选现代化的“小偷小摸”。
这是一个字典条目的定义,如果可用则显示:
$search_results .= (!empty($english_definition)? "<a class=\"definition\" href=\"#\" data-toggle=\"popover\" rel=\"popover\"
data-content=\"".$english_definition."\">".$english."*</a>" : $english);
由于引号,定义被删减到“现代化”一词之后。
我尝试使用addslashes(),但结果是显示了一个斜杠,之后没有任何内容。
我还尝试在表格字段中添加斜杠,例如
较旧的拼写(来自法语)。现代化的“小偷小摸”现在是首选。
PHP 代码中如果没有stripslashes(),则只显示第一个反斜杠,其后不显示任何内容。
当我添加stripslashes() 时,“现代化”一词后没有显示任何内容。
所以,这就是我卡住的地方。
附加代码:
这就是我插入新术语和定义的方式。我添加了htmlspecialchars() 用于可能存在引号的输入:
if(isset($_POST['submit'])) {
$english = htmlspecialchars($_POST['english']);
$english_abbr = $_POST['english_abbr'];
$variant = $_POST['variant'];
$bulgarian = htmlspecialchars($_POST['bulgarian']);
$bulgarian_abbr = $_POST['bulgarian_abbr'];
$theme_id = $_POST['theme_id'];
$english_definition = htmlspecialchars($_POST['english_definition']);
$bulgarian_definition = htmlspecialchars($_POST['bulgarian_definition']);
// Check if an entry already exists
$exists = $db->prepare("SELECT * FROM ".DICTIONARY_TABLE." WHERE english = :english AND theme_id = :theme_id ");
$exists->execute(array(':english' => $english, ':theme_id' => $theme_id));
$count = $exists->rowCount();
if($count > 0) {
echo "<h3 style=\"color:navy; background:transparent;\">⇒ An entry in the same theme already exists.</h3>";
}
else {
$insert = $db->prepare("INSERT INTO ".DICTIONARY_TABLE."
(english, english_abbr, variant, bulgarian, bulgarian_abbr, theme_id)
VALUES
(:english, :english_abbr, :variant, :bulgarian, :bulgarian_abbr, :theme_id)");
$insert->execute(array(':english' => $english,
':english_abbr' => $english_abbr,
':variant' => $variant,
':bulgarian' => $bulgarian,
':bulgarian_abbr' => $bulgarian_abbr,
':theme_id' => $theme_id));
if($insert) {
echo "<h4 style=\"color:green; background:transparent;\">⇒ Term \"$english\" inserted successfully.</h4>";
if(!empty($english_definition) || !empty($bulgarian_definition)) {
$insert_id = $db->lastInsertId();
$insert_def = $db->prepare(
"INSERT INTO ".DICTIONARY_DEFINITIONS."
(term_id, english_definition, bulgarian_definition)
VALUES
(:term_id, :english_definition, :bulgarian_definition)");
$insert_def->execute(array(
':term_id' => $insert_id,
':english_definition' => $english_definition,
':bulgarian_definition' => $bulgarian_definition));
if($insert_def) {
echo "<h4 style=\"color:green; background:transparent;\">⇒ Definition(s) inserted successfully.</h4>";
}
else {
echo "<h4 style=\"color:red; background:transparent;\">⇒ There was a problem inserting the definition(s)!</h4>";
}
}
unset($_POST); $_POST = array();
}
else {
echo "<h4 style=\"color:red; background:transparent;\">⇒ There was a problem executing the query: </h4>";
}
}
include("insert_form.php");
}
else {
include("insert_form.php");
}
【问题讨论】:
-
您是否使用带有占位符值的预准备语句?这就是你的答案。
-
是的,我是。但在我将
$english_definition = $_POST['english_definition'];更改为$english_definition = htmlspecialchars($_POST['english_definition']);之前,我遇到了上述问题。 -
您在这里使用了错误的方法,这仅与在页面上显示有关。您应该使用prepared statements。它们旨在安全地插入您的数据而不会破坏它。您正在那里进行一些双重转义,这会导致问题。您使用的是什么版本的 PHP?尝试检查您绑定到语句的值,以查看双重转义的来源。也许还有其他涉及这些的代码,甚至可能是 JavaScript。
-
@tadman,您能否看一下我添加到问题中的完整插入查询,如果这真的是错误的方法,请告诉我?我已经关注了 PHP.net 和这里的资源 - 当然,不是专家,我可能会做一些不应该做的事情。谢谢!
标签: php mysql stripslashes addslashes