使用提交操作PHP显示其他图像

时间:2015-01-27 13:23:03

标签: php image action

我正在阅读目录中的图像'图像'其中包含几个带图像的文件夹。我希望在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//');
?>

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

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

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

                        action($image);
}

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

2 个答案:

答案 0 :(得分:2)

使用$ _SESSION记住您最后使用的图像,这样当用户按下提交时您可以移动到下一个图像,或者您可以使用隐藏字段来记住图像。

我会将文件夹中的所有图像加载到一个数组中,然后只传递上次使用过的图像的索引号,这样就可以通过array[index+1]

轻松移动到下一个图像上

答案 1 :(得分:2)

每次显示一张图像时都需要断开循环。此外,您需要保存图像网址,以避免多次显示相同的图像。 我使用会话保存图片网址,但您可以使用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个复选框,这意味着用户可以选择这两个选项并提交表单。 从这个应用程序背后的逻辑,我想你应该使用一个单选按钮,以便用户只选择一个选项。

您必须以这样的方式更改表单:

<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" />