2011-09-03 100 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']);