Mijn php pagina hier beneden (example.php) werkt verder goed en de resultaten van de dbase query worden goed weergegeven (alle records). Maar als ik naar een volgende pagina ga (output.php) en daar de session gegevens weer oproep laat hij enkel de laatste record zien. Ik begrijp dat dit komt doordat session in de while loop staat in emample.php. Maar ik weet niet hoe ik het dan moet wijzigen. Kan iemand mijn scrip aanpassen. Het is vast heel eenvoudig?

De example.php file:

<?php
//session starts
session_start();

// Database selection and pH selection (this comes from a form+post file where the pH level is asked for and selected)
switch ($_POST["pH"]) {

//Option 1 (I put xxxx for privacy purposes, guess you understand) (c1, c2, c3 are the selections you could make in the Form)
case "c1":
$con = mysqli_connect("localhost", "xxxx", "") or die (mysql_error ());
if (!$con) {die('Could not connect: ' . mysqli_error($con));}
mysqli_select_db($con,"xxx")or die(mysql_error());

//change query here
$sql="SELECT * FROM people WHERE rain <=200 AND Soil IN ('Sand','Sand Clay', 'Sand Clay Silt') AND pH<=4.5";
$result = mysqli_query($con,$sql);
break;

//Option 2
case "c2":
$con = mysqli_connect("localhost", "xxxx", "") or die (mysql_error ());
if (!$con) {die('Could not connect: ' . mysqli_error($con));}
mysqli_select_db($con,"xxx")or die(mysql_error());

//change query here
$sql="SELECT * FROM people WHERE rain <=200 AND Soil IN ('Sand','Sand Clay', 'Sand Clay Silt') AND pH BETWEEN 4.5 AND 7.0";
$result = mysqli_query($con,$sql);
break;

//Option 3
case "c3":
$con = mysqli_connect("localhost", "xxxx", "") or die (mysql_error ());
if (!$con) {die('Could not connect: ' . mysqli_error($con));}
mysqli_select_db($con,"xxx")or die(mysql_error());

//change query here
$sql="SELECT * FROM people WHERE rain <=200 AND Soil IN ('Sand','Sand Clay', 'Sand Clay Silt') AND pH >=7.0";
$result = mysqli_query($con,$sql);
break;


//default when nothing is selected
default:
$strpH = "Please go back and make your selection";
break;
}





//here starts the echo part for this page.


// printing main table
echo "<table>
<tr bgcolor=#339966>
<th>id</th>
<th>Common Name</th>
<th>Latin Name</th>
<th>pH level</th>
<th>Soil</th>
<th>Rain annual</th>
</tr>";

// Loop the recordset $result and Write the value van $result

while($row = mysqli_fetch_array($result))
{
$queryArray[] = $row;

// Declaration of session items...here something has to be changed.
$_SESSION ['select1']= $row [id];
$_SESSION ['select2']= $row ['CommonName'];
$_SESSION ['select3']= $row ['LatinName'];
$_SESSION ['select4']= $row [pH];
$_SESSION ['select5']= $row ['Soil'];
$_SESSION ['select6']= $row [rain];

echo "<tr>";
echo "<td>" .$row[id]. "</td>";
echo "<td>" .$row['CommonName']. "</td>";
echo "<td>" .$row['LatinName']. "</td>";
echo "<td>" .$row[pH]. "</td>";
echo "<td>" .$row['Soil']. "</td>";
echo "<td>" .$row[rain]. "</td>";
echo "</tr>";
}
echo "</table>";

// Close the database connection
mysqli_close($con);
?>






En hieronder de output.php file

<?php
ini_set('display_errors', 'On');
error_reporting(E_ALL);

session_start();

// setting the table
echo "<table>
<tr bgcolor=#339966>
<th>id</th>
<th>Common Name</th>
<th>Latin Name</th>
<th>pH level</th>
<th>Soil</th>
<th>Rain annual</th>
</tr>";


//readig session variables
echo "<tr>";
echo "<td>" .$_SESSION ['select1']. "</td>";
echo "<td>" .$_SESSION ['select2']. "</td>";
echo "<td>" .$_SESSION ['select3']. "</td>";
echo "<td>" .$_SESSION ['select4']. "</td>";
echo "<td>" .$_SESSION ['select5']. "</td>";
echo "<td>" .$_SESSION ['select6']. "</td>";
echo "</tr>";
echo "</table>";
?>
Laat het volgende even bezinken, en speel er zelf wat mee.

