0

I've checked so many questions and forums but I couldn't figure out how to email an array.

This will be an Order Form for products. Users can add new order rows by jquery.

So here is my shortened example;

form.php

<input type="text" name="array[][id]" />
<input type="text" name="array[][partno]" />

on email.php;
I can see that, it Posts all the array by

<?php var_dump($_POST['array']); ?>

But i couldn't figure out how to email it.
This is what i tried in email.php which is wrong ;

$id = $_POST['array'][]['id'];
$partno = $_POST['array'][]['partno'];

and

$email_message .= "Id: ".clean_string($id)."\n";
$email_message .= "Part No: ".clean_string($partno)."\n";

What should I do to send the values in that array

EDIT:
I tried but I couldn't figure out where to put @onetrickpony codes. Here is the whole code of email.php

<?php 
if(isset($_POST['email'])) {
 
// EDIT THE 2 LINES BELOW AS REQUIRED
$email_to = "a@a.com";
$email_subject = "order";

function died($error) {
    // your error code can go here
    echo "We are very sorry, but there were error(s) found with the form you submitted. ";
    echo "These errors appear below.<br /><br />";
    echo $error."<br /><br />";
    echo "Please go back and fix these errors.<br /><br />";
    die();
}
 
// validation expected data exists
if(!isset($_POST['first_name']) ||
    !isset($_POST['last_name']) ||
    !isset($_POST['email']) ||
    !isset($_POST['telephone']) ||
    !isset($_POST['array'])) {
        
        died('We are sorry, but there appears to be a problem with the form you submitted.');       
    }
 
$first_name = $_POST['first_name']; // required
$last_name = $_POST['last_name']; // required
$email_from = $_POST['email']; // required
$telephone = $_POST['telephone']; // not required

$error_message = "";
$email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
if(!preg_match($email_exp,$email_from)) {
$error_message .= 'The Email Address you entered does not appear to be valid.<br />';
}
$string_exp = "/^[A-Za-z .'-]+$/";
if(!preg_match($string_exp,$first_name)) {
$error_message .= 'The First Name you entered does not appear to be valid.<br />';
}
if(!preg_match($string_exp,$last_name)) {
$error_message .= 'The Last Name you entered does not appear to be valid.<br />';
}
if(strlen($error_message) > 0) {
died($error_message);
}
$email_message = "Form details below.\n\n";
 
function clean_string($string) {
  $bad = array("content-type","bcc:","to:","cc:","href");
  return str_replace($bad,"",$string);
}
 
$email_message .= "First Name: ".clean_string($first_name)."\n";
$email_message .= "Last Name: ".clean_string($last_name)."\n";
$email_message .= "Email: ".clean_string($email_from)."\n";
$email_message .= "Telephone: ".clean_string($telephone)."\n";
// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);
?>
<?php var_dump($_POST['array']); ?>
<?php
}
?>

Solution

As I understand it was unnecessary to use array[][input_name] ..
I changed input names as;

"partno[]" ..etc

also added

!isset($_POST['partno']) || ..etc and,
$partno = $_POST['partno']; .. etc

to necessary places,
and removed;

!isset($_POST['array'])

and for the Key part;

foreach( $partno as $key => $no ) {
$email_message .= $no;
$email_message .= $partnumber[$key];
$email_message .= $quantity[$key];
$email_message .= $partname[$key]."\n";
}

According to the answer of @Jeffrey Blake in the question topic;
How to get form input array into PHP array

Community
  • 1
  • 1
no_leaf
  • 43
  • 11

2 Answers2

3

[] is used to assign values to an array in PHP.

By the way the inputs are named, it looks like you should be able to access it like this:

$id = $_POST['array'][0]['id'];
$partno = $_POST['array'][0]['partno'];

But if you have more than one entry you'll have to iterate it. Something like:

foreach($_POST['array'] as $item){

   $id = $item['id'];
   $partno = $item['partno'];

   $email_message .= "Id: ".clean_string($id)."\n";
   $email_message .= "Part No: ".clean_string($partno)."\n";
}
nice ass
  • 16,471
  • 7
  • 50
  • 89
  • I am trying to implement – no_leaf Jul 15 '13 at 21:20
  • I couldn't make it work :( Please check http://crea-direct.com/post/ This is without your codes – no_leaf Jul 15 '13 at 21:48
  • on the page your input names are different – nice ass Jul 15 '13 at 21:56
  • I know i changed them here to English, but in php side everything is correct. – no_leaf Jul 15 '13 at 21:58
  • By the way; if I use [0] on form.php and email.php it sends only the first row data. If i use [] on both it gives error – no_leaf Jul 15 '13 at 22:02
  • All right, i figured out.. It is working now.. $id = $_POST['array'][0]['id']; $partno = $_POST['array'][0]['partno']; are after $telephone... foreach is after $email_message for telephone. Thanks for your great support guys. – no_leaf Jul 15 '13 at 22:16
  • But you didn't use $id = $_POST['array'][0]['id']; $partno = $_POST['array'][0]['partno']; in your link? – no_leaf Jul 15 '13 at 22:27
  • No, because it appears you can have more than one row. I mentioned that you should use a loop in this case. `$_POST['array'][0]['id']` would select the ID field from the first row only – nice ass Jul 15 '13 at 22:30
  • Hmm, yes the main purpose is multiple rows. We just tried it for 2 colums and worked. But it sent 8 rows when i filled 2.. I should reverse correct answer check – no_leaf Jul 15 '13 at 22:39
1

I think your code should look more like:

<input type='text' name='lookHere[]' />
<input type='text' name='lookHere[]' />

$lh = $_POST['lookHere'];
$email_message .= 'Id: '.htmlentities($lh[0], 3, 'UTF-8')."\n";
$email_message .= 'Part No: '.htmlentities($lh[1], 3, 'UTF-8')."\n";

Note that 3 is ENT_QUOTES. You can replace this using the proper quote style and charset, if need be. Personally, I would use the PHPglue Library at https://www.PHPglue.com .

StackSlave
  • 10,613
  • 2
  • 18
  • 35