【问题标题】:Insert data into separate tables related by foreign keys将数据插入到由外键关联的单独表中
【发布时间】:2016-11-09 16:14:39
【问题描述】:

我有一个包含两个表的数据库:

帖子:id(主键,自动增量),title_bg,title_en,body_bg,body_en,状态,创建,更新

postimage: id(主键, 自增), post_id, name

当我不使用外键时,具有多个元素的表单可以正常工作。它将帖子的所有详细信息填充到posts表中,并且多个图像正在上传到postimage表中,但它们不相关,因此post_id字段显示0值。

当我使用此查询在 phpMyAdmin 上设置外键时:

ALTER TABLE `postimage` ADD FOREIGN KEY ( `post_id` ) REFERENCES `database_name`.`posts` ( `id` ) ON DELETE RESTRICT ON UPDATE RESTRICT ;

当我创建一个新帖子时,所有值都保存到帖子表中,除了第二个表中的图像。 postimage 表为空。

这是我的代码:

 <?php
    if(isset($_POST['submit'])) {
        $title_bg = $_POST['title_bg'];
        $title_en = $_POST['title_en']; 
        $body_bg = $_POST['body_bg'];
        $body_en = $_POST['body_en'];

        if(isset($_FILES['image'])) {
            foreach($_FILES['image']['name'] as $key => $name) {
                $image_tmp = $_FILES['image']['tmp_name'][$key];

                move_uploaded_file($image_tmp, '../uploads/' . $name);

                $query = "INSERT INTO postimage(name) ";
                $query .= "VALUES('$name')";

                $upload_images = mysqli_query($connection, $query);
            }    
        }

        $status = $_POST['status'];


        $query = "INSERT INTO posts(title_bg, title_en, body_bg, body_en, status, created) ";
        $query .= "VALUES('$title_bg', '$title_en', '$body_bg', '$body_en', '$status', now())";

        $create_post = mysqli_query($connection, $query); 

        header("Location: posts.php");  
    }
    ?>
    <form action="" method="post" enctype="multipart/form-data">
        <div class="form-item">
            <label for="title_bg">Post title BG</label>
            <input type="text" name="title_bg">
        </div>

        <div class="form-item">
            <label for="title_en">Post title EN</label>
            <input type="text" name="title_en">
        </div>    
        <div class="form-item">
            <label for="body_bg">Post body BG</label>
            <textarea id="editor" name="body_bg" rows="10" cols="30"></textarea>
        </div>    

        <div class="form-item">
            <label for="body_en">Post body EN</label>
            <textarea id="editor2" name="body_en" rows="10" cols="30"></textarea>
        </div>    

        <div class="form-item">
            <label for="image">Image</label>
            <input type="file" name="image[]" multiple>
        </div>

        <div class="form-item">
            <label for="status">Post status</label>
            <select name="status">
                <option value="published">published</option>
                <option value="draft">draft</option>
            </select>
        </div>

        <div class="form-item">
            <input type="submit" class="form-submit" name="submit" value="Submit">
        </div>    
    </form>

我还创建了两个新表作为测试:

教师:id、姓名、content_area、房间

学生:id、姓名、homeroom_teacher

当我在学生字段 homeroom_teacher 上设置外键并从 phpMyAdmin 手动插入数据时,它们变得相关,学生表上的 id 变得可点击,并显示与老师的关系。所以手动它工作得很好,问题出在 PHP 代码中。

我需要更改什么查询,以便与posts 表中的post id 和postimage 表中的post_id 建立连接?

我知道我缺少 $_FILES 查询中的 id,但我不知道如何获取它,因为它已经是自动自增字段。

谢谢。

【问题讨论】:

标签: php mysql database phpmyadmin


【解决方案1】:

