[PHP] driedimensionale array uitlezen.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een formulier waar ik na het verzenden de $_POST uitlees.
Omdat ik ook een select multiple="multiple" velt heb krijg ik in mijn $_POST een tweede array.

Mijn probleem is: hoe lees ik deze uit in de onderstaande situatie:

$_POST[$pro_menu_categorieen_list[$i]] Werkt niet....

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
        while ($row = mysql_fetch_array($result)) {
            # Telt de aantal regels in de array. 
            $count = count($_POST['pro_menu_categorieen_list']);

            # Loop het aantal keer als regels in de array.
            for ($i = 0; $i <= $count; $i++) {
                
                # Als pro_menu_categorieen_list array gelijk is aan cat_sub_naam_nl dan selected.
                if ($_POST[$pro_menu_categorieen_list[$i]] == $row["cat_sub_naam_nl"])
                    $selected = " selected";
            }
                echo "<option value=\"" . $row["cat_sub_naam_nl"] . "\"" . $selected . ">" . $var["cat_main_naam_nl"] . " » " . $row["cat_sub_naam_nl"] . "</option>";
        }


Aanvulling: De bedoeling is dus dat de regels die ik heb geselecteerd weer geselecteerd worden na het verzenden d.m.v . selected

[ Voor 9% gewijzigd door Verwijderd op 02-11-2009 21:07 . Reden: Aanvulling. ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als iemand een suggestie heeft hoe dit makkelijker kan hoor ik dat uiteraard ook :)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je moet $_POST[$pro_menu_categorieen_list][$i] gebruiken. ;)

En hoe het makkelijker kan: Wordt bekend met de foreach loop, is een van de mooiste dingen dat er is. :P

[ Voor 47% gewijzigd door Voutloos op 02-11-2009 20:53 ]

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voutloos schreef op maandag 02 november 2009 @ 20:51:
Je moet $_POST[$pro_menu_categorieen_list][$i] gebruiken. ;)

En hoe het makkelijker kan: Wordt bekend met de foreach loop, is een van de mooiste dingen dat er is. :P
Ook $_POST[$pro_menu_categorieen_list][$i] heb ik geprobeerd, maar haalt niets uit.

Ik ben redelijk bekent met de foreach, echter vond ik het in deze situatie beter om met een for loop te werken omdat ik ook en count nodig heb om te vergelijk.

[ Voor 18% gewijzigd door Verwijderd op 02-11-2009 20:58 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De volgende code geeft wel gewoon de gegevens van mijn array.
PHP:
1
2
3
foreach($_POST['pro_menu_categorieen_list'] as $key => $value) {
echo "key: " . $key . " value: " . $value . "<br />";
}


Maar als ik er als ik er regel er uit wil halen krijg ik niets:
PHP:
1
echo "Één regel uit de array: " . $_POST[$pro_menu_categorieen_list][1];

Acties:
  • 0 Henk 'm!

Verwijderd

Doe eens:

PHP:
1
2
echo '<pre>';
print_r($_POST[$pro_menu_categorieen_list]);


Kun je precies zien wat er nu in die array zit

Edit: Wat hieronder staat is natuurlijk ook waar

[ Voor 15% gewijzigd door Verwijderd op 02-11-2009 21:19 ]


Acties:
  • 0 Henk 'm!

  • Duroth
  • Registratie: Juni 2007
  • Laatst online: 27-04-2016

Duroth

No rest for the tweaked

Verwijderd schreef op maandag 02 november 2009 @ 21:15:
De volgende code geeft wel gewoon de gegevens van mijn array.
PHP:
1
2
3
foreach($_POST['pro_menu_categorieen_list'] as $key => $value) {
echo "key: " . $key . " value: " . $value . "<br />";
}


Maar als ik er als ik er regel er uit wil halen krijg ik niets:
PHP:
1
echo "Één regel uit de array: " . $_POST[$pro_menu_categorieen_list][1];
$_POST['pro_menu_categorieen_list']
vs
$_POST[$pro_menu_categorieen_list]

Volgens mij wil je in die 2e instantie geen variabele gebruiken, maar gewoon een string, zoals in de eerste van die twee regels ;)

Acties:
  • 0 Henk 'm!

  • Scott
  • Registratie: December 2004
  • Laatst online: 06:19

Scott

Ik ben, dus ik tweak

