"HELP" ik zit vast in lesboek !

Status
Niet open voor verdere reacties.

Lechuque

Gebruiker
Lid geworden
16 sep 2008
Berichten
25
Ik ben nu een een paar weken bezig met PHP5 in verschillende boeken en video
tutorials.
Steeds als ik tegen een probleem aanliep waar ik niet uitkwam,ging ik verder in een ander boek om te zien of ik daar antwoorden kon vinden.

De laatste dagen, ben ik gaan leren uit O'reilly PHP5 and mysql
omdat daar wat uitgebreider uitleg wordt gegeven.

Nu zit ik vast in een stuk code van enige afmeting.
Het zijn vooral undefined index meldingen die ik krijg, die ik niet allemaal weg krijg met
If(isset(...

ook werkt de code niet naar behoren.

Ik heb geprobeerd, de voorafgaande oefeningen nogmaals door te nemen,
maar daar heb ik geen oplossing kunnen vinden.

Ik hoop dat iemand mij kan bijstaan in dit probleem, zodat ik verder kan met het
ontleden van deze code.

(het is een flink stukje code, dus heb er begrip voor als het teveel gevraagd is.)

(ter inf. Ik heb error E~all aan staan in m'n php.ini en de laatste versie van WAMP)

Hironder de code:
PHP:
<?php
//echo a text box

function input_text($element_name, $values) {
   echo '<input type="text" name="' . $element_name .'" value="';
   echo htmlentities($values[$element_name]) . '"/>';  
}
?>

<?php
//echo a submit button

function input_submit($element_name, $label) {
    echo '<input type="submit" name="' . $element_name .'" value="';
    echo htmlentities($label) .'"/>';
}
?>

<?php
//echo a textarea

function input_textarea($element_name, $values) {
    echo '<textarea name="' . $element_name .'">';
    echo htmlentities($values[$defaults]) . '</textarea>';
}
?>

<?php
//echo a radio button or checkbox

function input_radiocheck($type, $element_name, $values, $element_value) {
    echo '<input type="' .$type. '" name="'
    .$element_name.'" value="' .$element_value. '" ';

    if ($element_value == $values[$element_name]) {
        echo ' checked="checked"';
    }
    echo '/>';
}
?>

<?php
//echo a <select> menu

function input_select($element_name, $selected, $options, $multiple = true) {
    // echo out the <select> tag
    echo '<select name="' . $element_name;
    // if multiple choices are permitted, add the multiple attribute
    // and add a [  ] to the end of the tag name
    if ($multiple) { echo '[  ]" multiple="multiple'; }
    echo '">';
    // set up the list of things to be selected

    $selected_options = array( );
    if ($multiple) {
        foreach ($selected[$element_name] as $val) {
            $selected_options[$val] = true;
        }
    } else {
        $selected_options[ $selected[$element_name] ] = true;
    }
    // echo out the <option> tags

    foreach ($options as $option => $label) {
        echo '<option value="' . htmlentities($option) . '"';
        if (isset($selected_options[$option])) {
            echo ' selected="selected"';
        }
        echo '>' .htmlentities($label). '</option>';
    }
    echo '</select>';
}
?>

<?php

// don't forget to include the code for the form
// helper functions defined in Example 6-29
// setup the arrays of choices in the select menus
// these are needed in display_form( ), validate_form( ),
// and process_form( ), so they are declared in the global scope

$sweets = array('puff' => 'Sesame Seed Puff',
                'square' => 'Coconut Milk Gelatin Square',
                'cake' => 'Brown Sugar Cake',
                'ricemeat' => 'Sweet Rice and Meat');

$main_dishes = array('cuke' => 'Braised Sea Cucumber',
                     'stomach' => "Sauteed Pig's Stomach",
                     'tripe' => 'Sauteed Tripe with Wine Sauce',
                     'taro' => 'Stewed Pork with Taro',
                     'giblets' => 'Baked Giblets with Salt',
                     'abalone' => 'Abalone with Marrow and Duck Feet');

// The main page logic:
// - If the form is submitted, validate and then process or redisplay
// - If it's not submitted, display

if (isset($_POST['_submit_check'])) {

    // If validate_form( ) returns errors, pass them to show_form( )
    if ($form_errors = validate_form( )) {
        show_form($form_errors);
    } else {
        // The submitted data is valid, so process it
        process_form( );
    }
} else {
    // The form wasn't submitted, so display
    show_form( );
}

function show_form($errors = '') {
    // If the form is submitted, get defaults from submitted parameters
    if (isset($_POST['_submit_check'])) {
        $defaults = $_POST;
    } else {
        // Otherwise, set our own defaults: medium size and yes to delivery
        $defaults = array('delivery' => 'yes',
                          'size'     => 'medium');
    }
    // If errors were passed in, put them in $error_text (with HTML markup)
    if ($errors) {
        $error_text = '<tr><td>You need to correct the following errors:';
        $error_text .= '</td><td><ul><li>';
        $error_text .= implode('</li><li>',$errors);
        $error_text .= '</li></ul></td></tr>';
    } else {
        // No errors? Then $error_text is blank
        $error_text = '';
    }
    // Jump out of PHP mode to make displaying all the HTML tags easier
?>

<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<table border="1">
<?php echo $error_text ?>

<tr><td>Your Name:</td>
    <td><?php input_text('name', $defaults) ?></td>
</tr>
<tr>
   <td>Size:</td>
   <td><?php input_radiocheck('radio','size', $defaults, 'small');  ?> Small <br/>
       <?php input_radiocheck('radio','size', $defaults, 'medium'); ?> Medium <br/>
       <?php input_radiocheck('radio','size', $defaults, 'large');  ?> Large
    </td>
</tr>
<tr>
   <td>Pick one sweet item:</td>
   <td><?php input_select('sweet', $defaults, $GLOBALS['sweets']); ?></td>
</tr>
<tr>
   <td>Pick two main dishes:</td>
   <td><?php input_select('main_dish', $defaults, $GLOBALS['main_dishes'], true) ?></td>
</tr>
<tr>
   <td>Do you want your order delivered?</td>
   <td><?php input_radiocheck('checkbox','delivery', $defaults, 'yes'); ?> Yes</td>
</tr>
<tr>
   <td>Enter any special instructions.<br/>
       If you want your order delivered, put your address here:
   </td>
   <td><?php input_textarea('comments', $defaults); ?></td>
</tr>
<tr><td colspan="2" align="center"><?php input_submit('save','Order'); ?></td></tr>
</table>


<input type="hidden" name="_submit_check" value="1"/>
</form>

<?php
      } // The end of show_form( )

function validate_form( ) {
    $errors = array( );

    // name is required

    if (! strlen(trim($_POST['name']))) {
        $errors[  ] = 'Please enter your name.';
    }
    // size is required

    if (($_POST['size'] != 'small') && ($_POST['size'] != 'medium') &&
        ($_POST['size'] != 'large')) {
        $errors[  ] = 'Please select a size.';
    }
    // sweet is required

    if (! array_key_exists($_POST['sweet'], $GLOBALS['sweets'])) {
        $errors[  ] = 'Please select a valid sweet item.';
    }
    // exactly two main dishes required

    if (count($_POST['main_dish']) != 2) {
        $errors[  ] = 'Please select exactly two main dishes.';
    } else {
        // We know there are two main dishes selected, so make sure they are
        // both valid

        if (! (array_key_exists($_POST['main_dish'][0], $GLOBALS['main_dishes']) &&
               array_key_exists($_POST['main_dish'][1], $GLOBALS['main_dishes']))) {
            $errors[  ] = 'Please select exactly two valid main dishes.';
        }
    }
    // if delivery is checked, then comments must contain something
    if (($_POST['delivery'] == 'yes') && (! strlen(trim($_POST['comments'])))) {
        $errors[  ] = 'Please enter your address for delivery.';
    }
    return $errors;
}


<?php
function process_form( ) {
    // look up the full names of the sweet and the main dishes in
    // the $GLOBALS['sweets'] and $GLOBALS['main_dishes'] arrays

    $sweet = $GLOBALS['sweets'][ $_POST['sweet'] ];
    $main_dish_1 = $GLOBALS['main_dishes'][ $_POST['main_dish'][0] ];
    $main_dish_2 = $GLOBALS['main_dishes'][ $_POST['main_dish'][1] ];

    if ($_POST['delivery'] == 'yes') {
        $delivery = 'do';
    } else {
        $delivery = 'do not';
    }
    // build up the text of the order message

    $message=<<<_ORDER_

Thank you for your order, $_POST[name].
You requested the $_POST[size] size of $sweet, $main_dish_1, and $main_dish_2.
You $delivery want delivery.

_ORDER_;

if (strlen(trim($_POST['comments']))) {
   $message .= 'Your comments: '.$_POST['comments'];
}
?>


<?php
// send the message to the chef

mail('chef@restaurant.example.com', 'New Order', $message);

// echo the message, but encode any HTML entities
// and turn newlines into <br/> tags

echo nl2br(htmlentities($message));
}

?>
 
Laatst bewerkt:
Kun je de code even omgeven met [ php][/php] tags? Dat is een stuk leesbaarder. En wat gaat er precies mis? Welke errors krijg je, wat werkt er niet?
 
Kun je de code even omgeven met [ php][/php] tags? Dat is een stuk leesbaarder. En wat gaat er precies mis? Welke errors krijg je, wat werkt er niet?

Ik heb deze code overgetikt uit het boek, vandaar dat er geen <?php ?> tags om de stukken code zitten, als je dat bedoelt. of bedoel je in DEZE textarea ?
(sorry, ben nog niet bekend met met het geheel)

--------------------------------

Wat er mis gaat is dat in mn browser (localhost) , de textareas en input fields gevuld zijn met onderliggende foutmeldingen uit paginabron.

Ik heb E~all aan staan.
zonder dit zijn de errors niet te zien

ook krijg ik, een script opgeroepen error als ik de juiste aantal dishes -> (maaltijden)
selecteer, dus een melding: "je moet 2 maaltijden selecteren" uit de<select> area
terwijl ik dit jiust doe.

Lekker nummertje b.t.w ,sla t op.
 
Laatst bewerkt:
Ik bedoelde de [ php] tags hier op het forum ja. Die veranderen je code van dit:

$var = "string" . "meer string" . $var;
echo str_repeat( $var, 100 );

naar dit:

PHP:
$var = "string" . "meer string" . $var;
echo str_repeat( $var, 100 );

Leest een stuk beter, zeker voor grote stukken code :)
 
Ik vermoed overigens dat je de issets() moet toevoegen in de functies bovenaan, deze code controleert helemaal nergens of dingen wel of niet geset zijn en daarom gaat het mis (en de errors worden gewoon geprint waar ze optreden; midden in de html output dus)
 
Ik vermoed overigens dat je de issets() moet toevoegen in de functies bovenaan, deze code controleert helemaal nergens of dingen wel of niet geset zijn en daarom gaat het mis (en de errors worden gewoon geprint waar ze optreden; midden in de html output dus)

Sorry van de code tags zal niet meer gebeuren .

En ja, de vars en arrays zijn niet gezet, maar ik kom dit in elk boek weer tegen
en het is voor een beginner niet altijd even makkeleijk om ze op de juiste manier te zetten,
omdat dit in de boeken die ik heb , niet gedaan wordt en ik ook niet weet waar ik t zoeken moet.

Als ik de _POST's een waarde mee zou geven of NULL zou maken dan is de user input weer verdwenen,
als er slechts 1 input field door de user opniew ingevuld zou moeten worden.

De user input, zou bewaard moeten blijven, bij het opniew opnvragen van de page.

kan je me misschien een paar voorbeelden geven aan de hand van deze code ?
 
Laatst bewerkt:
Klopt, wat dat betreft loop je al een niveau voor op de tutorials, die leren het je vaak heel slecht aan...

isset moet je gebruiken op het moment dat je niet zeker weet of een bepaalde variabele bestaat. Eigenlijk, als je het echt goed doet, gebruik je isset vrijwel alleen maar om te controleren of $_POST of $_GET waarden ingevuld zijn, zo'n beetje alle andere variabelen hoor je namelijk zelf aan te maken en dus moet je wel weten dat ze bestaan.

Wat je nog kunt doen met dit voorbeeld is error_reporting wat lager zetten zodat de notices niet getoond worden, waarschijnlijk werkt het dan al beter. Anders zul je denk ik grote delen van het script aan moeten gaan passen zodat op de juiste plekken isset() gebruikt kan worden maar das nog best lastig als beginner... zoals je zelf al zegt.
 
Wat je nog kunt doen met dit voorbeeld is error_reporting wat lager zetten zodat de notices niet getoond worden, waarschijnlijk werkt het dan al beter. Anders zul je denk ik grote delen van het script aan moeten gaan passen zodat op de juiste plekken isset() gebruikt kan worden maar das nog best lastig als beginner... zoals je zelf al zegt.[/QUOTE]

Waar, ik bang voor ben als ik de errors lager zet, is dat in de toekomst als ik,
(OOIT) php onder de knie krijg, en een server tegenkom waar de error reporting WEL
hoog staat ,ik niet weet hoe ik dit moet omzeilen.

Daarom wil ik het graag "schoon" houden zodat ik op alles voorbereid ben.
als je begrijpt wat ik bedoel

Zou ik dit misschien op kunnen lossen door If(!isst(... te gebruiken en dan een standaard waarde mee geven ?

of is dit niet zoals 't hoort ?
 
Laatst bewerkt:
Dat is wel degelijk hoe het hoort. De standaard aanpak voor het afhandelen van formulier data (met $_POST) is ongeveer om alle nodige variabelen aan te maken en ze te vullen met $_POST values, in plaats van te werken met $_POST zelf.

Dus je krijgt dan zoiets:

PHP:
$naam = '';
if ( isset( $_POST['naam'] )  ) {
$naam = $_POST['naam'];
}

$email = '';
if ( isset ( $_POST['email'] ) ) {
$email = $_POST['email'];
}

Als je dit op al je (mogelijke) $_POST variabelen toepast dan hoef je daarna je geen zorgen meer te maken over variabelen die niet bestaan, omdat je altijd gebruik maakt van $naam en $naam altijd bestaat; hij is of leeg, of bevat iets uit $_POST.

Je kunt proberen om je huidige script daar op aan te passen, hoewel ik eigenlijk van mening ben dat de hele gebruikte functies gewoon niet netjes zijn. Dus in die functies zou je ook nog een extra check moeten doen of de meegegeven array value wel gezet is (met een isset( $values[ $element_name ] ) voordat je de value output)
 
Je kunt proberen om je huidige script daar op aan te passen, hoewel ik eigenlijk van mening ben dat de hele gebruikte functies gewoon niet netjes zijn. Dus in die functies zou je ook nog een extra check moeten doen of de meegegeven array value wel gezet is (met een isset( $values[ $element_name ] ) voordat je de value output)[/QUOTE]

Het is heel frustrurend allemaal, Ik probeer al wekenlang om door de php boeken heen te komen ,ongeveer 10 uur per dag.

Om dan elke dag de helft van de tijd met debuggen bezig te moeten zijn.
Ik vind het allemaal niet zo best uitgelegd in de boeken die bekend staan als de beste op php gebied.

Ik ben heel erg blij dat er nog mensen zijn zoals jij, die bereid zijn om een onbekende
uit de brand te helpen.

Heel erg bedankt voor de je tijd en moeite, ik ben erg geholpen.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan