php - 如何将多个图像插入一个mysql数据库行?

标签 php mysql

好吧,我想简单地说一下我的代码有什么问题。下面的代码将图像数据完美地上传到 mysql 数据库中,但有一个障碍。在我的表格上,人们最多可以上传 4 张图片。现在,下面的代码插入了四个不同的行。每个图像 1 行。但是所有四行的标题都是相同的,因为它属于同一个帖子。无论如何我可以做一个逗号分隔的插入,以便单个帖子的所有四个图像排成一行?

enter image description here

<?php
   if(isset($_POST['submitting'])) 
      {
      if(isset($_FILES['file_array']))
         {
            $user = $_SESSION['user_id'];
            $pname = $_POST['Product_Name'];
            $ProPrice = $_POST['Product_fee'];
            $n_array = $_FILES['files_array']['name'];
        $tmp_name_array = $_FILES['files_array']['tmp_name'];
        $type_array = $_FILES['files_array']['type'];
        $size_array = $_FILES['files_array']['size'];
        $error_array = $_FILES['files_array']['error'];
        for($i = 0; $i < count($tmp_name_array); $i++)
        {
            if(move_uploaded_file($tmp_name_array[$i], "data/profile/posted_data/".$n_array[$i]))
            {
                $query = mysqli_query($conn, "INSERT INTO posts (userid, post_title, file, type, size, image_date) VALUES ('$user', '$pname', '$n_array[$i]', '$type_array[$i]', '$size_array[$i]', now())");
                echo '<div class="form_message_box">' . $n_array[$i] . '   ' . 'Uploaded Successfully' . '</div>' . '<br>';
                if($query) 
                                        {
                       echo '' . '<br>';
                    }
                        else
                    {
                       echo 'failed!' . '<br>';
                                        }
            }
        }
    }
 }
?>


            $posts = "SELECT * FROM posts WHERE userid='$user'";
        $posts_result = mysqli_query($conn, $posts);
        $res = mysqli_num_rows($posts_result);
        while ($posts_result_rows = mysqli_fetch_assoc($posts_result)) {
                                  $post_image = $posts_result_rows['files'];
                            }

                            <tr>
                <td width="220">
                <?php 
                                <img src="<?php echo "data/profile/posted_data/".$post_image; ?>" width="220" height="220"><hr>

                </td>        
            </tr>

    <?php
            }
    echo "</table>";                
    ?>

最佳答案

我认为您需要一个不同的架构:

Table 1:
- userid
- id 
- post_title

Table 2:
- id
- post_id (FK for table 1)
- file
- type
- size
- image_date
- sort (if you want to sort the images)

使用关系 1:many,您可以为一个标题添加任意数量的图像,同时没有任何重复数据。

这个答案的优点:

  • 更好的数据库性能和更好的模式
  • 更简单的 SQL 查询(INNER JOINDISTINCT BY)

你现在想要实现的目标的缺点(如果你继续你现在的逻辑,你想将文件名存储到单个字符串中用于单个帖子):

  • 性能较慢
  • 当您为单个帖子获取数据时(例如 Dadashi.jpg, 3.jpg, 2.jpg ),您必须使用类似 explode() 的函数然后循环运行它们以便在 <img> 中显示它们.
  • 当你想为帖子添加图片时,你必须获取 file然后添加新文件名的字符串,然后是UPDATE它回到你的 table 上

一个例子:

获取所有帖子(我会使用 prepared statement ):

if($stmt = $con->prepare("SELECT userid, id, post_title FROM table1")){ /* FETCH ALL POST QUERY */
  $stmt->execute(); /* EXECUTE QUERY */
  $stmt->store_result(); /* NECESSARY WHEN NESTING A SECOND STATEMENT */
  $stmt->bind_result($userid,$id,$post_title); /* BIND RESULT TO THESE QUERIES */
  while($stmt->fetch()){ /* START FETCHING ALL POST RESULTS */

    ?>
      <tr> <!-- START ROW -->
        <td><?php echo $post_title; ?></td> <!-- FIRST COLUMN IS THE TITLE -->
        <td> <!-- SECOND COLUMN IS THE FILES ATTACHED FOR THIS POST -->
    <?php

    if($stmt2 = $con->prepare("SELECT post_id, file, type, size, image_date, sort FROM table2 WHERE id = ?")){ /* PREPARE THE QUERY THAT WILL FETCH ALL FILES ATTACHED FOR THE CURRENT POST */
       $stmt2->bind_param("i",$id); /* BIND THIS VARIABLE TO THE QUERY; i STANDS FOR INTEGER */
       $stmt2->execute(); /* EXECUTE QUERY */
       $stmt2->store_result(); 
       $stmt2->bind_result($postid,$file,$type,$size,$imagedate,$sort); /* BIND THE RESULTS TO THESE VARIABLES */
       while($stmt2->fetch()){ /* START FETCHING ALL FILES FROM THE CURRENT FETCHED POST */
         ?>
           <img src="data/profile/posted_data/<?php echo $file; ?>" width="220" height="220"><br>
         <?php
       } /* END OF FETCHING FILES FOR THE CURRENT FETCHED POST */
       $stmt2->close();
    } /* END OF SECOND PREPARED STATEMENT */
    ?>
        </td> <-- END OF COLUMN -->
      </tr> <!-- END OF ROW -->
    <?php

  } /* END OF WHILE LOOP */
  $stmt->close();
} /* END OF PREPARED STATEMENT */

关于php - 如何将多个图像插入一个mysql数据库行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32196127/

相关文章:

php - 文本文件中的递增数字

php - 为什么这个 PHP 数组只返回第一条记录?

php - 在 PHP 中有很多下拉菜单的情况下处理 Select 选项

mysql - SQL - 同步非规范化表

MySQL 合并 2 个具有相同 Id 值的表

mysql - 一个基本的 sql 查询示例

php - 使用 php cURL 发送图像

php - 通过 PHPMailer 发送带附件的电子邮件

mysql - 一个查询中存在多个 GROUP_CONCAT

mysql - 我如何找到服务器的地理坐标/位置?