Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP处理MYSQL进程问题_Php_Mysql_Sql - Fatal编程技术网

PHP处理MYSQL进程问题

PHP处理MYSQL进程问题,php,mysql,sql,Php,Mysql,Sql,我有一个开票流程,创建5个表并填充适当的数据,然后在这5个表的基础上构建第6个最终表。这是大约14个查询,我正在考虑使用PHP来处理它们,因为一些日期变量需要更改 如果我把所有14个按顺序排列并运行它,它就会完美地工作。您想在php中将整个序列放在一条语句中吗?示例如下: $TheWholeShow = whole sql sequence $date=$_POST["date"] mysqli_query($connect,$TheWholeShow) 还是你想把它拆散 $part1 = b

我有一个开票流程,创建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脚本可能是一个更好的选择?

这确实是一个棘手的选择

首先,在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)

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

您必须将其分解。PHP中的底层mysql驱动程序不允许在单个query()调用中执行多个查询
提交/
回滚。通过这种方式,您可以拆分查询(正如@Marc B所述,底层驱动程序不允许多个查询,这是您必须做的),如果您愿意,您可以创建一个存储过程来执行此操作-具体取决于您的MySQL版本。@Marc B,有,但不建议使用此操作@比尔:不管怎么说,只要启动多个连接就行了。mysqli无法改变底层驱动程序中的基本限制