2016-05-13 5 views
0

表示する文字列は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;\">&#8658; 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;\">&#8658; 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;\">&#8658; Definition(s) inserted successfully.</h4>"; 
        } 
        else { 
         echo "<h4 style=\"color:red; background:transparent;\">&#8658; There was a problem inserting the definition(s)!</h4>"; 
        } 
       } 

       unset($_POST); $_POST = array(); 
      } 
      else { 
       echo "<h4 style=\"color:red; background:transparent;\">&#8658; There was a problem executing the query: </h4>"; 
      } 
     } 
     include("insert_form.php"); 
    } 
    else { 
     include("insert_form.php"); 
    } 
+0

あなたはプレースホルダの値とのプリペアドステートメントを使用していますか?あなたの答えがあります。 – tadman

+0

はい、ありがとうございます。しかし、$ english_definition = $ _POST ['english_definition'];を '$ english_definition = htmlspecialchars($ _ POST ['english_definition'])に変更する前に、説明したような問題がありました。 – cheeseus

+0

ここで間違った方法を使用していますが、これはページに表示する場合にのみ関連しています。 [prepared statements](http://php.net/manual/en/pdo.prepared-statements.php)を使用する必要があります。彼らはそれをmanglingせずに安全にあなたのデータを挿入するためのものです。問題を引き起こしている二重のエスケープをしています。あなたはどのPHPのバージョンを使用していますか?試しに、ステートメントにバインドしている値を調べて、ダブルエスケープがどこから来ているのかを確認してください。おそらくJavaScriptに触れるコードがあります。 – tadman

答えて

0

は、あなたがそれをデータベースに保存するときhtmlspecialchars()機能を使用して、htmlspecialchars_decode()機能。

Link to htmlspecialchars() function

Link to htmlspecialchars_decode() function

+0

これをテストするために、データベースに既に書き込まれているこの特定の文字列に対して、どのような変更を加える必要がありますか?スラッシュを追加する必要がありますか?私はPhpMyAdminから直接編集を行います。 – cheeseus

+0

ありがとう!ちょうどそれを試しました( 'htmlspecialchars()')。引用符は '"'に変換されました。 'htmlspecialchars_decode()'を使って結果をエコーし​​ますが、同じ結果が得られます。文字列は "modernized"の後に切り捨てられます。 – cheeseus

+0

しかし、 'htmlspecialchars_decode()'を追加せずに結果をエコーすると、完全な文字列が正しく表示されます! したがって、解決策は、データベースに書き込むときに 'htmlspecialchars()'を使用することですが、デコードせずにエコーするだけです。 ありがとう! – cheeseus

0

それは漠然とした質問のビットだとあなたはPDO権利を使用する場合、私も、あなたはスラッシュに対処しなければならないとは思わないが、あなたはデータをwan't場合スラッシュなしで表示するには文字列置換を試してみましたか?

$search_result = str_replace ("/", "", $search_result); 

これは、私はあなたが質問を正しく理解していればしているあなたが望むものを達成する必要があり

+1

申し訳ありませんが私の質問は非常に明確ではない場合。私はPDOの初心者なので、正しいことをしていない可能性がありますが、簡単な挿入とその後のクエリのフェッチです... INSERTの部分は次のとおりです。 '$ insert_def = $ db-> prepare (:term_id、:english_definition、:bulgarian_definition) "); " INSERT INTO ".DICTIONARY_DEFINITIONS。私が今持っている ' ; $ insert_def->(\t => $ bulgarian_definition) ':term_id' => $ INSERT_ID、 ':english_definition' \t => $ english_definition、 'bulgarian_definition' 配列( )を実行'htmlspecialchars()'を追加して動作します! – cheeseus

関連する問題