Passing an array using post

Hi,
I am trying to use $_POST to send an array called $result to my controller file index.php.

The bottom of this html has the form which should send the array $result as a hidden value.

<?php include_once $_SERVER['DOCUMENT_ROOT'] . '/artgibney/includes/helpers.inc.php'; ?>
<!DOCTYPE html>
<html lang="en">
  <head>
     <link type="text/css" rel="stylesheet" href="/artgibney/css/stylesheet.css"/>
    <meta charset="utf-8">
    <title>Manage Topics: Search Results</title>
  </head>
  <body background="/artgibney/includes/retro_intro_@2X.png">
  <link rel="icon" type="image/x-icon" href="http://www.artgibney.com/artgibney/images/favicon.ico"/>
     <p><a href="..">physCMS home</a> &#8658; <a href="/artgibney/admin/notes/?setupNotes">Manage Daily Notes</a> &#8658; <a href="?search">Search</a> &#8658; <a href="?pdf">Create pdf</a> </p></p>
   <?php include $_SERVER['DOCUMENT_ROOT'] . '/artgibney/includes/logout.inc.html.php'; ?>
    <h2>Search results for: <?php echo $learner[0]['learner']?></h2> 
    <table>
       <tr>
       <th></th>
    <th></th>
        <?php foreach($result as $keys => $values): 
           if($keys == 0): 
             foreach($values as $key => $value):
           if($key != 'id'):?>
             <th><?php htmlout($key); ?></th>
             <?php endif; 
           endforeach; 
           endif;
          endforeach; ?>
       </tr>
        <?php foreach($result as $keys => $values): ?>
        <tr>
        <form action="" method="post">
        <td><input type="submit" name="action" value="Edit"></td>
        <td><input type="submit" name="action" value="Delete"></td>
              <?php foreach($values as $key => $value):?>
              <input type="hidden" name="id" value="<?php echo($values['id']); ?>">
              <?php if($key != 'id'): ?>
                 <td><?php if((is_numeric($value))&&($value==1)&&($key!='effort')):?>
                 &#10004;
                 <?php elseif((is_numeric($value))&&($value==0)):?>
                 <?php else: htmlout($value);
             endif; ?></td>
             <?php else:?>
             <?php endif; ?>
              <?php endforeach; ?>
               </form>
          </tr>
         <?php endforeach; ?>
           
    </table>
    <form action="" method="post">
    <input type="hidden" name="result" value="<?php $result ?>">
    <input type="submit" name="pdf" value="genpdf">
        </form>
  </body>
</html>

I did try echo($result) as in,

<input type="hidden" name="result" value="<?php echo($result) ?>">

but this doesn’t work. You can see that the array $result is used earlier in this html file, that’s why I displayed the whole file. I want to send this to the index file to generate a pdf like this, (6th line from the bottom)

if (isset($_POST['pdf']) and $_POST['pdf']=='genpdf')
    {
require_once($_SERVER['DOCUMENT_ROOT'] . '/artgibney/tcpdf/examples/tcpdf_include.php');
include $_SERVER['DOCUMENT_ROOT'] . '/artgibney/includes/buildlearners.inc.php'; 
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetCreator(PDF_CREATOR);
//$pdf->SetAuthor('Nicola Asuni');
//$pdf->SetTitle('TCPDF Example 001');
//$pdf->SetSubject('TCPDF Tutorial');
//$pdf->SetKeywords('TCPDF, PDF, example, test, guide');
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 001', PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
$pdf->setFooterData(array(0,64,0), array(0,64,128));
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
    require_once(dirname(__FILE__).'/lang/eng.php');
    $pdf->setLanguageArray($l);
}
$pdf->setFontSubsetting(true);
$pdf->SetFont('dejavusans', '', 14, '', true);
$pdf->AddPage();
$pdf->setTextShadow(array('enabled'=>true, 'depth_w'=>0.2, 'depth_h'=>0.2, 'color'=>array(196,196,196), 'opacity'=>1, 'blend_mode'=>'Normal'));
// Set some content to print
/*$html = <<<EOD
  <p>Hello world! </p>
  <p>Blah</p>
EOD;*/
$html = <<<EOD
<table style="border: 1px solid black"><tr><th>Student</th><th>id</th></tr>
EOD;
foreach($learners as $learner):
$html .= '<tr><td>' . $learner['learner'] . '</td><td>' . $learner['id'] . '</td></tr>';
endforeach;
$html .= '</table>'; 
$html .= '<p>' . $result . '</p>';
//$html .= '<pre>' . print_r($_POST) . '</pre>';
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
$pdf->Output('fileName.pdf', 'I');
        exit();
}

I am trying to get $result or the $_POST array to display in the pdf that gets generated.
Any help would be greatly appreciated,
Thanks,
Shane

I see I had a missing semicolon in,

<input type="hidden" name="result" value="<?php $result; ?>">

The error i am getting is,

TCPDF ERROR: Some data has already been output, can’t send PDF file

Thanks,
Shane

This error says you shouldn’t output (print) anything before $pdf->Output().

If $result is array then you can’t just make echo to display it. You should convert array to string (serialize) first and echo that string instead.

Thanks for looking at this.

But how do I access $_POST ? I have stopped using echo() I am just trying to get $_POST into the pdf or even any value in $_POST would be great. But this is driving me crazy.

$result looks like this,

I have tried,

$html = <<<EOD
<table style="border: 1px solid black"><tr><th>Student</th><th>id</th></tr>
EOD;
foreach($learners as $learner):
$html .= '<tr><td>' . $learner['learner'] . '</td><td>' . $learner['id'] . '</td></tr>';
endforeach;
$html .= '</table>';
//$html .= '<p>' . $_POST['result'] . '</p>';
//$html .= '<pre>';
        foreach($_POST['result'] as $key => $value):
        $html .= $value;
        endforeach;
//$html .= '</pre>';
//$html .= "yum";//outputs a string in the pdf

$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
$pdf->Output('fileName.pdf', 'I');
                exit();
}

But it is not working. How do I get a value from $_POST into the pdf.
Thanks,
Shane

You’re trying to iterate array $_POST['result'] but as I see from your form there is no such array but only a text field (input:hidden). What you should do if you want to pass array through form:

Serialize array (convert to string) in form:

<input type="hidden" name="result" value="<?php echo htmlspecialchars(serialize($result)); ?>">

Then unserialize it (convert string back to array) before iterating:

$result = unserialize($_POST['result']);
foreach($result as $key => $value):
1 Like

Ok I didn’t know this. Can’t wait to try it but won’t be able to for a few hours.
I will post as soon as i can.
Thanks for your help, I really appreciate it. I’ve been stuck on this most of the day.
Thanks,
shane
PS the array $result is created in index.php before the form is opened and then sent to it.

Thanks this works great not. I understand now what serialize is about.
Thanks for your help,
Shane

Take in note there is not only serialize() / unserialize() for that.
You can also use any other approach which makes the same result (converts array to string and vice versa).
For example, there are also json_encode() / json_decode() functions can be used for that goal.

1 Like

That is very useful to know. I have used JSON before to get a php array into javascript, or did I use it the other way around, anyway I didn’t know that it could be used for this too. Thsnks again
Shane