如何修复Parameter必须是实现Countable的数组或对象

Posted

技术标签:

【中文标题】如何修复Parameter必须是实现Countable的数组或对象【英文标题】:How to fix Parameter must be an array or an object that implements Countable 【发布时间】:2019-10-23 14:11:02 【问题描述】:

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

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

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

前端:

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>

【问题讨论】:

您的代码是 JQuery + PHP...让我知道如何为您实现 html 端... 我怀疑你遗漏了一些非常重要的东西 你错过了 html 部分......所以 $_FILES 给出了这个警告 @Alessandro 缺少什么? 错过 HTML 部分 【参考方案1】:

解决了您的问题:

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

后端:

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

    echo $_FILES["files"]["name"][$i];

使用我的代码:

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

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

希望这会有所帮助。

【讨论】:

count():参数必须是数组或者实现了Countable in的对象 用我的html试试 您的问题听起来像是 $_FILES 中没有文件可计数 我觉得你写错东西了……试试我的完整测试文件 我尊重你在这里付出的努力——但这从根本上改变了 OP 试图使用 ajax 来完成这项工作的前提。您的解决方案将需要重新加载页面。如果您指出他们的 javascript 或 HTML 中存在的任何错误,我认为 OP 会了解更多。

以上是关于如何修复Parameter必须是实现Countable的数组或对象的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 JAVA VS 代码中的实现错误,“必须实现继承的抽象类”

如何根据sqlmap的检测结果进行漏洞修复

如何修复“必须向文本小部件提供非空字符串”。颤振错误?

如何修复“按钮”交互角色必须是可聚焦的

如何修复 TypeError:order 必须是 str,而不是 int

如何修复'ValueError:输入张量必须具有等级 4'?