2012-02-27 60 views
0

我有一個捕獲<input type="text"><textarea>元素的Web表單。後端技術是PHP和MySQL。Web表單到數據庫存儲的端到端過程的最佳實踐

  • MySQL數據庫,表和列的排序規則都utf8_general_ci
  • 輸入表單數據消毒與stripslashes($_POST['text_input'])
  • 的INSERT INTO查詢語句看起來像SET text_storage = "mysql_real_escape_string($_POST['text_input'])"

我看到不可讀數據庫中的字符是由於特殊字符(如單引號和雙引號等)的變化而導致的。

什麼是最好的編碼實踐 - 每一步 - 確保數據庫表中清潔可讀的數據?我是否還需要某個<doctype><meta http-equiv="Content-Type" ... />以便捕獲和存儲清潔數據?

感謝您幫助我構建清潔數據捕獲和存儲的最佳實踐模板。

回答

1

嘗試從數據庫的記錄實際讀取前執行這些查詢:

mysql_query("SET NAMES 'utf8'"); 
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'"); 

之後與你查詢的執行進行。上述查詢,如果當然,必須在您當前的數據庫連接的上下文中。

輸入數據可以通過內置PHP函數輕鬆消毒,如filter_var()filter_var_array(),但mysql_real_escape_string()也是很好的解決方案。 你的HTML文檔必須有一個正確的編碼在標籤:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

mysql_real_escape_string()轉義特殊字符在unescaped_string,考慮到當前的字符集的連接,從而可以安全地放置在一個mysql_query()。如果要插入二進制數據,則必須使用此功能。該函數調用MySQL的庫函數mysql_real_escape_string,該函數將反斜槓預置爲以下字符:\x00, \n, \r, \, ', " and \x1a

+0

好@budiony,我會補充說。但是,如果我的DB/Tables/Columns都設置爲整理utf8,那麼2個預查詢的意義是什麼? – 2012-02-27 14:54:52

+0

相信我,它對返回的結果集有重大影響。這件事困擾了我很長時間,直到我在每次查詢之前手動更改這些參數運行時。 – bodi0 2012-02-27 14:57:30

+0

謝謝@budiony。我實施了你的查詢,他們清理了一切。真棒! – 2012-03-07 14:45:00