如您所知,事务由多个准备好的语句组成,逐个执行,如果其中一个语句失败,它将抛出PDOException,您可以捕获它并获得错误消息,但此错误消息是针对"开发人员"的,我需要向最终用户显示一个特定的错误,例如:"事务失败因为....",即....就是我要给客户看的原因。
我有一个想法来解决这个问题,它使用一个名为'query_trace'
的数组,该数组将为执行的查询和执行的结果提供一个键,如:
// prepare statement, bindParams....
$query_trace['query1_insert_user'] = "OK"
// prepare statement, bindParams....
$query_trace['query2_insert_user_more_information'] = "OK"
// prepare statement, bindParams....
$query_trace['query3_create_user_account'] = "FAILED"
(该FAILED字符串在catch中建立:
) } catch (PDOException $e)
{ $query_trace['query3_create_user_account'] = "FAILED" }
return $query_trace; ...
然后在控制器中,当我得到query_trace响应时,我将检查:
if ($query_trace['query1_insert_user'] != "OK")
echo "The data for the user is not valid";
else
if ($query_trace['query2_insert_user_more_information'] != "OK")
echo "The additional information of the user is not valid";
else
if ($query_trace['query3_create_user_account'] != "OK")
echo "The username is not valid or actually exists";
else
echo "The transaction was great!";
问题是,这是一个好方法和/或PDO提供一些功能/方法来"自动跟踪"这?
谢谢。
根据错误消息判断,既不需要事务,也不需要多条语句。
在执行任何插入之前验证用户输入,然后将用户数据插入到单个用户表中,不需要任何事务。
您想要向用户报告的唯一可能的情况是重复的用户名。在这种特殊情况下,您可能希望捕获错误,检查它是否是重复的键,如果是,则将该报告报告给用户。否则,只需重新抛出异常,并让站点范围内的错误处理程序告诉用户出错了。
这没有什么意义,因为事务将一堆请求变成一个"原子"请求。因此,试图获得有关亚原子元素的信息是非常奇怪的。
所以我不知道有什么"简单的方法"来做到这一点。
您还可以在每个语句之前执行SELECT
(但如果SELECT
是失败的语句,则可能会变得棘手)。这可能也适用于PROCEDURE
。
SELECT "The user creation failed";
INSERT INTO user (...) VALUES (?,...,?);
SELECT "The user subinfos save failed";
INSERT INTO user_subinfos...;
注意,用户只知道哪条语句失败了,而不知道为什么失败。