簡體   English   中英

Mysqli到PDO-If else語句嘗試捕獲

[英]Mysqli to PDO - If else statement to try catch

我正在嘗試將一些mysqli代碼轉換為PDO。

在此之前:

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

到目前為止,我已將其轉換為:

$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語句?

更新:錯誤,但是工作代碼

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

您在這里有很多錯誤,我會看看是否可以提供幫助-我還沒有“測試過”此功能,但它應該非常接近。

//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 這是使用$e的通用約定,就像在循環中使用$i進行迭代一樣。 通常情況下,我不會使用像這樣的短變量,除非該變量不是代碼的組成部分。 在這種情況下, $e不是我希望在捕獲范圍之外使用的東西。

我還包括適當的內容標題。 這將有助於jQuery之類的JavaScript庫在返回數據時正確地解析JSON。

我喜歡這些類型的問題,所以希望我的解釋可以幫助您更多地了解PDO和異常。 您可以正確地使用它們。

最后一點是,您可以在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”(我明確表示我沒有測試它)。 這並不意味着有一個基本的問題(這是一個簡單的復制粘貼錯誤)。 起作用的“錯誤”代碼從根本上來說是有缺陷的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM