PHP MYSQL将数据插入2个表中

时间:2012-06-01 06:16:14

标签: php mysql sql

嘿所有我目前在插入php文件时遇到问题

我有一个表单..用户输入详细信息...我的表单..事件名称,事件日期和位置 基本上是有效的一点 是 首先,我想在2个表中添加一个条目:事件和结果

将条目添加到事件中没有问题

但它没有在“结果”中添加相同的条目

事件表包含以下列:事件ID,事件名称,事件日期和位置

结果表包含:活动ID,会员ID,活动名称,分数和地点

事件ID是自动增量

所以它会自动为其分配ID

并将其应用于两个表

事件ID中的自动增量

工作的位是

将条目插入事件表

但因为事件表和结果表都有“事件名称

我希望这个php完全插入事件表的详细信息

但同时,只需将eventname插入结果表

即可

但事件中的EventID必须与结果中的EventID生成的数字相同..

以下是我的代码:所有帮助真的很感激!!!

<?

        $pdo = new PDO('mysql:host=localhost;dbname=clubresults', 'root', '12345678');
    #Set Error Mode to ERRMODE_EXCEPTION.
    $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  

$query = $pdo->query('SELECT EventID, EventName, EventDate, Location from events');
$rowset = array();

if ($query) {
  while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
    // Build array of rows
    $rowset[] = $row;
  }    

  // Output header first
  $headrow = $rowset[0];
  print("<table border=\"1\">\n<tr>\n");
  // Use $rowset[0] to write the table heading
  foreach ($headrow as $col => $val) {
    printf("<th>%s</th>\n", $col);
  }
  print("</tr>");

  // Then output table rows.
  // Outer loop iterates over row
  foreach ($rowset as $row) {
     print("<tr>");
     // Inner loop iterates over columns using $col => $val
     foreach ($row as $col => $val) {
        // We don't know your column names, but substitute the first column (the ID) for FIRSTCOL here
        printf("<td><a href=\"adminlistresults.php?EventID=%s\">%s</a></td>\n", $row['EventID'],$val);
     }
     print("</tr>");
  }
}
print("</table>");
?>
    </form>
</div>




<?

        $pdo = new PDO('mysql:host=localhost;dbname=clubresults', 'root', '12345678');
    #Set Error Mode to ERRMODE_EXCEPTION.
    $pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);  

$stmt=$pdo->prepare('INSERT INTO events (EventName, EventDate, Location)
VALUES (:EventName, :EventDate, :Location)');


  $stmt->bindValue(':EventName', $_POST['EventName']);
  $stmt->bindValue(':EventDate', $_POST['EventDate']);
  $stmt->bindValue(':Location', $_POST['Location']);

  $stmt->execute();   



    ?>
<?
    $int_event_id = $_GET["EventID"];
    if((int)$int_event_id)
    {
$stmt=$pdo->prepare('INSERT INTO results (EventName, EventID)
VALUES (:EventResultsName, $int_event_id)');
  $stmt->bindValue(':EventName', $_POST['EventResultsName']);
      $stmt->execute();    
      }
      ?>

2 个答案:

答案 0 :(得分:1)

如果插件始终按顺序进行,我会使用$pdo->lastInsertId()(请参阅:http://www.php.net/manual/en/pdo.lastinsertid.php

所以,我认为这一行是错误的:

$int_event_id = $_GET["EventID"];

我会这样写:

<?
    $stmt = $pdo->prepare('
              INSERT INTO results (EventName, EventID)
              VALUES (:EventResultsName, :EventId)
            ');
    $stmt->bindValue(':EventName', $_POST['EventResultsName']);
    $stmt->bindValue(':EventId', $pdo->lastInsertId());
    $stmt->execute();    
?>

请注意,这假设在插入事件后立即插入结果。

你可以使用MySQL的原生last_insert_id()函数在没有绑定变量的情况下做同样的事情,如下所示:

<?
    $stmt = $pdo->prepare('
              INSERT INTO results (EventName, EventID)
              VALUES (:EventResultsName, last_insert_id())
            ');
    $stmt->bindValue(':EventName', $_POST['EventResultsName']);
    $stmt->execute();    
?>

然而,这比前一个例子更不便携。但是,pdo的lastInsertId()也不完全与RDBMS无关(参见文档),所以如果你想要定位另一个RDBMS,你必须修复这段代码

答案 1 :(得分:0)

假设Event实体代表一个事件,Result实体代表特定成员的事件结果。因此Event - &gt;之间存在1&gt; n关系。 Result

问题

这意味着,有时您会收到需要插入EventResult数据的请求,而其他人只会有Result个数据。在后一种情况下,您将能够从请求_GET[EventId]获取EventId。

在第一种情况下,您将不会设置此EventId,并且由于您正在执行基于检查if((int)$int_event_id)的第二个插入内容,因此永远不会插入Result

解决方案

您应该做的第一件事是检查是否_GET["EventId"] isset 。如果不是,则您需要同时插入EventResult。在这种情况下,EventId将从最后一个插入的语句中获取,如下所示:

$pdo->lastInsertId()

如果`_GET [“EventId”] isset ,你应该只进行第二次插入。