表示する文字列はMySQLテーブルから得られます。私はPDOクエリを使用します。文字列には二重引用符が含まれます。PHPの引用符をMySQLの結果(PDO)からエスケープする
旧式のスペル(フランス語から)。現代化された「些細な窃盗」が現在好まれている。
これは、利用可能な場合に表示される辞書エントリの定義は次のとおりですので、引用符の
$search_results .= (!empty($english_definition)? "<a class=\"definition\" href=\"#\" data-toggle=\"popover\" rel=\"popover\"
data-content=\"".$english_definition."\">".$english."*</a>" : $english);
、定義は「近代化」という言葉の後に切断されます。
私はaddslashes()
を使用しようとしましたが、結果として1つのスラッシュが表示され、その後ろには何も表示されません。
また、テーブルのフィールド内にスラッシュを追加しようとしました。
旧式のスペル(フランス語から)。近代化された "小柄な窃盗"が現在好まれています。
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");
}
あなたはプレースホルダの値とのプリペアドステートメントを使用していますか?あなたの答えがあります。 – tadman
はい、ありがとうございます。しかし、$ english_definition = $ _POST ['english_definition'];を '$ english_definition = htmlspecialchars($ _ POST ['english_definition'])に変更する前に、説明したような問題がありました。 – cheeseus
ここで間違った方法を使用していますが、これはページに表示する場合にのみ関連しています。 [prepared statements](http://php.net/manual/en/pdo.prepared-statements.php)を使用する必要があります。彼らはそれをmanglingせずに安全にあなたのデータを挿入するためのものです。問題を引き起こしている二重のエスケープをしています。あなたはどのPHPのバージョンを使用していますか?試しに、ステートメントにバインドしている値を調べて、ダブルエスケープがどこから来ているのかを確認してください。おそらくJavaScriptに触れるコードがあります。 – tadman