2014-11-14 58 views
0

我試圖將一些mysqli代碼轉換爲PDO。Mysqli to PDO - If else statement to try catch

之前,我有這樣的:

$updateTaskQuery = "UPDATE `task` SET `user_id` = {$query['user_id']}, `status_id` = {$query['status_id']} WHERE `id` = {$query['task_id']}"; 
    $updateTask  = mysqli_query($mysqli, $updateTaskQuery); 

    //### Check for error 
    if($mysqliError = mysqli_error($mysqli)) { 
    echo json_encode(array('error' => 'Update Task MySQLi Error: '.$mysqliError)); 
    exit; 
    } else { 
    echo json_encode(array('success' => true)); 
    exit; 
    } 

到目前爲止,我已經是convertet這樣:

$sql = $db->prepare ("UPDATE `task` SET `user_id` = {$query['user_id']}, `status_id` = {$query['status_id']} WHERE `id` = {$query['task_id']}"); 
$sql->execute(); 
$updateTask = $sql->fetchAll (PDO::FETCH_ASSOC); 

try { 
    $updateTask; 
} catch (PDOException $ex) { 
    //handle 
} 

我的問題在這裏,我怎麼能包括我的新代碼else語句?

UPDATE:錯了,但工作代碼

try { 
    // Update task 
    $query = $db->prepare ("UPDATE `task` SET `user_id` = {$query['user_id']}, `status_id` = {$query['status_id']} WHERE `id` = {$query['task_id']}"); 
    $query->execute(); 

    echo json_encode (array (
      'success' => true 
    )); 
} catch (PDOException $e) { 
    // catch a pdo error 
    echo json_encode (array (
      'error' => 'Update Task PDO Error: ' . $e->getMessage(), 
      'error_trace' => $e->getTraceAsString() 
    )); 
} 
+3

你正在擊敗準備好的陳述點.. – 2014-11-15 00:01:11

+0

@DarylGill並嘗試捕捉太。 – ArtisticPhoenix 2014-11-15 00:03:31

+0

@ArtisiticPhoenix我沒有注意到這一點。我的大腦被炸第一個缺陷 – 2014-11-15 00:04:15

回答

3

你有很多錯在這裏,我可以看到,如果我能幫助 - 我沒有「測試」這一點,但它應該是非常接近。

//your using json so set the correct content headers 
header('Content-Type: application/json'); 

//try only works on code you "try" anything outside isn't included in the try block 
try{ 
    //connect 
    $PDO = new PDO(
     'mysql:host=' . $_dbHost . ';' . 'dbname=' . $_dbName, 
     $_dbUser, 
     $_dbPass 
    ); 
    //set exception error mode 
    $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    //set fetch assoc array as default 
    $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 

    //query with named placeholders (even pdo can get sql injection when you dont use placeholders) 
    $sql = 'UPDATE `task` SET `user_id` = :user_id, `status_id` = :status_id WHERE `id` = :id'; 

    //prepare query 
    $stmt = $PDO->prepare($sql); 

    //execute with data 
    $stmt->execute(array(
     ':user_id' => $query['user_id'], 
     ':status_id' => $query['status_id'], 
     ':id' => $query['id'], 
    )); 

    echo json_encode(array(
     'success' => true, 
     'results' => $stmt->fetchAll() 
     ) 
    ); 

}catch(PDOException $e){ 
    //catch a pdo error 
    echo json_encode(array(
     'error' => 'Update Task PDO Error: '.$e->getMessage(), 
     'error_trace' => $e->getTraceAsString() 
     ) 
    ); 
}catch(Exception $e){ 
    //the beauty of exceptions ~ catch some other non-pdo exception 
    echo json_encode(array(
     'error' => 'Runtime Error: '.$e->getMessage(), 
     'error_trace' => $e->getTraceAsString() 
     ) 
    ); 
} 

///more code can go here 

要回答你的問題,你不再需要else語句。運行try塊中的所有內容,直到它拋出一個異常,然後它將降落到相應的catch塊中並運行該代碼。在該塊中,您可以通過引用您爲異常類實例設置的變量來獲取錯誤消息,在這種情況下,我設置了$e。正如使用$i來循環迭代一樣,這是使用$e的常見慣例。一般來說,我不會使用像這樣的短變量,除非變量不是代碼的組成部分。在這種情況下,$e不是我期望在捕獲之外使用的。

我還包括正確的內容標題。這將有助於JavaScript庫(如jQuery)在返回數據時正確解析JSON。

我喜歡這類問題,所以我希望我的解釋能幫助您更好地理解PDO和Exceptions。你在正確的軌道上使用它們。

最後一個注意事項是你可以在try catch塊之後運行更多的代碼。要解釋我的評論(關於錯誤代碼的作品),當你不在SQL中清理輸入時,你會得到像這樣的討厭的東西。假設我們有這個疑問:

$sql = "UPDATE 
    `task` 
SET 
    `user_id` = {$query['user_id']}, 
    `status_id` = {$query['status_id']} 
WHERE 
    `id` = {$query['task_id']} 
"; 

這裏的問題是,如果有人進入SQL的塊到您輸入一個如

$query['task_id'] = '0; DROP table task;'; 

這樣做是完整的查詢和刪除你的表!

$sql = "UPDATE 
    `task` 
SET 
    `user_id` = 1, 
    `status_id` = 2 
WHERE 
    `id` = 0; 
DROP table task; 
"; 

雖然我絕不是SQL專家,但我從來沒有這樣做過,這是它的要義。有很多事情可以在刪除表的時候做得更糟,例如創建數據庫用戶。訪問系統上的文件,例如系統用戶的密碼文件或其他機密信息。更不用說像加入惡意JavaScript那樣的第二階段攻擊。哪些將被打印在屏幕上,並允許他們對網站訪問者進行XSS(跨站點腳本)類型攻擊等...

即使您認爲您的網站上沒有任何值得「竊取」的東西,請相信我。學習正確的方法,然後在這樣的事情上努力學習會更好。對不起,如果我對此有點苛刻,但是如果你打算做任何「嚴肅」的編碼,這是一個非常重要的概念。

僅僅因爲某些東西不起作用,比如我提供的代碼「sample」(我明確說過我沒有測試它)。並不意味着它有一個基本的問題(這是一個簡單的複製粘貼錯誤)。有效的「錯誤」代碼基本上是有缺陷的。

+0

似乎我對接受有點太快了。將離開它。但是,我沒有得到user_id,status_id和id的錯誤「非法字符串偏移量」。似乎他們現在不被視爲陣列。 – Adnaves 2014-11-15 01:18:53

+0

我使用錯誤的代碼更新了我的問題,這很有效。 – Adnaves 2014-11-15 01:52:01

+0

它的工作原理,直到有人這樣做,$ query ['user_id'] ='0'; DROP任務;''我不會建議這樣做或這$查詢['user_id'] ='0「; SELECT用戶名,密碼FROM用戶WHERE 1; - 「; – ArtisticPhoenix 2014-11-15 01:56:19