questionnaire.php, of hoe je het ook wilt noemen.
<?php
define('DEBUG', true); // of we aan het ontwikkelen zijn

// DEBUG - melden en weergeven van fouten
if (DEBUG) {
    error_reporting(E_ALL);
    ini_set('display_errors', 'stdout');
}

// We definieren deze functionaliteit als een klasse.
// Deze klasse doet van zichzelf niets, maar aan het einde van deze code
// wordt een instantie van deze klasse aangeroepen en uitgevoerd.
// Aanname: ALLE data volgt een UTF-8 encodering.
class MyQuestionnaire
{
    protected $action; // bevat de huidige uit te voeren actie

    public function __construct() {
        // Bepaal bij de creatie welke actie uitgevoerd dient te worden, deze actie wordt
        // ingesteld middels de querystring parameter "action". Een bijbehorende (proctected)
        // "action method" wordt uitgevoerd. Indien geen actie is opgegeven, wordt de default
        // action method "actionDefault" aangeroepen.
        $action = isset($_GET['action']) ? $_GET['action'] : 'default';
        if (method_exists($this, 'action'.ucfirst($action))) {
            $this->action = $action;
        } else {
            $this->action = 'default';
        }
        // De __construct methode kan ook gebruikt worden om andere zaken te initialiseren
        // zoals sessie- en databasemanagement.
        session_start();
        // Het is wellicht handig om alle tussengelegen resultaten op te slaan in een sub-array
        // van je sessie om deze gescheiden te houden van de rest van eventuele sessie-data, dit
        // doen we bijvoorbeeld in $_SESSION['questionnaire'].
        if (empty($_SESSION['questionnaire'])) {
            $_SESSION['questionnaire'] = array(
                'data' => array(), // de data uit de verschillende stappen
            );
        }
    } // function __construct

    // Voer de berekende action method uit.
    public function execute() {
        $action = 'action'.ucfirst($this->action);
        $this->$action();
    }

    // Hulpfunctie voor het escapen van (HTML) output.
    protected function escape($in) {
        return htmlspecialchars($in, ENT_QUOTES, 'UTF-8');
    } // function escape

    // Hulpfunctie voor redirect.
    protected function redirect($link) {
        header('HTTP/1.1 303 See Other');
        header('Location: '.$link);
        exit;
    } // function redirect

    // Omdat we vaak een complete HTML-pagina construeren en hier herhalende delen in zitten
    // introduceren we twee (interne) hulpfuncties: __header() en __footer(). Hierin zitten
    // (you guessed it) respectievelijk de standaard HTML header en de standaard HTML footer.
    // De __header() methode bevat een optionele parameter $title die je kunt gebruiken om
    // een documenttitel in te stellen.
    protected function __header($title='') {
        header('Content-Type: text/html; charset=UTF-8');
// Noot: we springen hier expres niet in zodat er geen spaties/linebreaks voor het begin van het document staan.
?><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><?php echo $this->escape($title) ?></title>
<!-- minimale stylesheet -->
<link rel="stylesheet" type="text/css" href="questionnaire.css">
<!-- hier kun je eventueel nog meer stylesheets of JavaScript invoegen die je in de individuele "pagina's" gebruikt -->
</head>

<body><?php
        // DEBUG - let op; inhoud is mogelijk niet betrouwbaar (bevat user input).
        if (DEBUG) {
            echo '<pre>'.print_r($_SESSION, true).'</pre>';
        }
    } // function __header

    // Standaard HTML footer
    protected function __footer() {
?></body>
</html><?php
    } // function __footer

    // We hebben nu alle stukjes om een volledig (en) kloppend HTML document te bouwen.
    // Laten we beginnen met de landingspagina van deze class: actionDefault. Alle action methods
    // zijn van "buitenaf" op te vragen. De actionDefault methode is benaderbaar via "?action=default"
    // of door simpelweg het aanroepen van dit script omdat het de default is.
    // Wat ons dus nog rest is het bouwen van de formulierstappen en het tussentijds verwerken van de
    // data, om uiteindelijk uit te monden in een action method die die uiteindelijke query bouwt en
    // uitvoert.
    protected function actionDefault() {
        // DEBUG - voor resetten sessie data
        if (DEBUG) {
            $_SESSION = array();
        }
        // Alle pagina's (action methods) zullen de volgende opbouw hebben: header - content - footer.
        // Header en footer zijn min of meer standaard, de content wordt bepaald door / is specfiek voor
        // de action method.
        $this->__header('Hello World');
            ?><div>
                <h1>Hello world</h1>
                <p>Dit is de landingspagina.</p>
                <p>Hier zou je wat uitleg kunnen geven over het verloop van de &quot;questionnaire&quot;.</p>
                <p>Middels <a href="?action=step1">deze link</a> kun je naar de eerste stap navigeren.</p>
            </div><?php
        $this->__footer();
    } // function actionDefault