$pro_menu_categorieen_list bestaat dan ook niet. Tenzij je die eerder ergens gemaakt hebt, maar als ik je code bekijk denk ik dat je $_POST['pro_menu_categorieen_list'][1] bedoelt.

edit: Duroth ;(

[ Voor 4% gewijzigd door Scott op 02-11-2009 21:19 ]


Acties:
  • 0 Henk 'm!

  • FriXion
  • Registratie: Juni 2007
  • Laatst online: 17-09 16:23
Werkt dit wel?

PHP:
1
2
3
<?php
echo "Één regel uit de array: " . $_POST['$pro_menu_categorieen_list'][1];
?>


Oh, spuitelf :P

[ Voor 7% gewijzigd door FriXion op 02-11-2009 21:19 ]


Acties:
  • 0 Henk 'm!

  • Duroth
  • Registratie: Juni 2007
  • Laatst online: 27-04-2016

Duroth

No rest for the tweaked

FriXion schreef op maandag 02 november 2009 @ 21:19:
Werkt dit wel?

PHP:
1
2
3
<?php
echo "Één regel uit de array: " . $_POST['$pro_menu_categorieen_list'][1];
?>


Oh, spuitelf :P
En nog fout ook ;)

hint: $

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt, ik krijg er nu wel de juiste waarden uit.

Verder werkt mijn selected nog niet, maar daar ga ik wel uit komen denk ik.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Tipje, leer goed debuggen met print_r() danwel var_dump(). Dan kun je snel zien hoe de structuur in elkaar zit als die je niet duidelijk is. Als je de bron van je output bekijkt zie je het goed, als je het in je browser direct goed wilt zien moet je er even pre-tags omheen zetten:

PHP:
1
2
3
echo '<pre>';
print_r($array);
echo '</pre>';

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Bovendien negeer je de nodige notices, dus zet je error_reporting wat hoger en zorg dat je ziet wat je doet. :z

{signature}


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Cartman! schreef op maandag 02 november 2009 @ 21:38:
Tipje, leer goed debuggen met print_r() danwel var_dump(). Dan kun je snel zien hoe de structuur in elkaar zit als die je niet duidelijk is. Als je de bron van je output bekijkt zie je het goed, als je het in je browser direct goed wilt zien moet je er even pre-tags omheen zetten:

PHP:
1
2
3
echo '<pre>';
print_r($array);
echo '</pre>';
Bedankt voor je tip!
Zeker handig heb nog nooit eerder print_r gebruikt. :*)

Thanks!

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Of een debugger. Heb je vast ook nog nooit eerder gebruikt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
.oisyn schreef op maandag 02 november 2009 @ 21:51:
Of een debugger. Heb je vast ook nog nooit eerder gebruikt.
Doe niets anders dan debuggen :P

Maar dit klinkt als je programma / tool... zeg eens, wat voor debugger heb je het over?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben er nu achter dat mijn selected niet werkt omdat ik mijn $_POST stip met
stripslashes()

PHP:
1
2
3
4
5
    if ($_POST) {
        foreach ($_POST as $key => $value) {
        $_POST[$key] = stripslashes($value);
        }
    }


Hierdoor blijft er niet veel over van mij $_POST['pro_menu_categorieen_list'][$i]
en is mijn if() nooit true :(

Helaas biedt addslashes() geen uitkomst.


Code die ik nu heb,werkend zonder: stripslashes().
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        while ($row = mysql_fetch_array($result)) {
            
            # Telt de aantal regels in de array. 
            $count = count($_POST['pro_menu_categorieen_list']);

            # Loop het aantal keer als regels in de array.
            for ($i = 0; $i <= $count; $i++) {
                
                # Als pro_menu_categorieen_list array gelijk is aan cat_sub_naam_nl dan selected.
                if ($_POST['pro_menu_categorieen_list'][$i] == $row["cat_sub_naam_nl"])
                    $selected = " selected";
            }
                echo "<option value=\"" . $row["cat_sub_naam_nl"] . "\"" . $selected . ">" . $var["cat_main_naam_nl"] . " » " . $row["cat_sub_naam_nl"] . "</option>";
                unset($selected);
        }

[ Voor 46% gewijzigd door Verwijderd op 02-11-2009 22:55 ]


Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 16-09 18:57
Waarom zou je gebruik willen maken van strip/addslashes? Klinkt alsof je de verkeerde middelen gebruikt om een bepaald iets te voorkomen :+

Ik denk dat je naar 1 van de volgende functies op zoek bent:Trouwens, om de leesbaarheid van je code iets te vergroten zou ik het zo schrijven (is maar hoe je het zelf fijn vind ;) ):
PHP:
1
2
3
4
5
6
7
8
while ($row = mysql_fetch_array($result)) { 
    $selected = "";
    foreach( $_POST['pro_menu_categorieen_list'] as $key => $value ){
         if( $value == $row["cat_sub_naam_nl"] )
             $selected = " selected";  
    }
    echo "<option value=\"" . $row["cat_sub_naam_nl"] . "\"" . $selected . ">" . $var["cat_main_naam_nl"] . " » " . $row["cat_sub_naam_nl"] . "</option>";
}

[ Voor 85% gewijzigd door Enfer op 02-11-2009 23:00 . Reden: Code typo's :+ ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Enfer schreef op maandag 02 november 2009 @ 22:55:
Waarom zou je gebruik willen maken van strip/addslashes? Klinkt alsof je de verkeerde middelen gebruikt om een bepaald iets te voorkomen :+

Ik denk dat je naar 1 van de volgende functies op zoek bent:
Het leek mij een goede optie om mijn $_POST data d.m.v. stripslashes() weer netjes in je input te plaatsen zodat deze gewijzigd kan worden zonder dat er opeens allemaal slasches tussen staan.
//"bla"// enzo.

Acties:
  • 0 Henk 'm!

  • Enfer
  • Registratie: Februari 2004
  • Laatst online: 16-09 18:57
Waarom zouden er uberhaupt slashes bijkomen, staan die toevallig dan al zo opgeslagen in de database? Zo ja waarom gebeurt dat, in plaats van bijvoorbeeld mysql_real_escape_string?

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
$selected = in_array($row["cat_sub_naam_nl"], $_POST['pro_menu_categorieen_list'])?" selected":"";


of helemaal inline
PHP:
1
2
3
4
while ($row = mysql_fetch_array($result))  
   echo "<option value=\"" . $row["cat_sub_naam_nl"] . "\""
      . in_array($row["cat_sub_naam_nl"], $_POST['pro_menu_categorieen_list']) ? " selected" : ""
      . ">" . $var["cat_main_naam_nl"] . " » " . $row["cat_sub_naam_nl"] . "</option>";


Ik zou het zoiezo niet met die count doen want als iemand eens een array post die niet uit opeenvolgende keys bestaat dan loopt het script in de soep

[ Voor 67% gewijzigd door Verwijderd op 02-11-2009 23:17 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Enfer schreef op maandag 02 november 2009 @ 23:03:
Waarom zouden er uberhaupt slashes bijkomen, staan die toevallig dan al zo opgeslagen in de database? Zo ja waarom gebeurt dat, in plaats van bijvoorbeeld mysql_real_escape_string?
Nee hoor, er staat niets in mijn database.
Ik heb een formulier waar ik data me post
deze post data echo ik weer in mijn velden als er een verkeerde invoer is.

Stel je schrijf dit in een textarea: hallo 'world'
dan kromt er bij verkeerde invoet zonder stripslashes() het volgende te staan:
hallo \'world\'

Vandaar dat ik stripslashes() gebruik, helaas gaat dit niet echt samen met mij $_POST['pro_menu_categorieen_list'].

Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Hoe fout kan een topic lopen.

Ten eerste is de juiste code:
PHP:
1
2
3
4
5
6
7
<?php
while ($row = mysql_fetch_array($result))
{
    $selected = in_array($_POST['pro_menu_categorieen_list'][$row['cat_sub_naam_nl']]);
    echo '<option value="' . htmlspecialchars($row["cat_sub_naam_nl"]) . '"' . ($selected ? ' selected="selected"' : '') . '>' . htmlspecialchars($var['cat_main_naam_nl'] . ' » ' . $row['cat_sub_naam_nl']) . '</option>';
}   
?>


Waarom zo? Je krijgt in je $_POST['pro_menu_categorieen_list'] een array met de values (uit de <option>-tag) die zijn geselecteerd. De indexen van die array zijn gewoon oplopende getallen en hebben verder geen echt nut voor je probleem. Je moet dus met een functie die naar de values in de array kan kijken checken of de waarde die je op dat moment uit de database haalt in die array staat. Dat doet in_array() voor je:
bool in_array ( mixed $needle , array $haystack [, bool $strict ] )

Searches haystack for needle .
htmlspecialchars() wordt gebruikt om ook categorienamen die HTML-tekens of andere "gevaarlijke" tekens toe te staan. (als je een categorie hebt die </option> heet zou opeens je dropdown niet meer werken, nu werkt het altijd*).

Dat gedoe met stripslashes en addslashes moet je absoluut vermijden. Je kunt beter het echte probleem aanpakken, dat is namelijk de magic_quotes_gpc-instelling die al lang en breed deprecated is en dus *uit* hoort te staan. Zet die dus ook uit. Mocht je hoster zo ouderwets zijn dat hij of zij dit niet wil doen zul je zelf een stukje code moeten maken dat de slashes verwijdert indien ze aanwezig zijn. Eenmalig. Ik heb ooit een snipped gepost op PHP Freakz, maar het is allemaal vrij basic. Als je dit namelijk niet doet blijf je door je hele code heen klieren met die irritante magic quotes.

Het echte escapen (waar addslashes() voor gemaakt is) doe je pas als je je gegevens gaat opslaan in de database. Dat doe je echter liever niet met addslashes(), maar met prepared ststements, de escaping manier die je DAL je biedt of in wat ouderwetsere gevallen mysql_real_escape_string().

Tevens lijkt het me nogal obvious dat je database niet genormaliseerd is. Als je meerdere talen wilt ondersteunen doe je dat door nieuwe tabellen aan te maken, niet door nieuwe kolommen aan te maken (je hebt *_nl kolommen, je zult waarschijnlijk ook wel *_en kolommen etc. hebben). Ga dus ook eens een stukje lezen over normalisatie. Ik vind deze altijd wel helder voor beginners: http://www.yapf.net/index.php/Database_ontwerp_101

* Mits charactersets ook goed staan.

Beetje spuit 11... Volgende keer wat minder multitasken.

[ Voor 9% gewijzigd door Tanuki op 02-11-2009 23:33 ]

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt l0c4lh0st!

Ik ben weer een stuk verder, hier kan ik echt wat mee!

Acties:
  • 0 Henk 'm!

Verwijderd

Wat doe je hier?
PHP:
1
$selected = in_array($_POST['pro_menu_categorieen_list'][$row['cat_sub_naam_nl']]);

Voor zover ik weet heeft in_array nog altijd 2 parameters, namelijk de needle en de haystack, dus wat jij doet klopt niet echt volgens mij...

Edit:
Moet dus zijn wat ik 2 posts naarboven heb gezet, of als je persé de $selected variabel als een boolean wilt hebben:
PHP:
1
$selected = in_array($_POST['pro_menu_categorieen_list'], $row['cat_sub_naam_nl']);

maar dat maakt het geheel er niet leesbaarder op vind ik, omdat je dan alsnog een inline vergelijking in de echo hebt.

[ Voor 37% gewijzigd door Verwijderd op 02-11-2009 23:54 ]


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Verwijderd schreef op maandag 02 november 2009 @ 23:49:
Wat doe je hier?
PHP:
1
$selected = in_array($_POST['pro_menu_categorieen_list'][$row['cat_sub_naam_nl']]);

Voor zover ik weet heeft in_array nog altijd 2 parameters, namelijk de needle en de haystack, dus wat jij doet klopt niet echt volgens mij...

Edit:
Moet dus zijn wat ik 2 posts naarboven heb gezet, of als je persé een boolean wilt hebben van de $selected:
PHP:
1
$selected = in_array($_POST['pro_menu_categorieen_list'], $row['cat_sub_naam_nl']);

maar dat maakt het geheel er niet leesbaarder op vind ik, omdat je dan alsnog een inline vergelijking in de echo hebt.
Sorry, het was al laat en ik was veel tegelijkertijd aan het doen. Bovenstaand klopt inderdaad.

De ternary valt wel mee, ($selected ? ' selected="selected"' : '') is heel goed leesbaar omdat het echt kort is en omdat het door de omringende haakjes afgescheiden wordt van de rest van de regel.
Verwijderd schreef op maandag 02 november 2009 @ 23:36:
Bedankt l0c4lh0st!

Ik ben weer een stuk verder, hier kan ik echt wat mee!
Dat was de bedoeling. :)

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Trouwens nog een tip voor als je net begonnen bent met php programmeren; zet eens bovenaan je code
PHP:
1
error_reporting(E_ALL);

Hierdoor zul je waarschijnlijk een hoop errors krijgen, maar daardoor leer je wel gelijk goed programmeren (je word verplicht variabelen te declareren voordat je ze gebruikt etc.).

En nog iets belangrijks is dat je alle input die van de gebruiker kan komen niet vertrouwd (!). Je kunt er bijvoorbeeld niet zomaar vanuit gaan dat de items in $_POST['pro_menu_categorieen_list'] allemaal opeenvolgende keys hebben, en als je niet goed op zulke dingen let dan heb je al heel snel veiligheidslekken en dan is je site binnen de kortste keren gehacked.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is een mooi stukje code alleen krijg ik er wel veel error van:

Warning: in_array() [<a href='function.in-array'>function.in-array</a>]: Wrong datatype for second argument in......

Ook selecteert hij niets na mijn post.

PHP:
1
2
3
4
5
6
7
<?php
while ($row = mysql_fetch_array($result))
{
    $selected = in_array($_POST['pro_menu_categorieen_list'],$row['cat_sub_naam_nl']);
    echo '<option value="' . htmlspecialchars($row["cat_sub_naam_nl"]) . '"' . ($selected ? ' selected="selected"' : '') . '>' . htmlspecialchars($var['cat_main_naam_nl'] . ' » ' . $row['cat_sub_naam_nl']) . '</option>';
}    
?>



Deze code werkt prima:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                    while ($row = mysql_fetch_array($result)) {
    
                        # Telt de aantal regels in de array. 
                        $count = count($_POST['pro_menu_categorieen_list']);

                        # Loop het aantal keer als regels in de array.
                        for ($i = 0; $i <= $count; $i++) {
                            
                            # Als pro_menu_categorieen_list array gelijk is aan cat_sub_naam_nl dan selected.
                            if ($_POST['pro_menu_categorieen_list'][$i] == $row["cat_sub_naam_nl"])
                                $selected = " selected";
                        }
                        echo "<option value=\"" . $row["cat_sub_naam_nl"] . "\"" . $selected . ">" . $var["cat_main_naam_nl"] . " » " . $row["cat_sub_naam_nl"] . "</option>";
                        unset($selected);
                    }


Misschien niet de mooiste oplossing maar het werkt wel netjes :9

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 03 november 2009 @ 12:12:
Het is een mooi stukje code alleen krijg ik er wel veel error van:

Warning: in_array() [<a href='function.in-array'>function.in-array</a>]: Wrong datatype for second argument in......
Dan ga je debuggen en kijk je wat de waarde is van het tweede argument dat je aan in_array probeert te voeren... Kom op, dat kleine beetje debuggen kun je zelf toch ook wel? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-08 17:53

Yoozer

minimoog

Verwijderd schreef op maandag 02 november 2009 @ 20:49:
Als iemand een suggestie heeft hoe dit makkelijker kan hoor ik dat uiteraard ook :)
Geef eens een screenshot/schets van wat je wil bereiken. Het lijkt me dat je het jezelf een stuk makkelijker kunt maken als je beter nadenkt over de interface.

