使用提交操作依次显示一张图片 PHP

Showing one image after other using submit action PHP

我正在从目录 'images' 中读取图像,该目录包含多个带图像的文件夹。我想在 div 中显示每张图片,并使用复选框来决定它是否时尚。我正在使用以下代码从目录中读取文件并在浏览器中显示它们。 div是一个接着一个:

<?php
function listFolderFiles($dir){
 $html = '';
 // Init the session if it did not start yet
 if(session_id() == '') session_start();
 $html .= '<ol>';
 foreach(new DirectoryIterator($dir) as $folder){
    if(!$folder->isDot()){
        if($folder->isDir()){
            // $html .= '<li>';
            $user = $dir . '/' . $folder;
            foreach (new DirectoryIterator($user) as $file) {
                if($file != '.' && $file != '..'){  
                    $image = $user . '/' . $file;
                    // Check the pictures URLs in the session
                    if(isset($_SESSION['pictures']) && is_array($_SESSION['pictures'])){
                        // Check if this image was already served
                        if(in_array($image, $_SESSION['pictures'])){
                            // Skip this image
                            continue;
                        }
                    } else {
                        // Create the session variable
                        $_SESSION['pictures'] = array();
                    }
                    // Add this image URL to the session
                    $_SESSION['pictures'][] = $image;
                    // Build the form
                    //echo $image, "</br>";
                    $html .= '  
                                <style>
                                    form{
                                            font-size: 150%;
                                            font-family: "Courier New", Monospace;
                                            display: inline-block;
                                            align: middle;
                                            text-align: center;
                                            font-weight: bold;
                                        }

                                </style>

                                <form class = "form" action="' . action($image) . '" method="post">
                                    <div>
                                        <img src="' . $image . '"  alt="" />
                                    </div>
                                    <label for="C1">FASHION</label>
                                    <input  id="fashion" type="radio" name="fashion" id="C1" value="fashion" />

                                    <label for="C2"> NON FASHION </label>
                                    <input id="nfashion" type="radio" name="nfashion" id="C2" value="nfashion" />

                                    <input type="submit" value="submit" />
                                </form>';
                    // Show one image at a time
                    // Break the loop
                    break 2;
                }   
           }
           // $html .= '</li>';
        }
    }
}
$html .= '</ol>';
return $html;
}
//##### Action function

function action($img){

  $myfile = fopen("annotation.txt", "a");

    if (isset($_POST['fashion'])) {
        fwrite($myfile, $img." -- fashion\n");
        // echo '<br />' . 'fashion image';
    }
    else{
        fwrite($myfile, $img." -- nonFashion\n");
        // echo '<br />' . ' The  submit button was pressed<br />';
    }
}

echo listFolderFiles('images//');
?>

当我从表单标签内部调用 action($image) 时,我注意到,默认值 submit it 被解析为函数,因此它存储了具有默认值的图像名称和第一个图像的选择值被解析为第二个图像,第二个图像的选择值被存储到第三个图像的文件中,依此类推。当我调用侧输入提交标签时,它开始将第二张图像的值存储到文件中,依此类推。我无法设法将图像和所选值之间的正确对应关系存储到文件中。我应该在哪里调用动作函数才能正确执行?

编辑:当我在表单内进行调用时,在用户按下提交按钮之前立即调用操作函数。提交表单时如何准确调用我的函数?我尝试使用 if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {}:

if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {

                        action($image);
}

我在 html 标记之前添加了上面的代码,但是,我得到的结果与我将操作函数放在提交输入标记中的情况相同。知道如何解析正确的图像来写入值吗?

使用 $_SESSION 来记住你上次使用的图像,这样你就可以在用户按下提交时移动到下一个,或者你可以使用一个隐藏的字段来记住图像。

我会将文件夹中的所有图像加载到一个数组中,并只传递你上次使用的图像的索引号,这样你就可以通过 array[index+1][=11 轻松移动到下一张图像=]

每次显示一张图片都需要打破循环。此外,您需要保存图像 URL 以避免多次显示同一图像。 我正在使用 Session 来保存图像 URL,但您可以使用 Cookie、数据库等。

代码如下:

<?php
function listFolderFiles($dir){
    $html = '';
    // Init the session if it did not start yet
    if(session_id() == '') session_start();
    $html .= '<ol>';
    foreach(new DirectoryIterator($dir) as $folder){
        if(!$folder->isDot()){
            if($folder->isDir()){
                $html .= '<li>';
                $user = $dir . '/' . $folder;
                foreach (new DirectoryIterator($user) as $file) {
                    if($file != '.' && $file != '..'){  
                        $image = $user . '/' . $file;
                        // Check the pictures URLs in the session
                        if(isset($_SESSION['pictures']) && is_array($_SESSION['pictures'])){
                            // Check if this image was already served
                            if(in_array($image, $_SESSION['pictures'])){
                                // Skip this image
                                continue;
                            }
                        } else {
                            // Create the session variable
                            $_SESSION['pictures'] = array();
                        }
                        // Add this image URL to the session
                        $_SESSION['pictures'][] = $image;
                        // Build the form
                        $html .= '  <form action="action.php" method="post">
                                        <div>
                                            <img src="' . $image . '"  alt="" />
                                        </div>
                                        <label for="C1">fashion</label>
                                        <input type="checkbox" name="fashion" id="C1" value="fashion" />
                                        <label for="C2"> nfashion </label>
                                        <input type="checkbox" name="nfashion" id="C2" value="nfashion" />
                                        <input type="submit" value="submit" />
                                    </form>';
                        // Show one image at a time
                        // Break out of the 2 loops
                        break 2;
                    }   
               }
               $html .= '</li>';
            }
        }
    }
    $html .= '</ol>';
    return $html;
}
echo listFolderFiles('images');
?>

一个好的做法是避免在函数中打印 HTML 内容。最好在完全准备好后打印内容,这就是为什么我在变量中获取所有 HTML。

我发现您在表单中使用了 2 个复选框,这意味着用户可以 select 这两个选项并提交表单。 从这个应用程序背后的逻辑来看,我猜你应该使用单选按钮,以便用户只选择一个选项。

您必须这样更改表格:

<label for="C1">fashion</label>
<input type="radio" name="choice" id="C1" value="fashion" />
<label for="C2"> nfashion </label>
<input type="radio" name="choice" id="C2" value="nfashion" />
<input type="submit" value="submit" />