我已经完成了代码的主要功能,但我有很多"无用"的代码要删除
这是一个例子:
else if(isset($_POST['act']) && $_SESSION['status']<3 && $_POST['act']=='delete_ticket'){
$encid=preg_replace('/'s+/','',$_POST['enc']);
$encid=($encid!='' && strlen($encid)==87) ? $encid:exit();
$mysqli = new mysqli($Hostname, $Username, $Password, $DatabaseName);
$stmt = $mysqli->stmt_init();
if($stmt){
$query = "UPDATE ".$SupportTicketsTable." a
INNER JOIN ".$SupportUserTable." b
ON b.id=a.operator_id
SET b.assigned_tickets= CASE WHEN b.assigned_tickets!='0' THEN (b.assigned_tickets-1) ELSE b.assigned_tickets END
WHERE a.enc_id=?";
if($prepared = $stmt->prepare($query)){
if($stmt->bind_param('s', $encid)){
if($stmt->execute()){
$query = "DELETE FROM ".$SupportMessagesTable." WHERE `ticket_id`=(SELECT `id` FROM ".$SupportTicketsTable." WHERE `enc_id`=?) ";
if($prepared = $stmt->prepare($query)){
if($stmt->bind_param('s', $encid)){
if($stmt->execute()){
$query = "SELECT enc FROM ".$SupportUploadTable." WHERE `ticket_id`=?";
if($prepared = $stmt->prepare($query)){
if($stmt->bind_param('s', $encid)){
if($stmt->execute()){
$stmt->store_result();
$result = $stmt->bind_result($mustang);
if($stmt->num_rows>0){
$path='../upload/';
while (mysqli_stmt_fetch($stmt)) {
if(file_exists($path.$mustang)){
file_put_contents($path.$mustang,'');
unlink($path.$mustang);
}
}
}
$query = "DELETE FROM ".$SupportUploadTable." WHERE `ticket_id`=?";
if($prepared = $stmt->prepare($query)){
if($stmt->bind_param('s', $encid)){
if($stmt->execute()){
$query = "DELETE FROM ".$SupportFlagTable." WHERE `enc_id`=?";
if($prepared = $stmt->prepare($query)){
if($stmt->bind_param('s', $encid)){
if($stmt->execute()){
$query = "DELETE FROM ".$SupportTicketsTable." WHERE `enc_id`=?";
if($prepared = $stmt->prepare($query)){
if($stmt->bind_param('s', $encid)){
if($stmt->execute()){
echo json_encode(array(0=>'Deleted'));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
}
else
echo json_encode(array(0=>mysqli_stmt_error($stmt)));
exit();
}
正如你所看到的,mysqli连接有太多的if
语句:这是我想要删除的部分,有办法删除它们吗?我试图将它封装在try
和catch
之间,但代码无论如何都会返回成功的echo
(这是一个AJAX调用)
我读到mysqli在try-and-catch函数方面遇到了一些问题,所以我看了一下PDO,但我不是专家,我不知道我是否能得到与我发布的代码相同的结果,我也读到我必须将错误模式更改为PDO::ERRMODE_EXCEPTION
,但我还不太清楚这一点
基本上:有人能向我解释PDO是如何处理错误的吗?
首先,将mysqli错误发送到客户端的想法是非常错误的。客户端根本不知道该怎么处理它。所以,您需要一些其他方法来处理错误。
我想说,仅仅500个响应状态就足够了。你可以用你的AJAX代码来检查它,并展示一些借口。
而错误消息eiself必须记录在服务器端,以供您将来参考。
你同意这样的设置吗?
假设你同意。
Mysqli方法#1:
您可以更改每个
if(statement){
至
statement or trigger_error($mysqli->error);
像
$prepared = $stmt->prepare($query) or trigger_error($mysqli->error);
这样就不需要嵌套的if:第一个mydsli错误将中止脚本执行。
Mysqli方法#2:
创建一个包装器函数来调用像这样的查询是一个非常好的主意
$query = "DELETE FROM ".$SupportMessagesTable." WHERE `ticket_id`=(SELECT `id` FROM ".$SupportTicketsTable." WHERE `enc_id`=?) ";
$db->query($query, $encid);
为此,您可以使用我的safeMysql库。以下是一个包含两个第一个查询的示例:
$query = "UPDATE ".$SupportTicketsTable." a
INNER JOIN ?n b
ON b.id=a.operator_id
SET b.assigned_tickets= CASE WHEN b.assigned_tickets!='0' THEN (b.assigned_tickets-1) ELSE b.assigned_tickets END
WHERE a.enc_id=?i";
$db->query($query,$SupportUserTable, $encid);
$query = "DELETE FROM ?n WHERE `ticket_id`=(SELECT `id` FROM ?n WHERE `enc_id`=?i) ";
$db->query($query, $SupportUserTable, $SupportTicketsTable, $encid);
$query = "SELECT enc FROM ?n WHERE `ticket_id`=?i";
$mustang = $db->getOne($query, $SupportUserTable, $encid);
if($mustang){
等等
例外情况说明
异常只是CCD_ 6;小死亡";法语(字面意思。尽管它有另一个不那么直接的含义)。它实际上是本地死亡()。它将终止进一步的脚本执行-请注意,嵌套if的确切目的是。
因此,在使用PDO时,您可以将所有语句一个接一个地写入,而无需进行错误检查。PDO将在内部执行并抛出异常,从而终止进一步的执行。
可以捕获异常,但这不是必需的。可以让它过去,它将被转换为PHP错误,可以记录下来。