2012-03-11 68 views
0

好了,所以虽然我一直在我的PHP和MySQL技能我是新来将数据插入多个表中一气呵成。我已经做了一些关于这个主题的阅读,我很欣赏规范化数据的基础知识和重要性,因此需要将这些信息放入各种表格中。插入用mysql插入ID阵列数据和if语句

我有一些我以前的工作,以及在http://www.desilva.biz/mysql/insertid.html提供的教程拼凑下面的代码在一起。我目前面临的问题是,我学习了用于输入到各种表中的代码的教程不是基于一系列数据,虽然我几乎可以使用它,但我无法使用我的fuelrecords_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) 

基本上目的是记录车辆的燃料使用和成本。由于那里不会总是汽油,柴油和机油的数据,因此单独的表格只需要记录数据。 希望这澄清

一个总是所有帮助和援助深表感谢。

+2

什么都你做什么,从来没有发布与用户ID和口令代码(在这里连接mysql) – Roger 2012-03-11 11:13:07

回答

1

如果我正确理解您的代码,您有4个表格:fuelrecords,fuelrecords_die,fuelrecords_pet,fuelrecords_oil

的3个表fuelrecords_diefuelrecords_petfuelrecords_oil各有一个外键fuelrecords_idfuelrecords.fr_id

你现在要多个元组插入fuelrecords,如果提供额外的数据,多个元组到其他3个表。我假设fuelrecords.fr_id列是一个自动递增主键。

要插入多个元组到燃料记录中,并让它们每个都有一个新的fr_id,那么只是不要为列fr_id传递一个值。这相当于将NULL作为值传递。 MySQL会自动为每个元组插入唯一的连续数字。

之后,您可以拨打mysql_insert_id()获得第一张插入的ID。使用mysql_affected_rows()您可以获取插入元组的数量。这是获取所有最后插入的元组的id的足够信息。首先是mysql_insert_id()+0第二个是mysql_insert_id()+1,......,最后是mysql_insert_id()+(mysql_affected_rows()-1)

在下一步中,使用上述方法,再次遍历输入数据并将fuelrecords_id插入到其他3个表的每个元组中。如果$i是输入数据$_POST['FR_DIE_L'][$i](开始于$i==0)的指数,fuelrecords_idmysql_insert_id()+$i。您只能迭代到mysql_insert_id()+mysql_affected_rows()-1,但您可能会拥有相同数量的POST数据。

一个简单得多但效率稍低的方法是只执行一个insert into fuelrecords,然后为每个单独的POST数据对象插入其他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解释器没有任何影响。这只是一种常见的表示方式,让您的代码可以被其他人阅读。有很多风格指南,如the one from PEAR

第二个示例(见注释)

<?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); 
    } 
} 

?> 
+0

增加了一个长的例子。代码没有经过测试,所以要小心错误。 ;-) – Basti 2012-03-11 12:12:57

+0

代码很好,谢谢你把燃料记录ID放到相应的其他表格中。 我的问题是停止添加空白条目。此外,我刚刚意识到,如果没有记录添加到任何其他表格中,几个星期的车辆记录可能不需要写入燃料记录表中。我猜测最好的方法是让代码可靠地不输入0到表格中,然后如果没有任何其他表格的数据,则用条目加入燃料记录来解决问题。 – Burdie87 2012-03-11 13:12:38

+0

你可以在插入前检查'empty($ _ POST ['FR_DIE_L'] [$ row])'等。 – Basti 2012-03-11 14:11:05