Mysqli到PDO - 如果是else语句尝试catch

时间:2014-11-14 23:57:52

标签: php pdo mysqli

我正在尝试将一些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 () 
    ) );
}

1 个答案:

答案 0 :(得分: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。这是使用$e的常见约定,就像在循环上使用$i进行迭代一样。通常我不会使用这样的短变量,除非变量不是代码的组成部分。在这种情况下,$e不是我期望在捕获之外使用的东西。

我还包含了正确的内容标题。这将有助于jQuery库(如jQuery)在返回数据时正确解析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(跨站点脚本)类型攻击等...

相信我,即使你认为自己没有任何值得去做的东西,也可以“偷”"在您的网站上。在这样的事情上学习正确的方法然后艰难的方式会更好。对不起,如果我对此有点苛刻,但如果你打算做任何事情,这是一个非常重要的概念。严肃的"编码

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