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

慕仙森
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超8個(gè)贊
<?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貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個(gè)贊
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();}
添加回答
舉報(bào)
0/150
提交
取消