    // De volgende action method bevat de eerste stap van je questionnaire, hierin zit een formulier wat
    // geinitialiseerd kan worden met eerder ingevulde data.
    protected function actionStep1() {
        $this->__header('Stap 1');
            ?><div>
                <h1>De eerste stap</h1>
                <p>Hier eventueel wat uitleg bij de vraag.</p><?php
                // Ging er iets mis bij verwerking (zie hieronder)?
                if (isset($_GET['errors'])) {
                    ?><div class="error">
                        <p>Er ging iets mis bij de verwerking van deze stap, controleer uw invoer.</p>
                    </div><?php
                }
                ?><div class="form">
                    <form action="?action=step1Process" method="post" accept-charset="UTF-8">
                        <p>
                            <label for="step_1_select">Omschrijving</label>
                            <select name="step_1_select" id="step_1_select">
                                <option value="">- selecteer -</option><?php
                                // Druk hier een lijst van waarden => namen af waarbij je
                                // tegelijkertijd controleert of er eerder iets ingevuld was.
                                if (array_key_exists(1, $_SESSION['questionnaire']['data'])) {
                                    $selectedValue = $_SESSION['questionnaire']['data'][1];
                                } else {
                                    $selectedValue = false;
                                }
                                // Het makkelijkste lijkt mij om alle "select data" op 1 plek op te slaan,
                                // we introduceren hiervoor een interne hulpmethode __getStepData.
                                foreach ($this->__getStepData(1) as $k => $v) {
                                    $selected = ($k == $selectedValue ? ' selected="selected"' : '');
                                    ?><option value="<?php echo $this->escape($k) ?>"<?php echo $selected ?>><?php echo $this->escape($v) ?></option><?php
                                }
                            ?></select>
                        </p>
                        <div>
                            <button type="submit">verder</button>
                        </div>
                    </form>
                </div>
            </div><?php
        $this->__footer();
    }

