0

I am working to upload a file and then send it to myself as an attachment. I am new with php, I tried lookign up on the web for stuff and wrote this code.

 <?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="abc@mail.com";
  $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);


   ?>

I get an error for both the 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

What could possibly be wrong?

user2520215
  • 603
  • 8
  • 15
  • 2
    Where does `$files` come from? `$files` in foreach should be `Array()` or `Object` – Alaa Badran Nov 14 '13 at 17:10
  • try `var_dump($files)` before you call your function - what does it show? You're only setting a value for `$files` inside your `if` clause, so if there are no files attached, or if the uplaod files, there's nothing in `$files` to process; but you're always calling the function. – andrewsi Nov 14 '13 at 17:14

1 Answers1

1

Foreach takes arrays and attributes each value of the array to the varname that you define. Invalid Argument simply means that the you did not provide a valid array.

For l.12, it simply means that you did not pass an array as the first arg to your function, which is due to your error line 88.

I would assume that your problem is that you haven't yet tried uploading a file and thus $_FILES is undefined. In my experience to use the $_FILES superglobal variable you usually have to upload a file via a form of enctype multi-part/formdata. To debug and check if it's defined do a var_dump or print_r on $_FILES before your foreach loop. As an added measure of security you might want to wrap said loop and your call to your mail_attachment function in an if (isset($_FILES))

Hope this helps

Ram Sharma
  • 8,676
  • 7
  • 43
  • 56
Angry Goomba
  • 474
  • 4
  • 20