2016-05-13 53 views
0

要顯示的字符串來自MySQL表。我使用PDO查詢。該字符串包含雙引號:從MySQL結果(PDO)中跳出PHP中的引號

較舊的拼寫(法語)。現代化的「小偷襲」現在是首選。

這是如果可用時顯示的一個字典詞條的定義:

$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;\">&#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)。它們旨在安全地插入數據而不會造成損壞。你在那裏做了一些雙倍的逃跑,這是造成問題的原因。你使用的是什麼版本的PHP?嘗試並檢查您的聲明與哪些值綁定,以查看雙重轉義來自何處。也許還有其他代碼涉及到這些,甚至可能是JavaScript。 – tadman

回答

0

使用htmlspecialchars()功能,當您將它保存到數據庫中,並htmlspecialchars_decode()功能,當你想再次呼應了。

Link to htmlspecialchars() function

Link to htmlspecialchars_decode() function

+0

爲了測試這個,我需要對這個已經寫入數據庫的特定字符串做出什麼改變?我應該添加斜槓還是不?我直接從PhpMyAdmin進行編輯。 – cheeseus

+0

謝謝!剛剛嘗試過('htmlspecialchars()')。引號被轉換成'"'。然後用'htmlspecialchars_decode()'回顯結果,但仍然得到相同的結果 - 字符串在「現代化」之後被切斷。 – cheeseus

+0

但是...當我回應結果沒有添加'htmlspecialchars_decode()',完整的字符串顯示正確! 因此,解決方案是在寫入數據庫時​​使用'htmlspecialchars()',但只是在不解碼的情況下對其進行回顯。 謝謝! – cheeseus

0

這是一個有點模糊的問題的,如果你會使用PDO對的,我甚至不認爲你應該有應對斜線,但如果你wan't數據要顯示沒有削減您是否嘗試過使用字符串替換?

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

這應該達到你想要什麼,如果我理解你的問題正確

+1

對不起,如果我的問題不是很清楚。我是PDO的新手,所以有機會我沒有做正確的事情,但是再一次,它是一個簡單的插入,然後獲取查詢...這是INSERT部分: '$ insert_def = $ db-> prepare ( 「INSERT INTO」.DICTIONARY_DEFINITIONS。「 (term_id,english_definition,bulgarian_definition) VALUES (:term_id,:english_definition,:bulgarian_definition)」); $ insert_def->執行(陣列( ':term_id'=> $ INSERT_ID, ':english_definition' \t => $ english_definition, ':bulgarian_definition' \t => $ bulgarian_definition));' 我現在有添加'htmlspecialchars()',它的工作原理! – cheeseus