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