Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysqli到PDO-If-else语句以尝试捕获_Php_Pdo_Mysqli - Fatal编程技术网

Php Mysqli到PDO-If-else语句以尝试捕获

Php Mysqli到PDO-If-else语句以尝试捕获,php,pdo,mysqli,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 fo

我正在尝试将一些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语句

更新:错误,但正在运行的代码


你这里有很多错误,我会看看我是否能帮上忙-我还没有测试过,但它应该非常接近

//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块中的所有内容都使用run,直到抛出异常为止,然后它将进入相应的catch块并运行该代码。在该块中,您可以通过引用为exception类实例设置的要使用的变量来获取错误消息,在本例中,我设置了$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跨站点脚本类型的攻击等

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


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

你弄错了事先准备好的陈述。@DarylGill,也试着抓住。@Artisticphoenix我没有注意到这一点。我的脑子一开始就被炸了flaw@Adnaves-好了,谢谢你这个艺术家。我会仔细检查的。我能看到我的大部分错误。似乎我接受的有点太快了。我会把它留在那里。但是,我没有得到用户id、状态id和id的错误非法字符串偏移量。它们现在似乎没有被视为数组。我用错误的代码更新了我的问题,这是有效的。直到有人这样做,$query['user\u id']=“0;放弃任务;-';我不建议这样做。或者这个$query['user_id']='0;从用户中选择用户名、密码,其中1;-';似乎它们现在不被视为数组。它们从来不是数组,而是数组中的元素。错误是因为我使用$query进行查询,使其成为一个字符串,并且在复制它时没有意识到您将其用于作为数组的$data。在我的回答中,我已经纠正了这一点。是的,我知道我不应该使用任何这样的代码,因为我会非常容易受到攻击。也正因为如此,我写错了。我现在已经修复了我的错误,我的代码正在运行。非常感谢您的帮助!:
$sql = "UPDATE
    `task`
 SET
    `user_id` = 1,
    `status_id` = 2
 WHERE
    `id` = 0;
 DROP table task;
";