2011-05-20 58 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替換成語法