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> </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>