我有这个数据库连接代码:
$host = 'localhost';
$db = 'cssnewlogin';
$user = 'root';
$pass = '';
$charset = 'utf8';
//We do the connection:
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, FALSE);
我执行了一个简单的 INSERT:
$sthinsert = $pdo->prepare(
"INSERT INTO lithuania_customers_2016
(user_id, customer_db_id, campaign_id)
VALUES (:user_id, :customer_db_id, :campaign_id)"
);
$sthinsert->bindValue(':user_id', $user_id, PDO::PARAM_INT);
$sthinsert->bindValue(':customer_db_id', $customer_db_id, PDO::PARAM_INT);
$sthinsert->bindValue(':campaign_id', $campaign_id, PDO::PARAM_INT);
$sthinsert->execute();
在什么时候我必须这样做,die();
以便在执行所需的代码后没有其他意外行为?
在这种情况下,答案是从不。
不一定会有意外行为,除非
INSERT
您尝试做其他事情之后。即使是 PDO 连接也不需要关闭,尽管您可以根据需要关闭。如果你不关闭它,PHP 会在脚本结束时关闭它。
从PHP 手册:
此答案中的更多详细信息:执行语句后是否需要关闭与 PDO 的连接?
您不必从
dies()
任何地方填写所有内容,而是控制您的代码。例如,如果INSERT
在循环内或条件内,if then else
请检查评估是否正确完成以及代码是否通过您希望它去的地方,而不是停留在无限循环或类似的东西中。编辑:
您需要担心的是
execute
通过执行以下操作来验证您是否成功:如果成功
$resultado
,它将为真 (TRUE),您可以在 if 中放置一条消息指示它或传递给另一个操作,如果它不成功,您可以添加一个 else 来指示它。简短的回答:从不。die() 或 exit() 不是结束脚本流程的自然方式。正确的做法是在创建连接或执行语句时使用异常。一个最小的例子是:
长答案:
曾几何时,在一个很远很远的星系中,有一种“尝试连接或死亡”的做法。
这是什么意思?一个错误会
mysql_connect
被默默地忽略。它接收一个空值或布尔值 FALSE,并且必须明确询问最后一个错误是什么。随着测试驱动开发的出现,很明显这是一种不好的做法:不可能进行测试。如果预期的行为是:
通过那个测试是不可能的,因为这样做
die
或者exit
你也会杀死测试运行者。尽管测试超出了这个问题的范围,但重要的是 PDO 是为处理异常而构建的。本质上,您不需要将错误转换为异常,或要求最后一个错误。更重要的是:PDO 实现了自己的异常类型 ( PDOException ),以防您想在更高范围内捕获不同类别的异常。
如何利用这一点?您只需为异常做准备。
在您的同一个示例中,您使用该选项:
然后而不是仅仅做(如你的例子)
你应该这样做(利用例外):
异常的好处是它们向上传播,所以你也可以这样做:
等等。任何 PDO 语句都可以包装在 try/catch 中,否则异常将传播到它在更高范围内找到的 try/catch。
回到测试驱动开发的案例,你可以说:
异常是完全可测试的,它允许您通过修改其行为来继续脚本流程,直到它向用户提供响应。
此外,异常包括$e->getTrace()和$e->getTraceAsString() 方法,它们可以让您确切知道异常发生的位置、该部分代码的调用位置以及该部分代码的位置was called from. from where it was called (依此类推,直到我认为是第十个前身)。
在中等复杂性的应用程序中,很难给每个
die()
人一个清楚地表明错误是什么以及它发生在哪里的消息。例如,10 个不同的脚本可能会调用创建连接的函数。使用 adie()
知道这 10 个中的哪一个是导致失败的那个并非易事。如果我对您的理解正确,
die();
您应该将其放在该行之后$sthinsert->execute();
因此,在执行之后
INSERT
不会继续执行任何其他内容。