【问题标题】:How to create multiple dynamic image slider ? [using PHP, MySQL & vanilla JS only ! ]如何创建多个动态图像滑块? [仅使用 PHP、MySQL 和 vanilla JS ! ]
【发布时间】:2018-12-14 18:12:18
【问题描述】:


我是 PHP 和 JS 编程新手,我的网站项目需要帮助。
在另一个问题中,我遇到了图片发布系统的问题,已解决:
SOS! How to display image albums in posts? [using PHP and MYSQL only].

现在我想用动态图像滑块修改这个发布系统。 (下一关^^)
最后,必须可以向下滚动浏览帖子,并且在每个包含超过 1 张图片的帖子中,必须可以左右滑动浏览此相册的图片.

图像滑块
我受到全屏图像滑块的启发:https://codepen.io/bradtraversy/pen/boydaE
和一个轮播滑块:https://www.youtube.com/watch?v=KcdBOoK3Pfw
它们都是普通但静态的(没有数据库)。


您可以在下面看到我的 php 文件,其中所有内容都汇集在一起​​。

display.php


<!DOCTYPE html>
<html>
<body>
<?php
$db = mysqli_connect("localhost", "root", "", "post_images");    

$result = mysqli_query($db, "SELECT * FROM posts");
while ($row = mysqli_fetch_array($result)) {
   echo "<div class=\"post_container\">";
     echo $row['post_title'];
     echo "<div class=\"image_container\">";
     SELECT img_file, img_title FROM images WHERE post_id = " .$rowx['id_post']);

     if(mysqli_num_rows($resultx) > 0) {
        if(mysqli_num_rows($resultx) == 1) {
           echo "<div class=\"post_image_displayer\">";
             while ($rowx = mysqli_fetch_array($resultx)) {
               echo "<img src='../folder_image_uploads/".$rowx['img_file']."' >";
               echo $rowx['img_title'];
             }
           echo "</div>";
        }
        elseif(mysqli_num_rows($resultx) > 1) {
           echo "<div class=\"post_image_slider\">";
             include_once 'incl_image_slider.php';
           echo "</div>";
        }
     }
     echo "</div>";
   echo "</div>";
}
?>
</body>
</html>


如果此页面上只有 1 滑块,则此代码可以完美运行。你看,我使用了 include_once 'incl_image_slider.php'; 。如果我只使用 include 'incl_image_slider.php'; ,页面会发疯......(仅通过图像滑块)。即使所有东西都有一个 class 并且没有唯一的 id

incl_image_slider.php


<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="includes/incl_carousel_slider_style.css">
</head>

<div class="carousel-container">
    <div class="carousel-slide">
        <?php
        $db = mysqli_connect("localhost", "root", "", "post_images");
        $result = mysqli_query($db, "SELECT * FROM posts");
        $row = mysqli_fetch_array($result);
        $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id =".$row['id_post']);

        $rowz = mysqli_fetch_all($resultx, MYSQLI_ASSOC);
            echo "<img src='folder_img_uploads/".$rowz[0]['img_file']."' >";
            echo "<img src='folder_img_uploads/".$rowz[1]['img_file']."' >";
            echo "<img src='folder_img_uploads/".$rowz[2]['img_file']."' >";
            echo "<img src='folder_img_uploads/".$rowz[3]['img_file']."' >";
            echo "<img src='folder_img_uploads/".$rowz[4]['img_file']."' >";
        ?>
    </div>
</div>
<button class="prevBtn">Prev</button>
<button class="nextBtn">Next</button>

<script src="incl_image_slider_app.js"></script>


问题是,我必须知道每个帖子里面有多少张图片。所以这不能与数据库一起动态使用,有人知道要改变什么吗?

incl_image_slider_app.js

部分来自:https://codepen.io/bradtraversy/pen/boydaE

let sliderImages = document.querySelectorAll(".carousel-slide"),
arrowLeft = document.querySelector(".prevBtn"),
arrowRight = document.querySelector(".nextBtn"),
current = 0;

// Clear all images
function reset()
{
  for (let i = 0; i < sliderImages.length; i++)
  {
    sliderImages[i].style.display = "none";
  }
 }
 // Init slider
 function startSlide()
 {
   reset();
   sliderImages[0].style.display = "block";
 }
 // Show prev
 function slideLeft()
 {
   reset();
   sliderImages[current - 1].style.display = "block";
   current--;
}
// Show next
function slideRight()
{
  reset();
  sliderImages[current + 1].style.display = "block";
  current++;
}
// Left arrow click
arrowLeft.addEventListener("click", function()
{
  if (current === 0)
  {
    current = sliderImages.length;
  }
slideLeft();
});

// Right arrow click
arrowRight.addEventListener("click", function()
{
  if (current === sliderImages.length - 1)
  {
    current = -1;
  }
slideRight();
});

startSlide();


实际上这个图像滑块不滑动,不知道为什么?但它显示了帖子的第一张图片。 在我的 display.php 中,不可能为每个帖子多次带来这个

我希望有人可以帮助我。
最好的问候:)

【问题讨论】:

  • 你做过错误检查吗?
  • 我没有收到任何错误,不幸的是图像滑块不起作用/滑动。而且我不能在一个页面上多次实现滑块,即使没有唯一的 id。我知道,这个话题有点复杂……
  • 你也可以不用javascript,使用css3
  • css 滑块是我首先尝试的,灵感来自youtube.com/watch?v=z74ExMz-cWU,但有人告诉我,将其用于动态发布系统会非常复杂

