当前位置: 首页 > 知识库问答 >
问题:

如何修复参数必须是一个数组或一个实现可数的对象

卫劲
2023-03-14

我有问题,为什么我遇到这个错误在我的响应,我有模块,我需要上传多个使用Ajax和PHP作为后端。


Warning: count():参数必须是一个数组或一个对象,该数组或对象在C:\xampp\htdocs\PSMID\Function\mediaunction.php17
9
WarningC:\xampp\htdocs\PSMID\Function\mediaunction.php17

我将向你们分享我已经制作的示例代码

前端:

var storeFile =[];

    $('#media_file').on('change',function(e){
        var files = e.target.files;

        $.each(files, function(i, file) {

            storeFile.push(file);

        })
    })

    $('.news_media_button').on('click',function(){      

        const media_pages = $('#media_pages').val();
        const media_title = $('#media_title').val();
        //const media_content = $('#media_content').val();
        const ck_editor_content =  CKEDITOR.instances['media_content'].getData();
        const media_link = $('#media_link').val();
        const media_file = $('#media_file').prop('files')[0];
        const hidden_auth_user = $('#hidden_auth_user').val();



        const data = new FormData();
        data.append('media_pages',media_pages);
        data.append('media_title',media_title);
        data.append('media_content',ck_editor_content);
        data.append('media_link',media_link);
        data.append('files',storeFile[0]);
        data.append('hidden_auth_user',hidden_auth_user);

        Swal.fire({
            title: 'Are you sure to save this data?',
            type: 'warning',
            showCancelButton: true,
            confirmButtonColor: '#008B74',
            confirmButtonText: 'Okay'
            }).then((result) => {
        if (result.value) {
                $.ajax({
                    url:'./Function/mediaAddFunction.php',
                    data:data,
                    type:'POST',
                    dataType:'JSON',
                    enctype: 'multipart/form-data',
                    processData: false,
                    contentType: false,
                    success:function(response){
                        console.log(response);
                        //  Swal.fire(
                        //     'Success!',
                        //     'Data Saved.',
                        //     'success'
                        // )
                        // if(response.status == 'Success') {
                        //     location.reload();
                        // }
                    },
                    error:function(response) {
                        console.log(response);
                    }
               });

            }
        })

    });

后端:

    for($i=0;$i<count($_FILES["files"]["name"]);$i++)
    {
        echo $_FILES["files"]["name"][$i];
    }

Html:

<div class="container-fluid">
        <div class="jumbotron" style="background-color:white">
            <div class="container-fluid">

                <input type="hidden" value="" id="hidden_auth_user" name="">
                <div class="container">
                    <div class="row">
                    <h2 class="col-md-10">News Media</h2>
                    <button class="btn btn-primary news_media_button col-md-2 form-control" id="custom_button">Save Data</button>
                    </div>
                    <hr>
                    <br><br>
                    <div class="row">
                        <div class="col-md-6">
                            <label style="font-weight: 500; font-size:14px;">Choose Media Page</label>
                            <select class="form-control" id="media_pages">
                                <option value="announcement">Announcement</option>
                                <option value="news_online">News Online</option>
                                <option value="info_graphics">Info Graphics</option>
                            </select>
                        </div>
                        <div class="col-md-6">
                            <label style="font-weight: 500; font-size:14px;">Title</label>
                            <input type="text" name="media_title" id="media_title" placeholder="Title" class="form-control">
                        </div>
                    </div>
                    <br><br>
                    <div class="row">
                        <div class="col-md-6">
                            <label style="font-weight: 500; font-size:14px;">File Upload</label>
                            <div class="custom-file">   
                                <input type="file" name="files[]" multiple placeholder="Title" id="media_file" value="" class="custom-file-input form-control">
                                <label class="custom-file-label" for="inputGroupFile04"></label>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <label style="font-weight: 500; font-size:14px;">File Link</label>
                            <input type="text" name="" placeholder="Link" id="media_link"  value="" class=" form-control">
                        </div>
                    </div>
                    <br><br>
                    <div class="row">
                        <div class="col-md-12">
                            <label style="font-weight: 500; font-size:14px;">Content</label>
                            <textarea cols="12" name="content_article" class="form-control" id="media_content"></textarea>
                            <script>
                                CKEDITOR.replace('content_article');
                            </script>
                        </div>
                    </div>
                    <br><br>
                    <div class="row">
                        <div class="col-md-12">

                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

共有1个答案

厉熠彤
2023-03-14

你已经发布了你的php代码,如下所示:

后端:

for($i=0;$i<count($_FILES["files"]["name"]);$i++)
{
    echo $_FILES["files"]["name"][$i];
}

使用您的代码,我有:

注意:未定义索引:第6行D:\Web\test\files\files-2.php中的文件

警告:count():参数必须是在第6行的D:\Web\test\files\files-2.php中实现可数的数组或对象

要修复您的代码,您必须更改后端:

if (isset($_FILES["files"]["name"])) {
  for ($i = 0; $i < count($_FILES["files"]["name"]); $i++) {
    echo $_FILES["files"]["name"][$i];
  }
}

这将解决你的问题...神奇的代码是:

if (isset($_FILES["files"]["name"])) {
  ...
}

刚刚测试了我的files-1.php文件,没有任何警告或错误,它可以在带有php/7.3.6(64it)php/7.2.17(64位)的真实服务器上正常工作。。。还使用相同的PHP版本在我的本地主机上进行了测试。。。

files-1.php:

<?php
  ini_set('display_errors', 1);
  ini_set('error_reporting', E_ALL);
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<label for="files1">File:</label>&nbsp;<input type="file" id="files1" name="files[]" size="35"><br>
<label for="files2">File:</label>&nbsp;<input type="file" id="files2" name="files[]" size="35"><br>
<input type="submit" value="Send">
</form>
<?php
if (isset($_FILES['files']['name'])) {
  for ($index = 0; $index < count($_FILES['files']['name']); $index++) {
    if ($_FILES['files']['name'][$index] != "") {
      echo $_FILES['files']['name'][$index];
    }
  }
}
?>

下面我的示例files-2.php)根据您的示例有一个非常小的变化,这里我没有任何警告或错误。。。在真正的服务器上使用PHP/7.3.6PHP/7.2.17。。。还使用相同的PHP版本在我的本地主机上进行了测试。。。

files-2.php:

<?php
  ini_set('display_errors', 1);
  ini_set('error_reporting', E_ALL);
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<label for="files">File:</label>&nbsp;<input type="file" id="files" name="files[]" size="35" multiple><br>
<input type="submit" value="Send">
</form>
<?php
if (isset($_FILES['files']['name'])) {
  for ($index = 0; $index < count($_FILES['files']['name']); $index++) {
    if ($_FILES['files']['name'][$index] != "") {
      echo $_FILES['files']['name'][$index];
    }
  }
}
?>

PHP动态生成的源html:

<form action="/files/files-2.php" enctype="multipart/form-data" method="post">
<label for="files">File:</label>&nbsp;<input type="file" id="files" name="files[]" size="35" multiple><br>
<input type="submit" value="Send">
</form>
test.zip

正如您所见,没有错误或警告。。。

在线测试:

https://3v4l.org/tqgUp

http://sandbox.onlinephpfunctions.com/code/4e0a5326fc2508e1ca4db90051061b4584b86eae

希望这有帮助。

 类似资料: