0

我有一个发票流程,它创建 5 个表并填充适当的数据,然后从这 5 个表中构建第 6 个最终表。大约有 14 个查询,由于需要一些日期变量,我正在考虑使用 PHP 来处理它们改变了。

如果我将所有 14 个按顺序排列并运行它,它会完美运行。您是否只想在 php 中的一个语句中包含整个序列?下面的例子:

$TheWholeShow = whole sql sequence
$date=$_POST["date"]
mysqli_query($connect,$TheWholeShow)

或者你想打破它?

$part1 = build table x
$part2 = build table y
$part... the rest
$date=$_POST["date"]
mysqli_query($connect,$part1,$part2,$part3,$part4..and so on)

我觉得这是一个很难在不打字的情况下提出的问题。另外,我是一名新的编码员,我不确定这样做的正确做法。

有人告诉我 bash 脚本可能是更好的选择?

4

1 回答 1

2

这确实是一个棘手的问题。

首先,在 Web 请求的上下文中执行长时间运行的进程通常是一个坏主意。大多数服务器对脚本施加超时 - 这是一个配置值,您的里程会有所不同。随着数据的增长,您最终可能会遇到该超时,并且您的流程将失败。

其次,您需要确保一次只能运行一个 PHP 脚本实例——尤其是当它是一个长时间运行的脚本时。据我所知,没有明显的方法可以“开箱即用”,因此您可能必须构建一个自定义机制以仅允许单个实例运行;这可能比听起来更难。

至于您的问题,正如 TheWolf 所写,请考虑在此使用事务 - 并非所有 MySQL 安装都允许这样做。使用事务意味着您的整个数据库显示为一个单元成功或失败 - 所以没有“我们到目前为止,然后它被吐了,现在我们有一些数据但没有其他位,我们必须编写自定义清理脚本”的疯狂。

由于驱动程序不允许您一次执行多个语句,因此您必须将其拆分 - 但不是您建议的那样。

$date=$_POST["date"]
mysqli_begin_transaction($connect)

$part1 = build table x
mysqli_query($connect,$part1)

$part2 = build table y
mysqli_query($connect,$part2)
$part... the rest
mysqli_query($connect,$part...)

mysqli_commit($connection)

您必须构建自己的回滚逻辑 - 这主要取决于应用程序逻辑,以及您希望如何处理脚本中的故障 -手册有一些进一步的解释。

于 2013-10-01T19:44:00.327 回答