喵喵笨兔 の 喵喵的家~遊戲天地 - 首頁(上版面)
www.000webhost.com
喵喵笨兔 の 喵喵的家~遊戲天地 - 首頁(左版面)
首  頁 最新消息 遊戲攻略 遊戲影片 遊戲圖片 下載區 學習分享 留言板 FB粉絲團
 喵喵笨兔 の 喵喵的家~遊戲天地 - PHP 網頁編輯 MySQL 資料庫:無法將特定符號-單引號'、雙引號"、反斜線\寫入資料庫 & 讀取至網頁上'、"的衝突問題 -addslashes stripslashes htmlentities

PHP 網頁編輯 MySQL 資料庫:無法將特定符號-單引號 '、雙引號 "、反斜線 \ 寫入資料庫 & 讀取至網頁上 ' 和 " 的衝突問題

 

PHP 網頁編輯無法將單引號(')、雙引號(")、反斜線(\)寫入 MySQL 資料庫

  • 一般來說,PHP 會對 GET、POST 和 Cookie 數據自動運行 addslashes()。倘若您編寫 PHP 將特定符號寫入資料庫,出現無法寫入的錯誤訊息時,那就加上 addslashes() 試試唄!

  • 要將特定符號寫入資料庫,只要在其前面多加 \ ,sql 就不會把它當成特定符號,而當成一般符號。
    △假如要把有 ' 和 " 並存的 <onclick="if(confirm('您確定刪除嗎?'))"> 設在 $a 內,寫法:
     $a = '<onclick="if(confirm(\'您確定刪除嗎?\'))">'

  • addslashes() 函數:將特定符號單引號( ' )、雙引號( " )、反斜線( \ )之前自動添加反斜線的字串。也就是自動將特定符號前面多加 \ 變成 \' 或 \" 或 \\。

  • 倘若寫入資料庫時有將反斜線( \ )也寫入,那取出資料時不要讓反斜線( \ )出現,則用 stripslashes() 函數。
    stripslashes() 函數:刪除由 addslashes() 產生的反斜線( \ )。

 

PHP 網頁讀取 MySQL 資料庫至頁面,特定符號單引號(')、雙引號的衝突問題。

  • 倘若資料裡有含單引號( ' )或雙引號( " ),那用 PHP 語法引用至網頁上,與原本的單引號( ' )或雙引號( " )衝突,資料可能就會被截斷了。

    △ 假如資料庫的 t_name 欄位資料= 喵喵"笨兔",用 PHP 帶入網頁某輸入欄內,
     <input type="text" value="<?php echo $row['t_name']; ?>">
     因資料中的 " 與 value 的 " 衝突,所以在遇到第一個 " 符號時,就會把它當做結束而截斷。所以得到的結果 → 喵喵。

    △ 遇到此問題,用 htmlentities() 函數即可解決。
     <input type="text" value="<?php echo htmlentities($row['t_name']); ?>">
     如此得到的結果 → 喵喵"笨兔"。

  • htmlentities() 函數:htmlentities(資料,類型,'編碼'),將特定符號轉換為 html 實體。
    1.資料:就是您要轉換的資料。
    2.類型:要轉換的符號類型。
     • ENT_COMPAT - 預設值,僅編碼雙引號(")。
     • ENT_QUOTES - 編碼單引號(')和雙引號(")。
     • ENT_NOQUOTES - 不編碼任何引號。
    3.編碼:輸入您要用的字碼唄!預設字碼為 utf-8。

    △ 若只是輸入資料 htmlentities(資料),則相當於 htmlentities(資料, ENT_COMPAT, 'utf-8')。

範例程式碼:
  • 以笨兔隨手筆記【html_031】PHP 網頁編輯 MySQL 資料庫:修改資料庫的資料 的程式碼來做說明,主要看紅色字部份
  • 此範例修改欄"名稱"帶入資料有加 htmlentities(),"備註"沒有,所以 "備註" 帶進來的資料若有 " 符號,資料就會被截斷了。
  • 此範例修改後,php要寫入的名稱 (t_name) 有加 addslashes(),備註 (t_note) 沒有,所以備註欄修改後的資料有含 '、"、\ 的符號,就會出現 sql 錯誤訊息了!
<?php
      $dbhost = 'localhost'; 
      $dbuser = 'root';
      $dbpass = '12345678';
      $dbname = 'pcgame';
      $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connect') ; 
      mysql_query("SET NAMES 'UTF8'"); 
      mysql_select_db($dbname);

      //依網頁傳來的 GET 表單變數條件,撈取要修改的筆數以秀在網頁修改欄內
      $sql = "SELECT * FROM learn_demo WHERE t_id=".$_GET['t_id'];
      $result = mysql_query($sql) or die('MySQL connect error');
     
      //判斷表單是否按送出而執行修改
      if((isset($_POST['t_modify'])) && ($_POST['t_modify']=='yes')){
         $id=$_POST['t_id'];
         //addslashes()是讓資料庫能寫入單引號' 雙引號" 和反斜線\
         $name=addslashes($_POST['t_name']);
         $note=$_POST['t_note'];
         $sql="UPDATE learn_demo SET t_name='$name', t_note='$note' WHERE t_id='$id'";
         $result=mysql_query($sql) or die('MySQL insert error');
         mysql_close($conn);
         header("Location: html_029_1.html"); //修改後前往某網頁
      } 
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>喵喵笨兔 - PHP 網頁編輯 MySQL 資料庫:修改資料</title>
</head>
<body>
 <div>
   <?php while($row=mysql_fetch_assoc($result)){ ?>
   <form method="post" name="form">
      <table align="center">
        <tr>
          <td>名稱:</td>
          <td><input type="text" name="t_name" value="<?php echo htmlentities($row['t_name']); ?>" required></td>
        </tr>
        <tr>
          <td>備註:</td>
          <td><input type="text" name="t_note" value="<?php echo $row['t_note']; ?>"></td>
        </tr>
        <tr>
          <td>&nbsp;</td>
          <td><input type="reset" value="重設"><input type="submit" value="確定"></td>
        </tr>
      </table>
      <input name="t_modify" type="hidden" value="yes"><? //隱藏欄位用來判斷是否送出,來做修改的動作 ?>
      <input name="t_id" type="hidden" value="<?php echo $_GET['t_id']; //記錄篩選條件 ?>">
   </form>
   <?php } ?>
</div>
</body> 
</html>

【點擊看範例結果】:進入後按修改,把資料改成有單引號('}或雙引號(")或反斜線(\)來試試唄!

笨兔隨手筆記於 2017/11/17

喵喵笨兔 の 喵喵的家~遊戲天地
http://vv0817.tk
http://vvv.myweb.hinet.net