0

5 つのテーブルを作成して適切なデータを入力し、それらの 5 つのテーブルから 6 番目の最終テーブルを作成する請求プロセスがあります。これは約 14 のクエリです。日付変数が必要なため、PHP を使用してそれらを処理することを考えています。かわった。

14 個すべてを順番に並べて実行すると、問題なく動作します。php の 1 つのステートメントにシーケンス全体を入れたいですか? 以下の例:

$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 スクリプトのインスタンスを一度に 1 つしか実行できないようにする必要があります。特に、長時間実行されるスクリプトの場合はそうです。私が知っている「すぐに使える」明確な方法はないため、単一のインスタンスのみを実行できるようにするカスタム メカニズムを構築する必要がある場合があります。これはおそらく思ったよりも難しいです。

あなたの質問については、TheWolf が書いているように、これでトランザクションを使用することを検討してください。MySQL のすべてのインストールでこれが許可されているわけではありません。トランザクションを使用するということは、データベース全体が 1 つの単位として成功するか失敗するかを示すことを意味します。つまり、「これまでのところ、バーフされました。データはあるが他の部分はありません。カスタム クリーンアップを作成する必要があります。スクリプト」の狂気。

ドライバーでは一度に複数のステートメントを実行できないため、分割する必要がありますが、提案どおりではありません。

$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 に答える