如何简化PHP代码?

时间:2011-09-03 06:35:50

标签: php sql

代码是

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;
} 

如何修剪上述代码或简化代码?

任何想法或示例代码请告诉我。

如何使用SQLinjection上面的代码。有人给我看样例代码吗?

2 个答案:

答案 0 :(得分:8)

您可以使用PHP的PDO库,它是数据库的OOP处理程序。优点是您可以根据需要更改数据库类型,whitout必须替换每个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']);

答案 1 :(得分:2)

我建议使用一个小帮助函数从$ _POST数组和允许字段列表中生成正确的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); 
}

所以,你的代码变成了

$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);  

但是为了更方便的编码,您可能希望开发一些占位符系统,以及一些抽象层来访问您的数据库。因此,它可能会为您节省更多行:

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