[英]Mysqli to PDO - If else statement to try catch
我正在嘗試將一些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(跨站點腳本)類型的攻擊等。
即使您認為您的網站上沒有任何值得“竊取”的東西,也請相信我。 最好學習正確的方法,然后再艱難地學習類似的方法。 抱歉,如果我對此不太苛刻,但是了解是否打算進行任何“嚴重”編碼是一個非常重要的概念。
僅僅因為某些東西無法正常工作,例如我提供的代碼“ sample”(我明確表示我沒有測試它)。 這並不意味着有一個基本的問題(這是一個簡單的復制粘貼錯誤)。 起作用的“錯誤”代碼從根本上來說是有缺陷的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.