0

所以我正在为一个客户制作一个网站,客户有大量来自他们在 80 年代和 90 年代拍摄的不同乐队的照片,他们想尝试和出售。

我没有像以前的网站那样为每个波段(超过 100 个)制作一个页面,而是尝试制作一个使用 Javascript/PHP 在单击该波段的文本时将图像目录更改为该波段的页面。

到目前为止,我可以使用 PHP 函数在幻灯片文件夹中查找照片,但我无法更新此函数以搜索幻灯片文件夹中的子目录。(例如,当单击“Metallica”时,我清空#imageGal,然后我想将所有新的金属图像从金属文件夹附加到画廊)。

我的 PHP 代码是:

<?php
    $imagesDir = '';
    $images = glob($imagesDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
    echo json_encode($images);
?>

这个 PHP 代码似乎工作得很好。

我使用此 JQuery 代码获取图像:

$('#imageGal').empty();
$.ajax({
    url: "slideshow/getimages.php",
    dataType: 'json',
    success: function(json){
        for(var i=0;i<json.length;i++){
            $('#imageGal').append('<img src="slideshow/' + json[i] + '">');
        }
    }, failure: function(json){
        alert('Something went wrong. Please try again.');   
    }
}); 

当用户点击一个乐队(即Metallica)时,该代码被执行。

$('.options').mousedown(function() {
var name = $(this).attr('id');
        //$('#output').html(name);

        $.ajax({
            type: "POST",
            url: "slideshow/getimages.php",
            data: {
                imageDir: name
            }, success: function(msg){
                alert( "Data Saved: " + msg );
            } 
        });
    $('#imageGal').empty();
    $.ajax({
        url: "slideshow/getimages.php",
        dataType: 'json',
        success: function(json){
            for(var i=0;i<json.length;i++){
                $('#imageGal').append('<img src="slideshow/' + json[i] + '">');
            }
        }, failure: function(json){
            alert('Something went wrong. Please try again.');   
        }
    }); 
});

我无法更改 $imagesDir 变量,但如果我要在 $imagesDir = "Metallica" 变量中手动输入 "Metallica",它会完美加载这些图像。

任何人都可以提供任何帮助/建议吗?我已经在这里待了好几个小时了。感谢一切!

4

2 回答 2

2

我不是 ajax 专家,但您似乎在发布 imageDir。

所以你的 PHP 代码应该寻找 $_POST['imageDir']。

<?php
    $imagesDir = $_POST['imageDir'];
    $images = glob($imagesDir . '*.{jpg,jpeg,png,gif}', GLOB_BRACE);
    echo json_encode($images);
?>

这能解决吗?

于 2013-07-06T00:21:21.827 回答
2

除非你有register_globals,否则你需要通过全局$_POST数组引用变量。$_POST['imagesDir']而不是$imagesDir.

但是,我会以当前的形式声明,简单地替换它是一个非常糟糕的主意,因为有人可能会尝试利用您的代码来列出服务器上的任何目录。

您应该附加父目录以防止利用。像这样的东西:

编辑你必须chdir()在 glob 工作之前的路径。我在下面更新了我的代码。

<?php
    $imagesDir = $_SERVER['DOCUMENT_ROOT']; // this is the root of your web directory
    $images = array();

    // and this line ensures that the variable is set and no one can backtrack to some other
    // directory
    if( isset($_POST['imagesDir']) && strpos($_POST['imagesDir'], "..") === false) {
         $imagesDir .= "/" . $_POST['imagesDir'];
         chdir($imagesDir);

         $images = glob('*.{jpg,jpeg,png,gif}', GLOB_BRACE);
    }    
    echo json_encode($images);
?>
于 2013-07-06T00:21:59.860 回答