我正在尝试将一些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(跨站点脚本)类型的攻击......
相信我,即使你认为你的网站上没有任何值得"窃取"的东西。在这样的事情上,最好学习正确的方法,然后学习困难的方法。对不起,如果我对此有点苛刻,但如果你打算做任何"严肃"的编码,这是一个非常重要的概念。
只是因为某些东西不起作用,例如我提供的代码"示例"(我确实明确表示我没有测试它)。 这并不意味着它存在根本问题(这是一个简单的复制粘贴错误)。 有效的"错误"代码从根本上是有缺陷的。