teveel zooi, te weinig tijd


Acties:
  • 0 Henk 'm!

Verwijderd

Oeps, 2e paramter moet de array zijn, want je zoekt needle uit haystack:
dus:
PHP:
1
$selected = in_array($row['cat_sub_naam_nl'], $_POST['pro_menu_categorieen_list']);

Dat had ik in mijn bovenste post ook al staan maar toen in de 2e post verkeerd overgenomen

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik leer zo veel deze dagen :)
even iets anders:

Ik heb ook de error_reporting(E_ALL); aan staan en ben flink aan het debuggen... (wat ben ik slecht!) :'(

Dit gaat allemaal lekker.
Maar nu krijg ik van dit soort code om mijn variabelen te declareren:
PHP:
1
2
<label <? if (isset($txt_error['cat_main_naam_nl'])) echo $txt_error['cat_main_naam_nl']; ?>>Hoofdcategorie Nederlands*</label>
<input type="text" name="cat_main_naam_nl" value ="<? if (isset($_POST['cat_main_naam_nl'])) echo htmlspecialchars($_POST['cat_main_naam_nl']); ?>" <? if (isset($input_error['cat_main_naam_nl'])) echo $input_error['cat_main_naam_nl']; ?> /><br />


Ik wordt nu al helemaal gek van de if(isset())jes.... kan dit mooier en netter... Je ga mij toch niet vertellen dat dit een goede manier is?