我认为这是有问题的,因为您首先在 postimage 中添加数据,然后在 post 中添加数据,因此在 postimage 中找不到 post_id 尝试更改查询的位置,例如:`$status = $_POST['status'];

    $query = "INSERT INTO posts(title_bg, title_en, body_bg, body_en, status, created) ";
    $query .= "VALUES('$title_bg', '$title_en', '$body_bg', '$body_en', '$status', now())";

    $create_post = mysqli_query($connection, $query);

    if(isset($_FILES['image'])) {
        foreach($_FILES['image']['name'] as $key => $name) {
            $image_tmp = $_FILES['image']['tmp_name'][$key];

            move_uploaded_file($image_tmp, '../uploads/' . $name);

            $query = "INSERT INTO postimage(name) ";
            $query .= "VALUES('$name')";

            $upload_images = mysqli_query($connection, $query);
        }    
    }

【讨论】:

  • 嗨,比平。我也试过了,但没有任何结果。
  • 给我$connection
  • $connection 是保存 mysqli_connect() 函数的变量。这里是: $connection = mysqli_connect($db_host, $db_user, $db_pass, $db_name); 。连接数据库没有问题。问题出在其他地方。
【解决方案2】:
<?php

if(isset($_POST['status'])) {
  $status = $_POST['status'];
}

if(isset($_POST['submit'])) {
    $title_bg = $_POST['title_bg'];
    $title_en = $_POST['title_en']; 
    $body_bg = $_POST['body_bg'];
    $body_en = $_POST['body_en'];

$connection =  new mysqli("localhost", "USER_XY", "PASSWD","DB"); 

if (mysqli_connect_errno()) {
  printf("Connect failed: %s\n", mysqli_connect_error());
  die ("<h1>can't use Database !</h1>");
  exit();
}
/* change character set to utf8 */
if (!$connection->set_charset("utf8")) {
printf("Error while loading 'character set utf8' : %s\n", $connection->error);
die();
} 

/**
 * First save the Post
 **/
    $query = "INSERT INTO posts(title_bg, title_en, body_bg, body_en, status, created) ";
    $query .= "VALUES('$title_bg', '$title_en', '$body_bg', '$body_en', '$status', now())";

      $result=$connection->query($query);
      // verify results
      if(!$result) {
        $message  = "ERROR SAVING POST : ".$connection->error . "\n";
        $connection->close();
        echo ($message);
        return false;
      }   

/**
 * get the last inster id of the Post
 **/        
    $post_id = $connection->insert_id;
    echo "Post id=".$post_id ."<br>\n";
    if(isset($_FILES['image'])) {
        foreach($_FILES['image']['name'] as $key => $name) {
            $image_tmp = $_FILES['image']['tmp_name'][$key];

            move_uploaded_file($image_tmp, './uploads/' . $name);
/**
 * now insert the image with the post_id
 **/                
    $query = "INSERT INTO `postimage` (`id`, `post_id`, `name`) ";
    $query .= "VALUES (NULL, '".$post_id."', '".$name."');";

                      $result=$connection->query($query);
      // verify results
      if(!$result) {
        $message  = "ERROR INSERT IMAGE : ".$connection->error . "\n";
        $connection->close();
        echo ($message);
        return false;
      } 
        }    
    }
    header("Location: upload_posts.php");  
}
?>
<form action="upload_posts.php" method="post" enctype="multipart/form-data">
    <div class="form-item">
        <label for="title_bg">Post title BG</label>
        <input type="text" name="title_bg">
    </div>

    <div class="form-item">
        <label for="title_en">Post title EN</label>
        <input type="text" name="title_en">
    </div>    
    <div class="form-item">
        <label for="body_bg">Post body BG</label>
        <textarea id="editor" name="body_bg" rows="10" cols="30"></textarea>
    </div>    

    <div class="form-item">
        <label for="body_en">Post body EN</label>
        <textarea id="editor2" name="body_en" rows="10" cols="30"></textarea>
    </div>    

    <div class="form-item">
        <label for="image">Image</label>
        <input type="file" name="image[]" multiple>
    </div>

    <div class="form-item">
        <label for="status">Post status</label>
        <select name="status">
            <option value="published">published</option>
            <option value="draft">draft</option>
        </select>
    </div>

    <div class="form-item">
        <input type="submit" class="form-submit" name="submit" value="Submit">
    </div>    
</form>

【讨论】:

  • 首先你需要在 postimage 的 post_id 字段中添加一个索引。这不是独一无二的! (一个帖子可以有很多postimage)ALTER TABLE postimage ADD CONSTRAINT idAusPosts FOREIGN KEY (post_id) REFERENCES posts(id) ON DELETE RESTRICT ON UPDATE RESTRICT;
  • 请尽量避免只是将代码作为答案转储,并尝试解释它的作用和原因。对于没有相关编码经验的人来说,您的代码可能并不明显。
  • 哇,马丁,太棒了!很好解释。我刚刚尝试过,它完美地保存了所有文件并且它们是相关的。也非常感谢你的代码。 +1。好吧,我想是时候开始使用 OOP 了。弗里茨,我不同意你的看法。该代码非常有用,不值得负分!
【解决方案3】:

可以使用$mysqli-&gt;insert_id; 获得自动增量 ID 更多详情请看:https://php.net/manual/mysqli.insert-id.php

:-)

【讨论】:

  • 是的,这就是缺失的差距。谢谢,马丁。
【解决方案4】:

使用这个:$last_id = mysqli_insert_id($conn); 来获取最后插入的 id。

 <?php
    if(isset($_POST['submit'])) {
        $title_bg = $_POST['title_bg'];
        $title_en = $_POST['title_en']; 
        $body_bg = $_POST['body_bg'];
        $body_en = $_POST['body_en'];
        $status = $_POST['status'];


        $query = "INSERT INTO posts(title_bg, title_en, body_bg, body_en, status, created) ";
        $query .= "VALUES('$title_bg', '$title_en', '$body_bg', '$body_en', '$status', now())";

        $create_post = mysqli_query($connection, $query);

        $last_id = mysqli_insert_id($connection);


        if(isset($_FILES['image'])) {
            foreach($_FILES['image']['name'] as $key => $name) {
                $image_tmp = $_FILES['image']['tmp_name'][$key];

                move_uploaded_file($image_tmp, '../uploads/' . $name);

                $query = "INSERT INTO postimage(post_id, name) ";
                $query .= "VALUES('$last_id', '$name')";

                $upload_images = mysqli_query($connection, $query);
            }    
        }



        header("Location: posts.php");  
    }
    ?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多