首页 > 解决方案 > 如何修复Parameter必须是实现Countable的数组或对象

问题描述

我有一个问题,为什么我在回复中遇到这个错误,我有一个模块,我需要使用 Ajax 和 php 作为后端上传多个模块。


警告:count():参数必须是在第17C:\xampp\htdocs\PSMID\Function\mediaAddFunction.php中实现 Countable 的数组或对象 9警告:count():参数必须是数组或对象在第17行的C:\xampp\htdocs\PSMID\Function\mediaAddFunction.php中实现 Countable


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

前端:

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>

标签: phpjqueryhtml

解决方案


解决了你的问题:

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

后端:

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

使用您的代码,我有:

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

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

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

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 (64bit)......也在我的本地主机上用相同的 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.6在下面的PHP/7.2.17示例(

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];
    }
  }
}
?>

测试1 测试2

由 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

希望这可以帮助。


推荐阅读