Acties:
  • 0 Henk 'm!

Verwijderd

De mooiste manier is gebruik maken van templates, waarbij je je php-code en je html perfect scheidt.
Dit kan echter wel wat herschrijfwerk betekenen. Eventueel kan je met de ternaire operator je if-structuren wel verwijderen, maar je blijft met de php-code en de isset's tussen je html-code zitten.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 03 november 2009 @ 14:28:
De mooiste manier is gebruik maken van templates, waarbij je je php-code en je html perfect scheidt.
Dit kan echter wel wat herschrijfwerk betekenen. Eventueel kan je met de ternaire operator je if-structuren wel verwijderen, maar je blijft met de php-code en de isset's tussen je html-code zitten.
Onzin, het gebruik van templates kan op prima op de manier die zwompy hierboven beschrijft. PHP ís een template engine.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het kan prima, maar mooi en overzichtelijk is anders als je 15 input velden heb.

Acties:
  • 0 Henk 'm!

Verwijderd

Je zou inderdaad gebruik kunnen maken van templates, maar dat hoeft niet perse. Een hele goede om naar te kijken is bijvoorbeeld het Zend framework, en dan hoe de Zend_View en Zend_FrontController in elkaar zitten. Zowel de aanpak met templates (zoals met Smarty) als het Zend framework gaan uit van het MVC-model (model-view-controller). Deze aanpak is de algemeen geaccepteerde manier om zoiets te bouwen.

