2011-05-20 107 views
1

有效期是做这样的事情,我从来没有看到超过1个或运营商:MySQL的更新或插入或死查询

$insert = 'INSERT into fhours (' .$cols . ') VALUES ('.$query.')'; 
$update = sprintf("UPDATE fhours SET %s WHERE fname='$fname' AND lname='$lname'", $field_list); 

$result = $db->query($update) or $db->query($insert) or die('uhoh');` 
+0

你为什么不把逻辑建立到你的PHP脚本中?如果其他语句? – Rob 2011-05-20 16:00:42

+0

@Rob,没有理由不使用if/else,只是想知道上面的代码是否可以接受,以及如果没有if/else块可以完成。 – Michael 2011-05-20 16:14:54

回答

3

有两个问题。

首先是您可以使用参数化查询。 Look at PDO, this will help you greatly。这不仅对多次插入来说更快,而且你不必担心SQL注入过多。

第二个是你可以使用MySQL's ON DUPLICATE KEY UPDATE来为你解决这个问题。否则,当你的查询失败时,你不知道它为什么失败。它可能不是一个重复的关键问题!

除此之外,从or的角度来看的代码就好了。

+0

那么我的重复密钥是我正在检查的fname/lname? – Michael 2011-05-20 16:31:32

+0

不,重复的关键是失败的表上的任何关键。如果你在fname上设置了一个UNIQUE键,那么是的。 – Brad 2011-05-20 18:03:56

0

它有效吗?是。是否推荐?编号

问题与die() -ing从失败的SQL查询是用户最终看到,这是一个可怕的屏幕,可能只有少量的文本。这很糟糕。

相反,你应该处理的方式这些错误,你可以完成的失败传递给用户:

$update_result = $db->query($update); 
if(!$update_result) { 
    // Yikes! Tell the user something went wrong! 
    // Show them an error page or error message 
} 

$insert_result = db->query($insert); 
if(!$insert_result) { 
    // Yikes! Tell the user something went wrong! 
    // Show them an error page or error message 
} 

事实上,它也推荐看一看到set_error_handler,它可以让您捕捉致命PHP错误和而不是表明这样可能暴露你的php路径可怕的错误:

Fatal error: Cannot use assign-op operators with overloaded objects nor string offsets in /check/out/my/directory/structure/wp-admin/includes/file.php on line 688

您可以将它们发送到一般的错误页面,看起来更有大量专业。

0

你可能想看看mysql替换成语法