Mysqli 到 PDO - 如果其他语句尝试捕获


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(跨站点脚本)类型的攻击......

相信我,即使你认为你的网站上没有任何值得"窃取"的东西。在这样的事情上,最好学习正确的方法,然后学习困难的方法。对不起,如果我对此有点苛刻,但如果你打算做任何"严肃"的编码,这是一个非常重要的概念。

只是因为某些东西不起作用,例如我提供的代码"示例"(我确实明确表示我没有测试它)。 这并不意味着它存在根本问题(这是一个简单的复制粘贴错误)。 有效的"错误"代码从根本上是有缺陷的。