【问题标题】:PHP/MySQL: Insert Into Table 1 values from a Foreign Key's TablePHP/MySQL:将外键表中的值插入表 1
【发布时间】:2018-04-26 01:42:23
【问题描述】:

我正在为一个班级开发桌面 RPG 怪物数据库,我需要使用以下参数将值插入到我的怪物表中:Monster Table

CREATE TABLE Monsters (
ID int NOT NULL AUTO_INCREMENT,
Name varchar(100) NOT NULL,
HP int unsigned NOT NULL,
MP int unsigned NOT NULL,
AC int unsigned NOT NULL,
MonsterType_ID int NOT NULL,
PRIMARY KEY(ID),
FOREIGN KEY(MonsterType_ID) REFERENCES MonsterType(ID) ON DELETE CASCADE
) ENGINE=InnoDB;

我还有一个MonsterType Table

CREATE TABLE MonsterType (  
ID int NOT NULL AUTO_INCREMENT,  
Name varchar(100) NOT NULL,  
PRIMARY KEY (ID)  
) ENGINE=InnoDB;

我设置了 PHP 代码:PHP Monster Query

if (isset($_POST["submit"])) {
    if( (isset($_POST["Name"]) && $_POST["Name"] !== "") && 
    (isset($_POST["HP"]) && $_POST["HP"] !== "") &&
    (isset($_POST["MP"]) && $_POST["MP"] !== "") &&
    (isset($_POST["AC"]) && $_POST["AC"] !== "") &&
    (isset($_POST["MonsterType_ID"]) && $_POST["MonsterType_ID"] !== "") ) {



            $query = "INSERT INTO Monsters ";
            $query .= "(Name, HP, MP, AC, MonsterType_ID) ";
            $query .= "VALUES (";
            $query .= "'".$_POST["Name"]."',";
            $query .= "'".$_POST["HP"]."',";
            $query .= "'".$_POST["MP"]."',";
            $query .= "'".$_POST["AC"]."',";
            $query .= "'".$_POST["MonsterType_ID"]."');";

            $result = $mysqli->query($query);

当我转到Add Monsters 时,Monster Type 字段只接受与 MonsterType.ID 索引对应的整数值。相反,我希望能够在文本字段中输入MonsterType Names

INSERT INTO MonsterType (Name)
VALUES
    ('Abberation'),
    ('Beast'),
    ('Celestial'),
    ('Construct'),
    ('Dragon'),
    ('Elemental'),
    ('Fey'),
    ('Fiend'),
    ('Giant'),
    ('Humanoid'),
    ('Monstrosity'),
    ('Ooze'),
    ('Plant'),
    ('Undead');

并将相应的类型名称的 ID 插入到数据库中。

我已经可以使用此查询display 与 Monster 关联的 MonsterType:Monster Display

$query = "SELECT Monsters.ID AS `mID`, 
          Monsters.Name AS `MName`, Monsters.MonsterType_ID, 
          MonsterType.Name FROM Monsters ";
$query .= "inner join MonsterType ON Monsters.MonsterType_ID = MonsterType.ID 
          ORDER BY MonsterType.Name ASC";
$result = $mysqli->query($query);

if ($result && $result->num_rows > 0) {
    echo "<div class='row'>";
    echo "<center>";
    echo "<h2>The Monster Database</h2>";
    echo "<table>";
    echo "<tr><th>Name</th><th>Type</th>
    <th></th><th></th></tr>";
    while ($row = $result->fetch_assoc())  {
        echo "<tr>";    
        //Output FirstName and LastName
        echo "<td>" .$row["MName"]."</td>";
        echo "<td>" .$row["Name"]."</td>";

我只是不确定如何更改我的插入查询,以便它接受文本字段中的 MonsterType.Name 并在我的 Insert into Monsters 表查询中使用与该 MonsterType.Name 关联的 MonsterType.ID。

当然,理想情况下,我希望我的 Monster Type 字段成为所有 MonsterType.Names 的下拉列表,但我在使用 HTML code embedded in a PHP block 进行下拉字段时遇到问题。

 echo '
    <div class="row">
    <label for="left-label" class="left inline">

    <h2>Add a monster</h2>
    <form method="POST" action="addMonsters.php">

    <p> Monster Name: <input type="text" name="Name">
    <p> Hit Points: <input type="text" name="HP">
    <p> Mana Points: <input type="text" name="MP">
    <p> Armor Class: <input type="text" name="AC">
    <p> Monster Type: <input type="text" name="MonsterType_ID">
    /////// This didn't work
    <p>Monster Type: <select name="Name">
    <option></option>
    <?php
         $query = "SELECT DISTINCT Name FROM MonsterType";
         $result = $mysqli->query($query);
         if($result && $result->num_rows>=1){
            while($row = $result->fetch_assoc()){
               echo "<option value = '".$row['Name']."'>".$row['Name']."/option>";
        }
    }
         else {echo "<h2>No query results</h2>";}
     ?>
     </select>
      ///////////   
    <input type="submit" name="submit" class="button tiny round" value="Add monster" />
    </form>
    ';

如果有人能解决这个问题,那就更好了。

任何指导将不胜感激!谢谢!

编辑:

我已经使用这段代码成功地填充了我的下拉列表:

echo '<p>Monster Type: <select name="MonsterType_ID">';
        echo '<option></option>';

                $query = "SELECT DISTINCT ID, Name FROM MonsterType";
                $result = $mysqli ->query($query);
                if($result && $result->num_rows>=1){
                    while($row2 = $result->fetch_assoc()){
                        if($row2['mID'] == $MonsterID){
                            echo "<option selected value = '".$row2['ID']."'>".$row2['Name']."</option>";
                        }
                        else{
                            echo "<option value = '".$row2['ID']."'>".$row2['Name']."</option>";
                        }
                    }
                }

                else {
                    echo "<h2>No query results</h2>";
                }
        echo '</select></p>';

但是,这不能正确地 POST 到原始查询,并且我收到了我没有填写所有信息的错误消息。 (我在 (select name="MonsterType_ID") 周围缺少引号)但是,我仍然收到“错误!无法添加“.$_POST[“Name”]。”!”;所以这意味着查询的结果是假的。不确定会发生什么,除非 MonsterType.ID 与 Monsters.MonsterType_ID 不匹配。

if (isset($_POST["submit"])) {
    if( (isset($_POST["Name"]) && $_POST["Name"] !== "") && 
    (isset($_POST["HP"]) && $_POST["HP"] !== "") &&
    (isset($_POST["MP"]) && $_POST["MP"] !== "") &&
    (isset($_POST["AC"]) && $_POST["AC"] !== "") &&
    (isset($_POST["MonsterType_ID"]) && $_POST["MonsterType_ID"] !== "")     ) {



            //STEP 2.
                //Create query to insert information that has been posted
            $query = "INSERT INTO Monsters ";
            $query .= "(Name, HP, MP, AC, MonsterType_ID) ";
            $query .= "VALUES (";
            $query .= "'".$_POST["Name"]."',";
            $query .= "'".$_POST["HP"]."',";
            $query .= "'".$_POST["MP"]."',";
            $query .= "'".$_POST["AC"]."',";
            $query .= "'".$_POST["MonsterType_ID"]."'));";
            //$query .= "(SELECT ID FROM MonsterType WHERE Name='".$_POST["MonsterType_ID"]."'));";


            $result = $mysqli->query($query);

            // Execute query




        if($result) {

        $_SESSION["message"] = $_POST["Name"]." has been added!";
            header("Location: readMonsters.php");
            exit;

        }
        else {

        $_SESSION["message"] = "Error! Could not add ".$_POST["Name"]."!";
            header("Location: addMonsters.php");
            exit;
        }
    }
    else {
        $_SESSION["message"] = "Unable to add monster. Fill in all information!";
        header("Location: addMonsters.php");
        exit;
    }

编辑 2:一切正常!下拉列表是正确的,我只需要更改查询以接受正确的参数。

$query = "INSERT INTO Monsters ";
            $query .= "(Name, HP, MP, AC, MonsterType_ID) ";
            $query .= "VALUES (";
            $query .= "'".$_POST["Name"]."',";
            $query .= "'".$_POST["HP"]."',";
            $query .= "'".$_POST["MP"]."',";
            $query .= "'".$_POST["AC"]."',";
            //$query .= "'".$_POST["MonsterType_ID"]."'));";
            $query .= "(SELECT ID FROM MonsterType WHERE ID='".$_POST["MonsterType_ID"]."'));";


            $result = $mysqli->query($query);

也就是说,我将 (SELECT ID FROM MonsterType WHERE Name=...) 更改为 (SELECT ID FROM MonsterType WHERE ID=...)。我的下拉菜单现在成功运行。谢谢尼克的帮助!

【问题讨论】:

  • 欢迎来到 StackOverflow!为了让我们更好地帮助您,您能否更新您的问题,以便它在 minimal, complete, and verifiable example 中显示所有相关代码,展示代码本身,而不是包含它的图像。能够复制代码有助于我们更快地调试它。如需更多信息,请参阅有关how to ask good questions 的帮助文章,并采取tour of the site :)
  • 嗨康纳,我已经更新了我的答案 - 我之前没有时间写完整的东西 - 我认为它有一些你会发现有用的更多信息。
  • 嘿尼克,我最终做了与你提供的类似的事情,我可以成功填充下拉字段,但它实际上不会将 MonsterType.ID 传递给我询问 Monsters.MonsterType_ID 的查询。基本上查询中的 $_POST['MonsterType_ID'] 没有从我的下拉列表中收到 ID,这与您编写的代码类似。
  • 一切正常!我编辑了主要帖子以显示我的更改。谢谢你尼克!
  • 很高兴听到。很高兴能帮上忙。

标签: php html mysql


【解决方案1】:

简短的回答,鉴于您当前的代码结构,更改此行:

$query .= "'".$_POST["MonsterType_ID"]."');";

$query .= "(SELECT ID FROM MonsterType WHERE Name='".$_POST["MonsterType_ID"]."'));";

这将执行一个子查询选择以从 MonsterType 中为提交的名称获取适当的 ID。

长答案

这种方法的问题是,如果用户在 MonsterType_ID 文本框中键入了不是有效 MonsterType 的内容,例如他们错误地将“Aberration”输入为“Abberation”,此查询将失败。您尝试生成下拉列表是正确的方法。你会想要这样的东西:

<p>Monster Type: <select name="MonsterType_ID">
<?php
     $query = "SELECT ID, Name FROM MonsterType";
     $result = $mysqli->query($query);
     if ($result) { 
        while ($row = $result->fetch_assoc()) {
           echo "<option value = \"" . $row['ID'] . "\">" . $row['Name'] . "</option>";
        }
     }
 ?>
 </select>

这将让您选择选项值(在$_POST 中传递给 PHP 的内容)是您需要插入 Monsters 数据库的 ID。这样您就不需要按照简短答案中的描述进行任何预处理(基本上您现有的代码将按原样工作)。

【讨论】:

  • 做到了!谢谢!
【解决方案2】:

您可以在插入时使用选择。

INSERT INTO monsters (your, variable, fields, here, monsterTypeID) 
Select 'varname', 'varname', 'varname', 'varname', monsterTypeID FROM
MonsterTypeNames WHERE name='namevar';

【讨论】:

    【解决方案3】:

    您将需要查询 monstertype 表以根据 monstertype 名称获取 id,并使用检索到的 monstertype id 来构成插入查询的一部分。

    所以解决方案是将其拆分为两个查询或使用插入选择(插入子查询)。如果将其拆分为两个查询,则必须先选择,然后再插入。如果你想在一个查询中完成,你可以使用 insert select

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-18
      • 2019-09-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      相关资源
      最近更新 更多