如何修复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> <input type="file" id="files1" name="files[]" size="35"><br>
<label for="files2">File:</label> <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
... 也经过测试在我的本地主机上使用相同的 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> <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> <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 代码中的实现错误,“必须实现继承的抽象类”