警告:在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 

怎么可能是错的?

+2

哪里'$ files'从何而来?在调用函数之前,在foreach中的'$ files'应该是'Array()'或'Object' –

+0

''var_dump($ files)'' - 它显示了什么?你只是在'if'子句中为'$ files'设置一个值,所以如果没有附加文件或者uplaod文件,'$ files'中没有任何东西需要处理;但你总是调用这个函数。 – andrewsi

Foreach将阵列和属性的每个值设置为您定义的varname。无效的参数意味着你没有提供一个有效的数组。

对于L.12,它只是意味着你没有通过数组作为第一个参数,以你的函数,这是由于您的错误线路88

我会假设你的问题是你的避风港还没有尝试上传文件,因此$_FILES未定义。根据我的使用$_FILES超全局变量的经验,您通常需要通过enctype multi-part/formdata的形式上传文件。要调试并检查它是否已定义,请在foreach循环之前在$_FILES上执行var_dump or print_r。作为一个附加的安全性的措施你可能想说环路和您的电话换到你的mail_attachment功能在if (isset($_FILES))

希望这有助于