Цикл Foreach вставлять одни и те же данные несколько раз - PullRequest
0 голосов
/ 05 июня 2018

Вложенный цикл foreach испортил мой день.Данные вставляются несколько раз (одно и то же значение вставляется в зависимости от того, сколько вложенных меню проверено), а вложенное значение сохраняется в каждой строке, хотя они не являются родительскими.

Я думаю, что проблема вызвана вложенным циклом foreach

<?php
if(!empty($_POST['heading']) && !empty($_POST['content']) && !empty($_POST['keytag']) && !empty($_POST['date'])){
        $heading=$_POST['heading'];
        $content=$_POST['content'];
        $keytag=$_POST['keytag'];
        $date=$_POST['date'];
        $query = '';
        $msg = '';

        $data = explode("," ,$_POST["navid"]);
        $subdata = explode("," ,$_POST["subnavid"]);
            foreach ($data AS $key => $menu){
                foreach($subdata AS $k => $submenu){

                    //If Image is browsed 
                    if(!empty($_FILES['file']['name'])){
                        move_uploaded_file($_FILES["file"]["tmp_name"], $target_file);
                        $query = $con->prepare('INSERT into news(heading, cat_id, subcat_id, content, keytag, date, img) VALUES(:heading, :cat_id, :subcat_id, :content, :keytag, :date, :new_img)');
                        $query->bindParam(':new_img',$new_img);
                    }

                    //If Image isnot browsed 

                    if(empty($_FILES['file']['name'])){
                        $query = $con->prepare('INSERT into news(heading, cat_id, subcat_id, content, keytag, date) VALUES(:heading, :cat_id, :subcat_id, :content, :keytag, :date)');
                    }
                    if(empty($submenu)){
                       $submenu = null;
                    }
                    $query->bindParam(':heading', $heading);
                    $query->bindParam(':subcat_id', $submenu);
                    $query->bindParam(':cat_id', $menu);
                    $query->bindParam(':content', $content);
                    $query->bindParam(':keytag', $keytag);
                    $query->bindParam(':date', $date);

                    if($query->execute()){
                        $msg="Successfully Inserted";
                    };
                }
            }
            echo $msg;
        }

}?>

Вот проблема

enter image description here

Позвольте мне объяснить вкратце.На сайте есть три меню: News, Views, Art.Из них только меню новостей имеет подменю .Если для News 'submenu и Views/Art установлено сразу , по умолчанию в столбце Views/Art также хранится значение submenu, но в реальном представлении / искусстве не имеет подменю , хранит значение подменю News .

Это должно быть

enter image description here Здесь HTML

<li>
<input type="checkbox" name="menu[]" value="2">News
    <ul>
        <li>
        <input type="checkbox" name="menu[][menusub]" value="2">Politics
        </li>
        <li>
        <input type="checkbox" name="menu[][menusub]" value="3">Social
        </li>
        <li>
        <input type="checkbox" name="menu[][menusub]" value="4">Economy
        </li>
    </ul>
</li>
<li>
<input type="checkbox" name="menu[]" value="12">Views                                 
</li>
<li>
<input type="checkbox" name="menu[]" value="13">ART                               
</li>

Данные передаются через AJAX, как показано ниже

    $(document).on('submit', '#form', function(e){
        e.preventDefault();
        var navid = [];
        $("input[name='menu[]']:checked").each(function(){
            navid.push(this.value);
        });
        var subnavid = [];
        $("input[name='menu[][menusub][]']:checked").each(function(){
            subnavid.push(this.value);
        });
        if (navid.length === 0){ //tell you if the array is empty
            alert("Please Select atleast one checkbox");
            return false;
        }
        else {
            var formData = new FormData(this);
            formData.append('navid', navid);
            formData.append('subnavid', subnavid);
            $.ajax({
            type: 'POST',
            url: 'upload.php',
            data: formData,
            contentType: false,
            cache: false,
            processData:false,
            success: function(data){
                alert(data);

                        }
        });
        }
    });

1 Ответ

0 голосов
/ 05 июня 2018

Извлеките $subdata = explode("," ,$_POST["subnavid"]); из первого цикла foreach, и все будет хорошо.

Поскольку для каждого родительского цикла он извлекает $_POST["subnavid"], а дочерний цикл запускается с 1-го членамассив.

$subdata = explode("," ,$_POST["subnavid"]); // This is the change required.
foreach ($data AS $key => $menu){
   foreach($subdata AS $k => $submenu){
   ......
   ......
   }
}

Также измените $key переменную.Потому что это то же самое.Так что это может перекрываться с каждым циклом.

...