标签: javascript php mysql image posting


【解决方案1】:

我想你想要这样的东西。我使用了 Flickity Slider(纯 JavaScript)而不是你的 JavaScript,因为我无法让它工作(但话又说回来,我几乎不能在 JavaScript 中编写一个 foreach 循环:(),希望这会给你一些开始。 :)

https://flickity.metafizzy.co/

<!DOCTYPE html>
<html>
<head>
<!-- CSS -->
<link rel="stylesheet" href="https://unpkg.com/flickity@2/dist/flickity.min.css">
<!-- JavaScript -->
<script src="https://unpkg.com/flickity@2/dist/flickity.pkgd.min.js"></script>
</head>
<body>

<?php
$db = mysqli_connect("localhost", "root", "", "post_images");      
$result = mysqli_query($db, "SELECT * FROM posts");
?>

<?php while ($row = mysqli_fetch_array($result)) : ?>

    <div class="post_container">$row['post_title'];

        <?php $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']); ?>

        <?php if (mysqli_num_rows($resultx) == 1) : ?>

        <div class="image_container">

            <div class="post_image_displayer">

                <?php while ($rowx = mysqli_fetch_array($resultx)) : ?>
                <img src='../folder_image_uploads/<?php echo $rowx['img_file']; ?>'><?php echo $rowx['img_title']; ?>
                <?php endwhile; ?>

            </div>

        </div>

        <?php elseif(mysqli_num_rows($resultx) > 1) : ?>

            <div class="main-carousel" data-flickity='{ "cellAlign": "left", "contain": true }'>

                <?php while ($rowx = mysqli_fetch_array($resultx)) : ?>
                <div class="carousel-cell"><img src='../folder_image_uploads/<?php echo $rowx['img_file']; ?>' ></div>
                <?php endwhile; ?>

            </div>

        <?php endif; ?>

    </div>

<?php endwhile; ?>

</body>
</html>

标题中的 CSS 和 JavaScript 文件包含滑块插件。

然后,第一个 SQL 查询获取所有帖子,while 循环遍历每个帖子。

对于每个帖子,第二个 SQL 查询获取当前帖子的图像。

如果只有一张图片,则将其打印在 &lt;div class="image_container"&gt; 中。

如果有多个图像,它们会打印在 &lt;div class="main-carousel"&gt; 中,这会告诉 JavaScript 插件和 data-flickity='{ "cellAlign": "left", "contain": true }' 它需要在滑块中显示它们。

滑块中的各个图像都打印在 &lt;div class="carousel-cell"&gt; 中,这也是插件所必需的。

对所有帖子的所有图像重复此操作,您不需要使用包含文件。

使用来自this postsinisake 的滑块更新

<!DOCTYPE html>
<html>
<head>
<!-- CSS -->
<link rel="stylesheet" href="">
<!-- JavaScript -->
<script src=""></script>
</head>
<body>

<?php
$db = mysqli_connect("localhost", "root", "", "post_images");      
$result = mysqli_query($db, "SELECT * FROM posts");
?>

<?php while ($row = mysqli_fetch_array($result)) : ?>

    <div class="post_container">$row['post_title'];

        <?php $resultx = mysqli_query($db, "SELECT img_file, img_title FROM images WHERE post_id = " .$row['id_post']); ?>

        <?php if (mysqli_num_rows($resultx) == 1) : ?>

        <div class="image_container">

            <div class="post_image_displayer">

                <?php while ($rowx = mysqli_fetch_array($resultx)) : ?>
                <img src='../folder_image_uploads/<?php echo $rowx['img_file']; ?>'><?php echo $rowx['img_title']; ?>
                <?php endwhile; ?>

            </div>

        </div>

        <?php elseif(mysqli_num_rows($resultx) > 1) : ?>

            <div class="slideshow-container">

                <?php $rowsx = mysqli_fetch_all($resultx, MYSQLI_ASSOC); ?>

                <?php foreach ($rowsx as $key => $rowx) : ?>

                  <div class="mySlides fade">
                    <div class="numbertext"><?php echo $key + 1; ?> / <?php echo count($rowsx); ?></div>
                    <img src='../folder_image_uploads/<?php echo $rowx['img_file']; ?>' style="width:100%">
                    <div class="text">Caption Text</div>
                  </div>

                <?php endforeach; ?>

                  <a class="prev" >&#10094;</a>
                  <a class="next">&#10095;</a>
                <div style="text-align:center">

                <?php foreach ($rowsx as $rowx) : ?>
                  <span class="dot"></span>
                <?php endforeach; ?>

                </div>  

            </div>

        <?php endif; ?>

    </div>

<?php endwhile; ?>

</body>
</html>

我在这里所做的更改是,我将第二个 SQL 查询的整个结果存储在一个数组中 ($rowsx),因为这样我可以循环两次(使用 foreach 而不是 while) .

我第一次循环是打印单个图像,当所有图像都打印完后,我第二次循环数组以打印导航的“点”,因为需要有相同的数字点数,因为滑块中有图像。

【讨论】:

  • 我遵循了您的方法,但出现Uncaught TypeError: Cannot read properties of undefined (reading 'classList')的错误
猜你喜欢
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多