แสดงภาพหนึ่งภาพแล้วภาพเล่าโดยใช้ send 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//');
?>

เมื่อฉันทำการเรียกการกระทำ($image) จากแท็กแบบฟอร์มภายใน ฉันสังเกตเห็นว่าค่าเริ่มต้นของการส่งนั้นจะถูกแยกวิเคราะห์ไปยังฟังก์ชัน ดังนั้นจึงเก็บชื่อของรูปภาพด้วยค่าเริ่มต้นและค่าที่เลือกไว้เป็นค่าแรก รูปภาพจะถูกแยกวิเคราะห์เป็นรูปภาพที่สอง ค่าที่เลือกของรูปภาพที่สองจะถูกจัดเก็บไว้ในไฟล์ที่มีรูปภาพที่สามเป็นต้น เมื่อฉันโทรเข้าแท็กส่งอินพุตด้านข้าง มันจะเริ่มจัดเก็บลงในไฟล์จากรูปภาพที่สองโดยมีค่าของรูปภาพแรกเป็นต้น ฉันไม่สามารถจัดเก็บไว้ในไฟล์ความสอดคล้องที่ถูกต้องระหว่างรูปภาพกับค่าที่เลือกได้ ฉันควรเรียกใช้ฟังก์ชันการกระทำที่ไหนเพื่อให้ดำเนินการได้อย่างถูกต้อง?

แก้ไข: เมื่อฉันโทรออกภายในแบบฟอร์ม ฟังก์ชั่นการกระทำจะถูกเรียกทันทีก่อนที่ผู้ใช้จะกดปุ่มส่ง ฉันจะเรียกใช้ฟังก์ชันของฉันได้อย่างไรเมื่อส่งแบบฟอร์ม ฉันพยายามใช้ if(strtoupper($_SERVER['REQUEST_METHOD']) === 'POST') {}:

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

                        action($image);
}

ฉันเพิ่มโค้ดด้านบนหน้าแท็ก html อย่างไรก็ตาม ฉันได้ผลลัพธ์เหมือนกับในกรณีที่ฉันใส่ฟังก์ชัน action ไว้ในแท็กอินพุต send มีความคิดวิธีการแยกวิเคราะห์ภาพที่ถูกต้องเพื่อเขียนค่าหรือไม่?


person snake plissken    schedule 27.01.2015    source แหล่งที่มา
comment
มีความเป็นไปได้มากมาย ไม่ว่าคุณจะใช้ฝั่งไคลเอ็นต์เช่น JQuery ไม่ว่าคุณจะแก้ไขเซิร์ฟเวอร์ของคุณเพื่อรับ ID หรือพารามิเตอร์ตัวนับเพื่อให้ได้ภาพที่ดีเท่านั้น   -  person Michael Laffargue    schedule 27.01.2015


คำตอบ (2)


คุณต้องแยกวงทุกครั้งที่คุณแสดงภาพเดียว นอกจากนี้ คุณต้องบันทึก URL ของรูปภาพเพื่อหลีกเลี่ยงการแสดงรูปภาพเดียวกันมากกว่าหนึ่งครั้ง ฉันใช้เซสชันเพื่อบันทึก URL รูปภาพ แต่คุณสามารถใช้คุกกี้ ฐานข้อมูล ฯลฯ

นี่คือรหัส:

<?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" />
person Wissam El-Kik    schedule 27.01.2015
comment
มีวิธีแสดงทุกครั้งเพียง 1 div ไม่ใช่ทั้งหมดหรือไม่ - person snake plissken; 27.01.2015
comment
ด้วยรหัสที่นำเสนอ มันจะแสดงให้ฉันเห็นทุกครั้งทุกภาพ ยกเว้นภาพที่ส่งมาด้วยปุ่มตัวเลือก ฉันอยากให้ทุกครั้งมีเพียงภาพเดียว ยิ่งไปกว่านั้นสามารถเริ่มต้นตารางเซสชั่นได้หรือไม่? - person snake plissken; 27.01.2015
comment
ฉันรู้ว่าคำถามของฉันมันงี่เง่านิดหน่อย แต่ฉันไม่คุ้นเคยกับ php - person snake plissken; 27.01.2015
comment
ฉันแก้ไขรหัส ฉันผิดเองที่ฉันใช้ break; แทน break 2; ส่วนหลังจะแยกออกจาก 2 ลูปเมื่อเราแสดงภาพเดียว ในทางกลับกัน ไม่มีตารางเซสชัน เซสชันนี้เป็นคุกกี้ (พร้อมความปลอดภัยเพิ่มเติม) มันไม่ใช่ฐานข้อมูล โค้ดทั้งหมดเขียนด้วย PHP หากคุณประสบปัญหาในการทำความเข้าใจพื้นฐาน คุณควรใช้บทช่วยสอน PHP ฟรีจาก Google คุณจะพบบทช่วยสอนและคำแนะนำมากมายเพื่อเรียนรู้พื้นฐาน - person Wissam El-Kik; 27.01.2015
comment
มีข้อผิดพลาดของดัชนีในรหัส ด้วยเหตุผลบางประการ ระบบจะจัดเก็บรูปภาพแรกเป็นค่าเริ่มต้น รูปภาพที่สองพร้อมค่าของรูปภาพแรกและอื่นๆ - person snake plissken; 03.02.2015
comment
ฉันไม่ได้ใช้ดัชนีใด ๆ ฉันกำลังกรอกอาร์เรย์โดยใช้ $_SESSION['pictures'][] หากไม่มีอาร์เรย์ ฉันจะสร้างมันขึ้นมา ฉันไม่สามารถทดสอบฟังก์ชันได้อย่างถูกต้องเพราะฉันไม่มีโค้ดทั้งหมด ฉันไม่เข้าใจจริงๆว่ามีอะไรผิดปกติ - person Wissam El-Kik; 03.02.2015
comment
ฉันมีฟังก์ชันการดำเนินการที่ใช้ชื่อรูปภาพและตัวเลือกของผู้ใช้และจัดเก็บไว้ในไฟล์ข้อความ อย่างไรก็ตาม ดูเหมือนว่าฉันจะเรียกใช้ฟังก์ชัน action ก่อนที่จะให้ค่ากับกล่องเรดิโอ ดังนั้นมันจะแยกวิเคราะห์ค่าเริ่มต้นจากกล่องตัวเลือกในครั้งแรกและในภาพต่อไปนี้จะแยกวิเคราะห์ค่าก่อนหน้า ฉันจะแยกวิเคราะห์ค่าที่แท้จริงของกล่องเรดิโอได้อย่างไร - person snake plissken; 04.02.2015
comment
ฉันพยายามเปลี่ยนตำแหน่งของฟังก์ชั่นการกระทำ แทนที่จะเรียกมันในรูปแบบที่ฉันพยายามเรียกมันในการป้อนข้อมูลส่ง มันไม่ส่งผลกระทบต่อผลลัพธ์ - person snake plissken; 04.02.2015

ใช้ $_SESSION เพื่อจดจำภาพที่คุณใช้ครั้งสุดท้าย เพื่อให้คุณสามารถไปยังภาพถัดไปได้เมื่อผู้ใช้กดส่ง หรือคุณสามารถใช้ฟิลด์ที่ซ่อนอยู่เพื่อจดจำภาพนั้น

ฉันจะโหลดรูปภาพทั้งหมดในโฟลเดอร์ลงในอาร์เรย์แล้วส่งผ่านหมายเลขดัชนีของรูปภาพที่คุณใช้ล่าสุด ด้วยวิธีนี้คุณสามารถย้ายไปยังรูปภาพถัดไปได้อย่างง่ายดายโดยทำ array[index+1]

person Tom    schedule 27.01.2015