mysqlのinsert idとifステートメントを使用して配列データを挿入する
-
11-12-2019 - |
質問
さて、私は PHP と MySQL のスキルを磨いていますが、一度に複数のテーブルにデータを挿入するのは初めてです。私はこの主題についていくつか読みましたが、正規化されたデータなどの基本と重要性、および情報をさまざまなテーブルに入れる必要性を理解しました。
以下のコードは、私の以前の仕事の一部と、以下で提供されているチュートリアルからつなぎ合わせたものです。 http://www.desilva.biz/mysql/insertid.html 。私が現在直面している問題は、さまざまなテーブルに入力するためのコードを学んだチュートリアルがデータの配列に基づいていないことです。ほぼ機能するようになりましたが、燃料レコード ID をどこで呼び出す必要があるため、使用できません。現在のコードではまだ定義されていません。したがって、現時点でコードを機能させるには、列にカンマを使用するだけです。
最後に、if ステートメントが配列データで正しく機能する方法を完成させたいと思います。これにより、配列の一部として 0 または空白が送信された場合、データベース テーブルの各行に 0 だけの新しい行が挿入されなくなります。データ
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
$con = mysql_connect("ip","username","password");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("jbsrint", $con);
//New Code
$row_data = array();
foreach($_POST['VEH_LIST_REG'] as $row=>$VEH_LIST_REG) {
$WEDATE=$wed_refor;
$VEH_LIST_REG=mysql_real_escape_string($VEH_LIST_REG);
$FR_DIE_L=mysql_real_escape_string($_POST['FR_DIE_L'][$row]);
$FR_DIE_C=mysql_real_escape_string($_POST['FR_DIE_C'][$row]);
$FR_PET_L=mysql_real_escape_string($_POST['FR_PET_L'][$row]);
$FR_PET_C=mysql_real_escape_string($_POST['FR_PET_C'][$row]);
$FR_OIL_L=mysql_real_escape_string($_POST['FR_OIL_L'][$row]);
$FR_OIL_C=mysql_real_escape_string($_POST['FR_OIL_C'][$row]);
$row_data[] = "(',', '$VEH_LIST_REG', '$WEDATE')";
$row_data1[] = "(',','$FR_DIE_L', '$FR_DIE_C', ',')";
$row_data2[] = "(',', '$FR_PET_L', '$FR_PET_C', ',')";
$row_data3[] = "(',', '$FR_OIL_L', '$FR_OIL_C', '$FR_OIL_C')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
#$result = mysql_query( $query);
# get fuelrecord id
$fuelrecords_ID = mysql_insert_id();
# if the user submitted diesel information
if( isset($FR_DIE_L) )
{
# and insert the diesel details
$sql = "INSERT INTO fuelrecords_die(FRD_ID,FR_DIE_L,FR_DIE_C,fuelrecords_ID) VALUES ".implode(',', $row_data1);
$result = mysql_query( $sql);
}
# if the user submitted petrol information
if( isset($FR_PET_L) )
{
# and insert the diesel details
$sql = "INSERT INTO fuelrecords_pet(FRP_ID,FR_PET_L,FR_PET_C,fuelrecords_ID) VALUES ".implode(',', $row_data2);
$result = mysql_query( $sql);
}
# if the user submitted oil information
if( isset($FR_OIL_L) )
{
# and insert the oil details
$sql = "INSERT INTO fuelrecords_oil(FRO_ID,FR_OIL_L,FR_OIL_C,fuelrecords_ID) VALUES ".implode(',', $row_data3);
$result = mysql_query( $sql);
}
if (mysql_query($query))
echo '<font color=\"FFFFFF\" size=\"3px\">Successful inserted</font>';
else
echo '<font color=\"FFFFFF\" size=\"3px\">Insert failed</font>';
}
?>
<?php
mysql_close($con)
?>
表は次のとおりです。
fuelrecords
FR_ID (Auto increment)
VEH_LIST_REG
FR_WE
fuelrecords_die
FRD_ID (AUTO INCREMENT)
FR_DIE_L
FR_DIE_C
fuelrecords_ID (foreign ID from fuelrecords)
fuelrecords_pet
FRP_ID (AUTO INCREMENT)
FR_PET_L
FR_PET_C
fuelrecords_ID (foreign ID from fuelrecords)
fuelrecords_oil
FRO_ID (AUTO INCREMENT)
FR_OIL_L
FR_OIL_C
fuelrecords_ID (foreign ID from fuelrecords)
基本的に、車両の燃料使用量とコストを記録することが目的です。ガソリン、ディーゼル、オイルのデータが常に存在するとは限らないため、必要なデータのみが記録されるように別のテーブルが作成されます。これが明確になることを願っています
いつもご助力とご支援を賜りますよう、よろしくお願い申し上げます。
解決
コードを正しく理解していれば、テーブルが 4 つあることになります。 fuelrecords
, fuelrecords_die
, fuelrecords_pet
, fuelrecords_oil
.
3つのテーブル fuelrecords_die
, fuelrecords_pet
, fuelrecords_oil
それぞれに外部キーがあります fuelrecords_id
に fuelrecords.fr_id
.
複数のタプルを挿入したいとします。 fuelrecords
追加のデータが提供された場合は、複数のタプルが他の 3 つのテーブルに追加されます。私は、 fuelrecords.fr_id
列は自動増分主キーです。
複数のタプルを燃料レコードに挿入し、それぞれに新しい fr_id を持たせるには、列の値を渡さないだけです。 fr_id
. 。これは合格と同等です NULL
価値として。MySQL は各タプルに一意の連続番号を自動的に挿入します。
その後、電話をかけることができます mysql_insert_id()
を得るために 初め 挿入されたID。使用する mysql_affected_rows()
挿入されたタプルの数を取得できます。これは、最後に挿入されたすべてのタプルの ID を取得するのに十分な情報です。1つ目は mysql_insert_id()+0
2番目は mysql_insert_id()+1
, 、、、最後は mysql_insert_id()+(mysql_affected_rows()-1)
.
次のステップでは、入力データを再度繰り返して、 fuelrecords_id
前述の方法を使用して、他の 3 つのテーブルのそれぞれのタプルに追加します。もし $i
入力データのインデックスです $_POST['FR_DIE_L'][$i]
(から始まる $i==0
)、 fuelrecords_id
になるだろう mysql_insert_id()+$i
. 。反復することのみが許可されています mysql_insert_id()+mysql_affected_rows()-1
, ただし、いずれにせよ、おそらく同じ数の POST データがあるでしょう。
はるかに簡単ですが、効率は少し劣りますが、次のことを行うだけです。 insert into fuelrecords
次に、単一の POST データ オブジェクトごとに 1 つを他の 3 つのテーブルに挿入します。計算する必要はありません fuelrecords_id
として mysql_insert_id()
各挿入後に正しい ID が得られます。
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
$row_data = array();
// shorthand for mysql_real_escape_string
function esc($value) {
return mysql_real_escape_string($value);
}
// all tuples for fuelrecords to be inserted
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
$row_data[] = "(NULL, '".esc($VEH_LIST_REG)."', '".esc($wed_refor)."')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
$result = mysql_query($query);
# get first fuelrecord id
$first_fuelrecords_id = mysql_insert_id();
// all tuples for the other 3 tables. insert only if data is givin.
$die_data = array();
$pet_data = array();
$oil_data = array();
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
// calculate the right fuelrecords_id for this tuple
$fuelrecords_id = (int)($first_fuelrecords_id + $row);
// insert for fuelrecords_die
if (isset($_POST['FR_DIE_L'][$row]))
{
$die_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_DIE_L'][$row])."', '".esc($_POST['FR_DIE_C'][$row])."')";
}
// insert for fuelrecords_pet
if (isset($_POST['FR_PET_L'][$row]))
{
$pet_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_PET_L'][$row])."', '".esc($_POST['FR_PET_C'][$row])."')";
}
// insert for fuelrecords_oil
if (isset($_POST['FR_OIL_L'][$row]))
{
$oil_data[] = "(NULL, ".$fuelrecords_id.", '".esc($_POST['FR_OIL_L'][$row])."', '".esc($_POST['FR_OIL_C'][$row])."')";
}
}
// insert the tuples into fuelrecords_die
if (!empty($die_data))
{
$sql = "INSERT INTO fuelrecords_die(FRD_ID, fuelrecords_ID, FR_DIE_L, FR_DIE_C) VALUES ".implode(',', $die_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_pet
if (!empty($pet_data))
{
$sql = "INSERT INTO fuelrecords_pet(FRP_ID, fuelrecords_ID, FR_PET_L, FR_PET_C) VALUES ".implode(',', $pet_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_oil
if (!empty($oil_data))
{
$sql = "INSERT INTO fuelrecords_oil(FRO_ID, fuelrecords_ID, FR_OIL_L, FR_OIL_C) VALUES ".implode(',', $oil_data);
$result = mysql_query( $sql);
}
}
?>
主題から外れた小さな追加:大文字の変数名は使用しないようにしてください。通常、大文字の識別子は定数として保存されます。
define("MY_SHORT_PI", 3.14159265);
define("MY_CONST", "foobar");
$my_variable = "bat";
echo "I am a constant ".MY_SHORT_PI;
echo "Me too ".MY_CONST;
echo "I am a variable ".$my_variable;
これは PHP インタープリタには影響しません。これは、コードを他の人が読みやすいようにするための一般的な表記法にすぎません。世の中には次のようなスタイルガイドがたくさんあります PEARのもの.
2 番目の例 (コメントを参照)
<?php
$wedrf=trim($_POST['FR_WE']);
list($d, $m, $y) = explode('/', $wedrf);
$mk=mktime(0, 0, 0, $m, $d, $y);
$wed_refor=strftime('%Y-%m-%d',$mk);
// VALUES strings for fuelrecords
$row_data = array();
// temporary storage for just _L and _C values
$die_data_tmp = array();
$pet_data_tmp = array();
$oil_data_tmp = array();
// VALUES strings for the three tables
$die_data = array();
$pet_data = array();
$oil_data = array();
// shorthand for mysql_real_escape_string
function esc($value) {
return mysql_real_escape_string($value);
}
// all tuples for fuelrecords to be inserted
foreach($_POST['VEH_LIST_REG'] as $row => $VEH_LIST_REG) {
// check if diesel values are greater than 0
if (0 < (int)$_POST['FR_DIE_L'][$row] && 0 < (int)$_POST['FR_DIE_C'][$row])
$die_data_tmp[$row] = array($_POST['FR_DIE_L'][$row], $_POST['FR_DIE_C'][$row]);
// check if petrolium values are greater than 0
if (0 < (int)$_POST['FR_PET_L'][$row] && 0 < (int)$_POST['FR_PET_C'][$row])
$pet_data_tmp[$row] = array($_POST['FR_PET_L'][$row], $_POST['FR_PET_C'][$row]);
// check if oil values are greater than 0
if (0 < (int)$_POST['FR_OIL_L'][$row] && 0 < (int)$_POST['FR_OIL_C'][$row])
$oil_data_tmp[$row] = array($_POST['FR_OIL_L'][$row], $_POST['FR_OIL_C'][$row]);
// check if at least one of the 3 tables will get tuples. if not just continue
// with the next and don't assign this fuelrecord tuple to $row_data
if (! isset($die_data_tmp[$row]) && ! isset($pet_data_tmp[$row]) && ! isset($oil_data_tmp[$row]))
continue;
// all values are at least 1, so add this tuple to our inserts
$row_data[$row] = "(NULL, '".esc($VEH_LIST_REG)."', '".esc($wed_refor)."')";
}
if (!empty($row_data)) {
$query = 'INSERT INTO fuelrecords(FR_ID, VEH_LIST_REG, FR_WE) VALUES '.implode(',', $row_data);
$result = mysql_query($query);
# get first fuelrecord id
$current_fuelrecords_id = mysql_insert_id();
// all tuples for the other 3 tables. insert only if data is givin.
foreach($row_data as $row => $VEH_LIST_REG) {
// insert for fuelrecords_die
if (isset($die_data_tmp[$row]))
{
$die_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($die_data_tmp[$row][0])."', '".esc($die_data_tmp[$row][1])."')";
}
// insert for fuelrecords_pet
if (isset($pet_data_tmp[$row]))
{
$pet_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($pet_data_tmp[$row][0])."', '".esc($pet_data_tmp[$row][1])."')";
}
// insert for fuelrecords_oil
if (isset($oil_data_tmp[$row]))
{
$oil_data[] = "(NULL, ".$current_fuelrecords_id.", '".esc($oil_data_tmp[$row][0])."', '".esc($oil_data_tmp[$row][1])."')";
}
// increment the fuelrecords_id for the next tuple.
++$current_fuelrecords_id;
}
// insert the tuples into fuelrecords_die
if (!empty($die_data))
{
$sql = "INSERT INTO fuelrecords_die(FRD_ID, fuelrecords_ID, FR_DIE_L, FR_DIE_C) VALUES ".implode(',', $die_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_pet
if (!empty($pet_data))
{
$sql = "INSERT INTO fuelrecords_pet(FRP_ID, fuelrecords_ID, FR_PET_L, FR_PET_C) VALUES ".implode(',', $pet_data);
$result = mysql_query( $sql);
}
// insert the tuples into fuelrecords_oil
if (!empty($oil_data))
{
$sql = "INSERT INTO fuelrecords_oil(FRO_ID, fuelrecords_ID, FR_OIL_L, FR_OIL_C) VALUES ".implode(',', $oil_data);
$result = mysql_query( $sql);
}
}
?>