參考:使用MySQL擴展的完美代碼示例是什么?這是為了創建一個社區學習資源..我們的目標是有好的代碼示例,這些代碼不會重復復制/粘貼PHP代碼中經常出現的可怕錯誤。我已經要求它成為社區維基。這是不是作為編碼比賽。它不是尋找最快或最緊湊的方式來進行查詢-它是提供一個好的,可讀的參考,特別是對新手。每天都有大量的問題涌入真的很糟糕使用mysql_*堆棧溢出的函數族。雖然通常最好將這些人引導到PDO,但有時這既不可能(例如繼承的遺留軟件),也不現實(用戶已經在他們的項目中使用它)。使用mysql_*圖書館包括:SQL注入值限制子句和動態表名中的SQL注入沒有錯誤報告(“為什么這個查詢不能工作?”)錯誤報告(也就是說,即使在代碼投入生產時也會發生錯誤)值輸出中的跨站點腳本(Xss)注入讓我們編寫一個PHP代碼示例,它使用MySQL_*函數族:接受兩個員額值,id(數字)及name(a字符串)對表執行更新查詢tablename,更改name列中具有ID的id如果出現故障,請友好地退出,但只在生產模式中顯示詳細的錯誤。trigger_error()就足夠了;或者使用您選擇的方法。輸出消息“$name最新情況“。而且真的不顯示上面列出的任何弱點。應該是盡可能簡單..理想情況下,它不包含任何函數或類。目標不是創建副本/可壓縮庫,而是創建顯示使數據庫查詢安全所需的最小操作。好的評論加分。這樣做的目的是使這個問題成為一個資源,當用戶遇到一個有錯誤代碼的問題詢問者(盡管它根本不是問題的焦點)或者遇到一個失敗的查詢并且不知道如何解決它時,用戶可以鏈接到這個資源。預先阻止PDO的討論:是的,它往往會更好地指導個人寫這些問題的PDO。當它成為一種選擇時,我們應該這樣做。然而,這并不總是可能的-有時,問題問者正在處理遺留代碼,或者已經有了很長的路要用這個庫,而且現在不太可能改變它。此外,mysql_*如果使用得當,功能家族是完全安全的。所以這里沒有“使用PDO”的答案。
3 回答

慕仙森
TA貢獻1827條經驗 獲得超8個贊
<?php header('Content-type: text/html; charset=utf-8');error_reporting(E_ALL | E_STRICT);ini_set('display_errors', 1); // display_errors can be changed to 0 in production mode to// suppress PHP's error messages/* Can be used for testing $_POST['id'] = 1; $_POST['name'] = 'Markus'; */$config = array( 'host' => '127.0.0.1', 'user' => 'my_user', 'pass' => 'my_pass', 'db' => 'my_database');# Connect and disable mysql error output$connection = @mysql_connect($config['host'], $config['user'], $config['pass']);if (!$connection) { trigger_error('Unable to connect to database: ' . mysql_error(), E_USER_ERROR);}if (!mysql_select_db($config['db'])) { trigger_error('Unable to select db: ' . mysql_error(), E_USER_ERROR);}if (!mysql_set_charset('utf8')) { trigger_error('Unable to set charset for db connection: ' . mysql_error(), E_USER_ERROR);}$result = mysql_query( 'UPDATE tablename SET name = "' . mysql_real_escape_string($_POST['name']) . '" WHERE id = "' . mysql_real_escape_string($_POST['id']) . '"');if ($result) { echo htmlentities($_POST['name'], ENT_COMPAT, 'utf-8') . ' updated.';} else { trigger_error('Unable to update db: ' . mysql_error(), E_USER_ERROR);}

ITMISS
TA貢獻1871條經驗 獲得超8個贊
function executeQuery($query, $args) { $cleaned = array_map('mysql_real_escape_string', $args); if($result = mysql_query(vsprintf($query, $cleaned))) { return $result; } else { throw new Exception('MySQL Query Error: ' . mysql_error()); }}function updateTablenameName($id, $name) { $query = "UPDATE tablename SET name = '%s' WHERE id = %d"; return executeQuery($query, array($name, $id));}try { updateTablenameName($_POST['id'], $_POST['name']);} catch(Exception $e) { echo $e->getMessage(); exit();}
添加回答
舉報
0/150
提交
取消