Templates vind ik zelf vaak ook overkill (vooral omdat PHP van oorsprong zelf al een template engine is), maar het kan soms wel nuttig zijn om te gebruiken, als je bijvoorbeeld designers (die niets van programmeren weten maar wel de HTML code moeten kunnen wijzigen) ook aan de website wil laten werken. Voor een kleine site waar jij alleen aan werkt, of een site waarbij iedereen die er aan werkt voldoende PHP kennis heeft, zijn templates imho overkill en kun je beter gebruik maken van de Zend_View om de data-laag en de presentatie gescheiden te houden (want daar gaat het eigenlijk om).

[ Voor 46% gewijzigd door Verwijderd op 03-11-2009 14:42 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Jongens, wat zwompy hierboven tikte is al een template. Functioneel is er geen enkel verschil met de Smarty-variant...
HTML:
1
2
<label {$txt_error.cat_main_naam_nl|default:''}>Hoofdcategorie Nederlands*</label>
<input type="text" name="cat_main_naam_nl" value ="{$_POST.cat_main_naam_nl|default:''|htmlspecialchars}" {$input_error.cat_main_naam_nl|default:''} /><br />

Doet toch echt precies hetzelfde.

Overigens is dit geen valide HTML, zwompy. En bovendien sta je wagenwijd open voor XSS-attacks.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

NMe schreef op dinsdag 03 november 2009 @ 14:46:
Jongens, wat zwompy hierboven tikte is al een template. Functioneel is er geen enkel verschil met de Smarty-variant...
HTML:
1
2
<label {$txt_error.cat_main_naam_nl|default:''}>Hoofdcategorie Nederlands*</label>
<input type="text" name="cat_main_naam_nl" value ="{$_POST.cat_main_naam_nl|default:''|htmlspecialchars}" {$input_error.cat_main_naam_nl|default:''} /><br />
Dat is niet helemaal waar:
PHP:
1
while ($row = mysql_fetch_array($result))

Is iets wat je echt niet in je presentatie wil hebben staan

[ Voor 9% gewijzigd door Verwijderd op 03-11-2009 14:47 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
NMe schreef op dinsdag 03 november 2009 @ 14:46:
Jongens, wat zwompy hierboven tikte is al een template. Functioneel is er geen enkel verschil met de Smarty-variant...
HTML:
1
2
<label {$txt_error.cat_main_naam_nl|default:''}>Hoofdcategorie Nederlands*</label>
<input type="text" name="cat_main_naam_nl" value ="{$_POST.cat_main_naam_nl|default:''|htmlspecialchars}" {$input_error.cat_main_naam_nl|default:''} /><br />

Doet toch echt precies hetzelfde.

Overigens is dit geen valide HTML, zwompy. En bovendien sta je wagenwijd open voor XSS-attacks.
http://validator.w3.org/check geeft geen errors...

XSS-attacks -> kan je dit toelichten, of wat doe ik verkeerd?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

No way dat de validator daar geen errors op geeft, zelfs onze eigen parser onderstreept wat er fout is aan die HTML...

En voor XSS attacks kun je vast ook wel even de term in Google gooien. ;)
Verwijderd schreef op dinsdag 03 november 2009 @ 14:47:
[...]

Dat is niet helemaal waar:
PHP:
1
while ($row = mysql_fetch_array($result))

Is iets wat je echt niet in je presentatie wil hebben staan
...omdat? Goed, je zal het niet daadwerkelijk met een recordset doen maar met een voorgevormd array, maar dat doe je in Smarty ook...

[ Voor 52% gewijzigd door NMe op 03-11-2009 14:57 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
NMe schreef op dinsdag 03 november 2009 @ 14:56:
No way dat de validator daar geen errors op geeft, zelfs onze eigen parser onderstreept wat er fout is aan die HTML...

En voor XSS attacks kun je vast ook wel even de term in Google gooien. ;)

[...]

...omdat? Goed, je zal het niet daadwerkelijk met een recordset doen maar met een voorgevormd array, maar dat doe je in Smarty ook...
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
<head>
<base href="http://localhost/admin/" />
<title></title>
<link rel="stylesheet" href="s.css" type="text/css" />
</head>
<body>
<div id="basis-tekst">

<div class="home">
<a href="javascript:history.go(-1)" class="u">Terug</a> - <a href="/admin/index.php" class="u">Home</a>

</div>
    <script type="text/javascript" src="js/editor/ed.js"></script>

    <h1>Hoofdcategorie toevoegen:</h1>
    <form method="post" action="categorie/categorie_toevoegen.php?shop=4&hoofd=true">
        <fieldset class="categorie-overzicht">
            <label >Hoofdcategorie Nederlands*</label>
            <input type="text" name="cat_main_naam_nl" value =""  /><br />

            <label >Omschrijving Nederlands*</label>
            <script type="text/javascript">edToolbar('mytxtarea1'); </script>
            <label></label>
            <textarea id="mytxtarea1" cols="" rows="" name="cat_main_naam_omschrijving_nl" ></textarea><br />

            <label >Tags Nederlands*</label>
            <input type="text" name="cat_main_tag_nl" value =""  /> Tags scheiden d.m.v. een comma.<br />

            <label >Hoofdcategorie Engels*</label>
            <input type="text" name="cat_main_naam_eng" value =""  /><br />

            <label >Omschrijving Engels*</label>
            <script type="text/javascript">edToolbar('mytxtarea2'); </script>
            <label></label>
            <textarea id="mytxtarea2" cols="" rows="" name="cat_main_naam_omschrijving_eng" ></textarea><br />

            <label >Tags Engels*</label>
            <input type="text" name="cat_main_tag_eng" value =""  /> Tags scheiden d.m.v. een comma.<br />

            <button name="submit_main" value="true">Nieuwe hoofdcategorie toevoegen  »</button>
        </fieldset>
    </form>
    <div class="home">

<a href="javascript:history.go(-1)" class="u">Terug</a> - <a href="/admin/index.php" class="u">Home</a>
</div>
</div>
</body>
</html>

Gooi hem er zelf maar eens doorheen:
http://validator.w3.org/#validate_by_input

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Nogal wiedes, de issets evalueren naar false waardoor er niks af wordt gedrukt op die regels in je label en input. Zorg eens dat die issets evalueren naar true door daadwerkelijk tekst in die variabelen te zetten en probeer dat nog eens te valideren. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bij invoer ook geen probleem:

HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
<head>
<base href="http://localhost/admin/" />
<title>

</title>
<link rel="stylesheet" href="s.css" type="text/css" />
</head>
<body>
<div id="basis-tekst">

<div class="home">
<a href="javascript:history.go(-1)" class="u">Terug</a> - <a href="/admin/index.php" class="u">Home</a>

</div>
    <script type="text/javascript" src="js/editor/ed.js"></script>

    <h1>Hoofdcategorie toevoegen:</h1>
    <form method="post" action="categorie/categorie_toevoegen.php?shop=4&hoofd=true">
        <fieldset class="categorie-overzicht">
            <label >Hoofdcategorie Nederlands*</label>
            <input type="text" name="cat_main_naam_nl" value ="Bla"  /><br />

            <label >Omschrijving Nederlands*</label>
            <script type="text/javascript">edToolbar('mytxtarea1'); </script>
            <label></label>
            <textarea id="mytxtarea1" cols="" rows="" name="cat_main_naam_omschrijving_nl" >Bla</textarea><br />

            <label >Tags Nederlands*</label>
            <input type="text" name="cat_main_tag_nl" value ="Bla"  /> Tags scheiden d.m.v. een comma.<br />

            <label >Hoofdcategorie Engels*</label>
            <input type="text" name="cat_main_naam_eng" value ="Bla"  /><br />

            <label >Omschrijving Engels*</label>
            <script type="text/javascript">edToolbar('mytxtarea2'); </script>
            <label></label>
            <textarea id="mytxtarea2" cols="" rows="" name="cat_main_naam_omschrijving_eng" >Bla</textarea><br />

            <label class="txt_error">Tags Engels*</label>
            <input type="text" name="cat_main_tag_eng" value ="" class="input_error" /> Tags scheiden d.m.v. een comma.<br />

            <button name="submit_main" value="true">Nieuwe hoofdcategorie toevoegen  »</button>
        </fieldset>
    </form>
    <div class="home">

<a href="javascript:history.go(-1)" class="u">Terug</a> - <a href="/admin/index.php" class="u">Home</a>
</div>
</div>
</body>
</html>

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Die class="" stond er eerst niet omheen. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nou, ik heb hem echt niet stiekem net even snel toegevoegd hoor.

Maar goed, als ik het goed begrijp moet ik mijn code gaan vervuilen met:
PHP:
1
<? if (isset($txt_error['cat_sub_naam_nl'])) echo $txt_error['cat_sub_naam_nl']; ?>


en dat dan een stuk of 30 keer... :|

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Laatst online: 17-09 14:28
Verwijderd schreef op dinsdag 03 november 2009 @ 15:30:
Nou, ik heb hem echt niet stiekem net even snel toegevoegd hoor.

Maar goed, als ik het goed begrijp moet ik mijn code gaan vervuilen met:
PHP:
1
<? if (isset($txt_error['cat_sub_naam_nl'])) echo $txt_error['cat_sub_naam_nl']; ?>


en dat dan een stuk of 30 keer... :|
Onzin lijkt me..
Je kan toch ook 1x een if + else plaatsen en dan zorgen dat als een waarde niet is geassocieerd dat die dan ineens een andere waarde krijgt? Waarom doen de meesten toch zo moeilijk..

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 03 november 2009 @ 15:30:
Nou, ik heb hem echt niet stiekem net even snel toegevoegd hoor.
Dan zul je het wel verwijderd hebben voordat je Verwijderd in "[PHP] driedimensionale array uitlezen." postte.... 8)7

