Php Mysqli到PDO-If-else语句以尝试捕获
我正在尝试将一些mysqli代码转换为PDO 在此之前: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
$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;
";