我正在尝试将一些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 ()
) );
}
答案 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(跨站点脚本)类型攻击等...
相信我,即使你认为自己没有任何值得去做的东西,也可以“偷”"在您的网站上。在这样的事情上学习正确的方法然后艰难的方式会更好。对不起,如果我对此有点苛刻,但如果你打算做任何事情,这是一个非常重要的概念。严肃的"编码
只是因为某些东西不能正常工作,例如代码"样本"我提供的(我明确表示我没有测试过)。并不意味着它存在根本问题(这是一个简单的复制粘贴错误)。 "错误"有效的代码基本上是有缺陷的。