警告:在php中为foreach()提供的参数无效
问题描述:
我正在努力上传文件,然后将其作为附件发送给我自己。我是新的PHP,我试图在网上查找东西,并写下了这段代码。警告:在php中为foreach()提供的参数无效
<?php
function mail_attachment($files, $path, $mailto, $subject, $message) {
$uid = md5(uniqid(time()));
$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
$header .= "This is a multi-part message in MIME format.\r\n";
$header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
$header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$header .= $message."\r\n\r\n";
foreach ($files as $filename) {
$file = $path.$filename;
$name = basename($file);
$file_size = filesize($file);
$handle = fopen($file, "r");
$content = fread($handle, $file_size);
fclose($handle);
$content = chunk_split(base64_encode($content));
$header .= "--".$uid."\r\n";
$header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$header .= $content."\r\n\r\n";
}
$header .= "--".$uid."--";
if (@mail($mailto, $subject, $message, $header)) {
echo "mail send ... OK";
} else {
echo "mail send ... ERROR!";
}
}
//Enter your email address here
$mailto="[email protected]";
$subject="Form Details";
$FirstName = $_POST['firstName'] ;
$LastName = $_POST['lastName'] ;
$EmailAdress= $_POST['emailAddress'] ;
$ContactNumber= $_POST['contactNumber'] ;
$ApartmentType= $_POST['apartmentType'] ;
$ApartmentLocation = $_POST['apartmentLocation'] ;
$CheckIn = $_POST['checkIn'] ;
$CheckOut = $_POST['checkOut'] ;
$NumberOfAdults = $_POST['numberOfAdults'] ;
$NumberOfChildren = $_POST['numberOfChildren'] ;
$TermsAndConditions =$_POST['termsAndConditions'];
$required = array('firstName','lastName','emailAddress','contactNumber','apartmentType','apartmentLocation','checkIn','checkOut','numberOfAdults','numberOfChildren');
$error = false;
foreach($required as $field) {
if (empty($_POST[$field])) {
$error = true;
}
}
if ($error) {
echo "All fields are required.";
exit;
}
if ($TermsAndConditions=='disagree') {
echo "Please agree to the terms and conditions";
exit;
}
$message="First Name:\t $FirstName \n\n" .
"Last Name:\t $LastName\n\n".
"Email Address:\t $EmailAddress \n\n".
"Contact Number:\t $ContactNumber \n\n".
"Apartment Types:\t $ApartmentType \n\n".
"Apartment Location:\t $ApartmentLocation \n\n" .
"Check in:\t $CheckIn \n\n" .
"Check out:\t $CheckOut \n\n" .
"Number of Adults:\t $NumberOfAdults \n\n" .
"Number of Children:\t $NumberOfChildren \n\n";
$uploaddir = './';
$x=0;
foreach ($_FILES["documents"]["error"] as $key => $error)
{
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["documents"]["tmp_name"][$key];
$name = basename($_FILES["pictures"]["name"][$key]);
$files[$x]=$name;
$x++;
move_uploaded_file($tmp_name, $uploaddir.$name);
}
}
$path = $_SERVER['DOCUMENT_ROOT'];
mail_attachment($files, $path, $mailto, $subject, $message);
?>
我得到双方的foreach错误:
Warning: Invalid argument supplied for foreach() in /home/a4824849/public_html/PhpFile.php on line 88
Warning: Invalid argument supplied for foreach() in /home/a4824849/public_html/PhpFile.php on line 12
怎么可能是错的?
答
Foreach
将阵列和属性的每个值设置为您定义的varname
。无效的参数意味着你没有提供一个有效的数组。
对于L.12,它只是意味着你没有通过数组作为第一个参数,以你的函数,这是由于您的错误线路88
我会假设你的问题是你的避风港还没有尝试上传文件,因此$_FILES
未定义。根据我的使用$_FILES
超全局变量的经验,您通常需要通过enctype multi-part/formdata
的形式上传文件。要调试并检查它是否已定义,请在foreach
循环之前在$_FILES
上执行var_dump or print_r
。作为一个附加的安全性的措施你可能想说环路和您的电话换到你的mail_attachment功能在if (isset($_FILES))
希望这有助于
哪里'$ files'从何而来?在调用函数之前,在foreach中的'$ files'应该是'Array()'或'Object' –
''var_dump($ files)'' - 它显示了什么?你只是在'if'子句中为'$ files'设置一个值,所以如果没有附加文件或者uplaod文件,'$ files'中没有任何东西需要处理;但你总是调用这个函数。 – andrewsi