-1

嘿,我目前的插入 php 文件有问题

我有一个表单.. 用户在其中输入详细信息.. 对于我的表单.. 事件名称、事件日期和位置基本上工作良好的位首先我想在 2 个表中添加一个条目:事件和结果

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

但它不会在“结果”中添加相同的条目

事件表具有以下列:事件 ID、事件名称、事件日期和位置

结果表有:事件 ID、成员 ID、事件名称、分数和地点

事件 ID 是自动递增的

所以它会自动为其分配一个ID

并将其应用于两个表

事件 ID 中的自动增量

起作用的一点是

将条目插入事件表

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

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

但同时,只需将事件名称插入结果表

但事件中的 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();    
      }
      ?>
4

2 回答 2

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

但是,与前面的示例相比,它的可移植性较差。但是,pdolastInsertId()也不完全与 RDBMS 无关(请参阅文档),因此如果您正在考虑以另一个 RDBMS 为目标,则无论如何您都必须修复这段代码

于 2012-06-01T06:24:02.623 回答
0

假设Event实体代表一个事件,而Result实体代表一个特定成员的事件结果。Event所以->之间存在 1->n 的关系Result

问题

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

在第一种情况下,您将没有此EventId设置,并且由于您基于 check 执行第二次插入if((int)$int_event_id),因此Result永远不会插入。

解决方案

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

$pdo->lastInsertId()

而如果 `_GET["EventId"] isset,你应该只做你正在做的第二次插入。

于 2012-06-01T06:31:46.400 回答