    // Hier verwerken we de invoer van het formulier uit stap 1. Omdat deze actie geen output produceert,
    // hoeven we ook geen __header of __footer te gebruiken.
    protected function actionStep1Process() {
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            // We voeren hier verder geen specifieke controles uit of de waarde klopt, dit kan aan het einde
            // ook. Dit houdt wel in dat we de data in $_SESSION['questionnaire'] niet 100% kunnen vertrouwen
            // dus hier zullen we rekening mee moeten houden.
            if (!empty($_POST['step_1_select'])) {
                // De $_POST waarde bestaat tenminste, dus voor nu gaan we er vanuit dat alles ok is.
                // We slaan de waarde op in het data-subarray op index 1 (correspondeert met stap 1).
                $_SESSION['questionnaire']['data'][1] = $_POST['step_1_select'];
                // We zijn klaar, door naar stap 2.
                $this->redirect('?action=step2');
            }
        }
        // Deze actie werd niet aangeroepen via POST, $_POST['step_1_select'] bestond niet of was leeg,
        // keer terug naar de bijbehorende stap. Hierbij is het ook handig om aan te geven dat er iets mis
        // ging, we sturen de extra indicatie "errors=1" mee.
        $this->redirect('?action=step1&errors=1');
    }

    protected function actionStep2() {
        // Dit is weer een volledige pagina, dus gebruik header en footer.
        $this->__header('Step 2');
            // Dit zou je grotendeels kunnen copy-pasten van step1.
            // Zorg wel dat je je namen en actions aanpast zodat je e.e.a. een beetje consistent houdt.
            ?><div>
                <h1>Stap twee</h1>
                <p>Hier eventueel wat uitleg bij de vraag.</p><?php
                if (isset($_GET['errors'])) {
                    ?><div class="error">
                        <p>Er ging iets mis bij de verwerking van deze stap, controleer uw invoer.</p>
                    </div><?php
                }
                ?><div class="form">
                    <form action="?action=step2Process" method="post" accept-charset="UTF-8">
                        <p>
                            <label for="step_2_select">Omschrijving</label>
                            <select name="step_2_select" id="step_1_select">
                                <option value="">- selecteer -</option><?php
                                if (array_key_exists(2, $_SESSION['questionnaire']['data'])) {
                                    $selectedValue = $_SESSION['questionnaire']['data'][2];
                                } else {
                                    $selectedValue = false;
                                }
                                foreach ($this->__getStepData(2) as $k => $v) {
                                    $selected = ($k == $selectedValue ? ' selected="selected"' : '');
                                    ?><option value="<?php echo $this->escape($k) ?>"<?php echo $selected ?>><?php echo $this->escape($v) ?></option><?php
                                }
                            ?></select>
                        </p>
                        <div>
                            <button type="submit">verder</button>
                        </div>
                    </form>
                </div>
            </div><?php
        $this->__footer();
    }

    protected function actionStep2Process() {
        // Dit zou je grotendeels kunnen copy-pasten van step1Process.
        // Zorg wel dat je je namen en actions aanpast zodat je e.e.a. een beetje consistent houdt.
        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            if (!empty($_POST['step_2_select'])) {
                $_SESSION['questionnaire']['data'][2] = $_POST['step_2_select'];
                // Je kunt zo zoveel stappen inbouwen als je wilt, uiteindelijk wordt je naar een
                // overzichtspagina gestuurd: actionSummary.
                $this->redirect('?action=summary');
            }
        }
        $this->redirect('?action=step2&errors=1');
    }

    // Overzichtspagina van ingevulde gegevens.
    protected function actionSummary() {
        $this->__header('Overzicht ingevulde gegevens');
            ?><div>
                <h1>Overzicht ingevulde gegevens</h1>
                <p>Hier kun je nog een omschrijving geven wat te doen als je iets aan wilt passen.</p>
                <table border="0" cellspacing="0" cellpadding="5"><?php
                    foreach ($this->__getStepDescriptions() as $step => $description) {
                        ?><tr>
                            <td><?php echo $this->escape($description) ?></td>
                            <td style="text-align: right;"><?php
                            $stepData = $this->__getStepData($step);
                            if (
                                array_key_exists($step, $_SESSION['questionnaire']['data']) &&
                                array_key_exists($_SESSION['questionnaire']['data'][$step], $stepData)
                            ) {
                                echo $this->escape($stepData[$_SESSION['questionnaire']['data'][$step]]);
                            } else {
                                ?>ongeldige waarde :(<?php
                            }
                            ?></td>
                        </tr><?php
                    }
                ?></table>
                <p><a href="?action=processData">Data verwerken!</a></p>
            </div><?php
        $this->__footer();
    }

    // Hier zou je nog last minute checks kunnen uitvoeren op $_SESSION['questionnaire']['data']
    // voordat je je query gaat bouwen. Ook zou je hier een "tussenstap zonder output" van kunnen maken
    // alvorens je iemand doorstuurt naar een resultaat- of bedankpagina, tis maar net wat je wilt.
    protected function actionProcessData() {
        // ... en wat je hier verder wilt doen met je data ...
        ?>processing...<?php
    }

    protected function __getStepData($step) {
        $stepData = array(
            // Data uit stap 1.
            1 => array(
                 '9' => '< 10mm',
                '10' => '10mm',
                '20' => '20mm',
                '30' => '30mm',
                '40' => '40mm',
                '50' => '50mm',
                '51' => '> 51mm',
            ),
            // Data uit stap 2.
            2 => array(
                'een'  => 'een',
                'twee' => 'twee',
                'drie' => 'drie',
                'vier' => 'vier',
            ),
            // Et cetera
        );
        if (array_key_exists($step, $stepData)) {
            return $stepData[$step];
        } else {
            die('[fatal] unable to fetch data of current step');
        }
    } // function __getStepData

    // Bevat een lijst van korte omschrijvingen van wat je bij elke stap hebt ingevuld
    protected function __getStepDescriptions() {
        return array(
            1 => 'Dit is de omschrijving bij stap 1',
            2 => 'Korte omschrijving bij stap 2',
            // Et cetera
        );
    } //  function __getStepDescriptions
} // class MyQuestionnaire

// Maak een instantie van de MyQuestionnaire klasse aan en voer deze uit.
$c = new MyQuestionnaire();
$c->execute();
?>

questionnaire.css (minimale opmaak)
body        { font-family: sans-serif; font-size: 10pt; margin: 50px; }
h1          { margin: 0; }
div.error   { padding: 10px; background-color: #ffcccc; }
div.error p { margin: 0; }

Reageren