0

チェックボックスから値の配列を収集してデータベースに挿入するhtmlページがあります。htmlページは、データを収集してデータベースに保存するPHPページに投稿します。

値ごとに、入力した時間など、すべての値で同じである他のいくつかのフィールドを含めたいと思います。implodeを使用して、キャプチャした配列をコンマ区切りのリストに簡単に変換できます。このようなカンマ区切りのIDリストを使用して、レコードを更新および削除します。ただし、それらを挿入したい場合、MYSQLではコンマ区切りのリストを使用できないようです。私の質問は、ループを使用せずに、cコンマ区切りリストの値ごとに1つずつ、レコードを挿入する最も簡単な方法は何ですか。

htmlページ

<input type="checkbox" name="var[]" value=1>
<input type="checkbox" name="var{}" value=2>

PHPページ

$vars = $_POST['var'];

これにより、implodeを使用してコンマ区切りリストに変換できる配列が得られます。

削除するには、私は行くことができます

$sql = "DELETE * from table WHERE id in '$vars'";

更新するには行くことができます

$sql = "UPDATE table, WHERE id in '$vars'";

しかし、Insertに相当するものはないようです。

以下が機能します:

$sql = "INSERT into table (var, timeentered) values (1,now()) (2,now())";

しかし、それは私が私のデータを持っている方法ではありません。私がやりたいのは

$sql = "INSERT into table (var,timeentered) values($vars), now()"もちろん、それは機能しません。

更新と削除に適したカンマ区切りのリストを、挿入用に(1、now)(2、now())のように変換する必要がありますか、それとも別の方法がありますか?

提案をありがとう。

4

5 に答える 5

1

残念ながら、クエリ全体を自分で作成する必要があります。

$sql ="insert into table (var, timeentered) values ";
$sql .= "(".implode(", now()), (", $vars).")";
于 2013-01-31T00:26:18.267 に答える
0

ほとんどの場合、ある種のループ構造を使用してクエリを作成する必要があります。配列を複数の挿入ステートメントで受け入れられるようにする方法を知りたいだけの場合は、慣例とベストプラクティスはさておき、これを実行しないのはなぜですか。

$values = '('.implode('),(', $array).')';

または、すでにCSVを使用している場合は、次のようにします。

$values = '('.implode('),(', explode(',' $csv)).')';

次に、二重引用符を使用してクエリで$valuesを使用できます。

于 2013-01-31T00:58:04.920 に答える
0

私が考えることができる2つのオプション。

あなたが提案するように動的挿入クエリを作成します。ただし、毎回 now() を呼び出すのではなく、単一の日付を挿入するだけです。

$time = gmdate();
$sql = "INSERT into table (var, timeentered) values (1,$time) (2,$time)";

または、以下の単一挿入の準備済みステートメントを使用し、自動コミットをオフにして、トランザクションを開始し、必要な数の挿入のために for ループで準備済みステートメントを実行してから、トランザクションをコミットします。

$sql = "INSERT into table (var, timeentered) values (?,?)"

于 2013-01-31T00:24:23.047 に答える
0

データ セットをループして、複数行の挿入クエリを手動で作成する必要があります。1 つのクエリで複数の行を挿入する場合は、他に方法はありません。これは、これを行うためのより良いインターフェイスを提供する可能性のある特定の DB フレームワークを使用することの範囲外です。もちろん、結局のところ、そのような DB フレームワークは、本質的に、ある時点で複数項目の挿入クエリを手動で構築することになります。

問題は、挿入しようとしているアイテムの数の 1 つで解決される場合があります。一度に少数のレコードのみを挿入する場合は、個々の挿入で準備済みステートメントを使用することを検討することをお勧めします。ただし、一度に何百ものレコードを挿入する場合は、おそらく適切ではありません。

于 2013-01-31T00:27:12.753 に答える
0

mysql データベースでは、列「time_created」のデフォルトをTIMESTAMPのデフォルト CURRENT_TIMESTAMP に設定できます。こうすれば気にする必要はありません。通常の挿入を使用するだけで、「time_created」列が自動的に設定されます。

複数行挿入の他の問題については、$update 配列を作成し、foreach ループを使用して、データのすべての行に対して sql 挿入コマンドを発行できます。

于 2013-01-31T00:28:22.283 に答える