2011-09-03 102 views
0

代碼是如何簡化php代碼?

if($_POST['update_id']) 
{ 
    $sql = ' 
     UPDATE 
      affiliate_updates 
     SET 
      update_subject="' . $_POST['update_subject'] . '", 
      update_body="' . $_POST['update_body'] . '" 
     WHERE 
      update_id="' . $_POST['update_id'] . '" 
     LIMIT 1 
     '; 
    mysql_query($sql); 
    header('Location: affiliate_updates?update_id=' . $_POST['update_id']); 
    exit; 
} 

如何修剪上面的代碼或簡化代碼?

任何想法或示例代碼請告訴我。

如何使用SQL注入上面的代碼。任何一個給我看示例代碼?

+7

我喜歡你選擇的SQL注入方法。 –

+2

(請填寫我們的佔位符,它們將簡化代碼*並*使其安全。) – 2011-09-03 06:55:39

+0

什麼是你需要sql代碼的代碼? –

回答

8

您可以改爲使用PHP的PDO庫,它是數據庫的OOP處理程序。優點是,如果需要,可以更改數據庫類型,因爲不必每mysql_query就更換一次。

此外,你在做你的代碼真的很糟糕。您在查詢中使用未經驗證的用戶輸入。使用準備好的PDO語句。或使用mysql_real_escape_string($_POST['somevar'])

這裏與PDO同:

$db = // already instanced somewhere earlier (PDO Instance) 
$query = $db->prepare('UPDATE affiliate_updates SET update_subject = ?, update_body = ? WHERE update_id = ? LIMIT 1'); 
$query->execute(array($_POST['update_subject'], $_POST['update_body'], $_POST['update_id'])); 
header('Location: affiliate_updates?update_id=' . $_POST['update_id']); 
+0

此代碼看起來不太乾燥:) –

+1

+1對於* not *推薦'mysql_real_escape_string'。 – 2011-09-03 06:56:31

+0

@Col。彈片它非常簡潔。如果需要動態生成一個SQL查詢,那麼 - 當然,使用你的代碼(希望只有佔位符...)。但是,如果沒有,KISS。 – 2011-09-03 06:57:24

2

我建議使用小助手功能,以產生正確的SET語句了允許領域

function dbSet($fields) { 
    $set=''; 
    foreach ($fields as $field) { 
    if (isset($_POST[$field])) { 
     $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', "; 
    } 
    } 
    return substr($set, 0, -2); 
} 

所以$ _POST數組和列表,你的代碼變成

$id = intval(); 
$set = dbSet(array("update_subject","update_body")); 
$sql = "UPDATE affiliate_updates SET $set WHERE update_id=$id"; 
mysql_query($sql) or trigger_error(mysql_error()." in ".$sql); 

但是爲了更方便的編碼,你可能希望開發一些placeho lder系統,以及一些抽象層來訪問你的數據庫。所以,它可以爲你節省更多的行數:

$set = $db->filterPost(array("update_subject","update_body")); 
$db->run("UPDATE affiliate_updates SET ?u WHERE update_id=?i",$set,$_POST['update_id']);