Overigens gaan we nu wel heel erg de basale kant uit. Voordat je dit topic opende kende je de meestgebruikte debugtechnieken in PHP al niet, en nu stel je een vraag die aanduidt dat je niet inziet dat herhaling van dezelfde code slecht is en dat je dat kan combineren door één keer die check te doen en een standaardwaarde te zetten. Zou je er niet beter aan doen eerst eens wat te lezen over programmeren voordat je het daadwerkelijk doet?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Prima, ik denk dat je gelijk heb... ik ga nog wel ff googlen ;)

Bedankt voot de hulp tot zover

(slotje...)

Acties:
  • 0 Henk 'm!

  • Yoozer
  • Registratie: Februari 2001
  • Laatst online: 03-08 17:53

Yoozer

minimoog

Gewoon niet meer replyen, slotjes worden voor een reden uitgedeeld. Elk jaar is er slechts een klein quotum beschikbaar van die zilveren rakkers waar de verschillende modjes om moeten vechten. Wat je in het verslag van de MoaM niet terugleest is dat er een epische strijd losbarst, en de winnaar krijgt de meeste sloten. Van wat ik van NMe heb gehoord had 'ie dit jaar niet zo'n geweldige buit binnengehaald, dus...

Anyway, het feit dat je zelf tekstvelden aanmaakt voor de verschillende talen; dat kan beter. Immers, het enige verschil tussen NL en EN lijkt puur de taal te zijn, dus als je de combinatie tags + titel + content opslaat hoeft daar maar 1 flag bij met een LanguageId of zo. Vandaar ook : post eens een screenshot, zodat je beter advies kunt krijgen.

Het feit dat je ze volstrekt inconsistente namen geeft; dat kan ook beter. Nederlands of Engels, niet allebei door elkaar. Maak het jezelf makkelijker, niet moeilijker.

teveel zooi, te weinig tijd

Pagina: 1