echo probleempje
ik ben nieuw hier en en absolute php-beginner. 15 Jaar geleden ooit een korte php-introductie gevolgd maar die kennis is ver weg gezakt.
Ik heb nu toch weer een klusje en vind het best aardig om er weer mee bezig te zijn maar loop natuurlijk meteen tegen een hoop problemen aan, bijvoorbeeld dit:
Ik haal uit een database gegevens op en ga die vervolgens via echo in een via tabel laten zien. Daarbij wil ik aan het eind van iedere regel van de tabel ($row) een knop maken die het mogelijk maakt om via een andere pagina het record te wijzigen. Ik heb al van alles geprobeerd maar het lukt mij niet om de waarde in het formulier mee te geven die gewijzigd moet worden: Deze code gebruik ik nu (die dus misloopt op:
De hele code van die echo:
Code (php)
1
2
3
2
3
<?php
echo '<tr><td>'.$row['achternaam'].'</td><td>'.$row['contracttype'].'</td><td>'.$row['registratiedatum'].'</td>'.'<td>'.date('Y-m-d').'</td>'.'<td>'.$afgerond.' '.'weken'.'</td><td>'.$adres.'</td><td>'.$herinnering.'<td><form action="wijzig.php" method="post"><input type="text" name="naam" value="'[code]<?php echo $row['achternaam']; ?>'"><input type="submit" name="wijzig" value="Wijzig"></form></td></tr>';
?>
echo '<tr><td>'.$row['achternaam'].'</td><td>'.$row['contracttype'].'</td><td>'.$row['registratiedatum'].'</td>'.'<td>'.date('Y-m-d').'</td>'.'<td>'.$afgerond.' '.'weken'.'</td><td>'.$adres.'</td><td>'.$herinnering.'<td><form action="wijzig.php" method="post"><input type="text" name="naam" value="'[code]<?php echo $row['achternaam']; ?>'"><input type="submit" name="wijzig" value="Wijzig"></form></td></tr>';
?>
iemand een idee hoe ik dat correct opneem?
Alvast heel hartelijke dank,
Marc
Edit:
Code-tag geplaatst. Lees ook de Veelgestelde Vragen waarin de opmaak-codes uitgelegd worden.
Gewijzigd op 26/11/2018 01:11:06 door - Ariën -
* de records zouden ook makkelijk te identificeren moeten zijn, dit wordt vaak bereikt door een auto-increment id mee te geven aan een tabel. vervolgens geef je dit item mee aan de form action, bijvoorbeeld: edit.php?id=5. Zo weet je direct over welk record het gaat.
* PHP-blokken kun je te allen tijde openen en weer sluiten. Persoonlijk -hier verschillen de meningen wel over- vind ik het handiger als de statische delen buiten PHP-blokken vallen, en de dynamische delen in PHP-blokken zitten. Zo heb je ook -in het algemeen- een goede tweedeling tussen statisch en dynamisch. Dit is in ieder geval een stuk beter leesbaar dan een hele hoop echo's, enkele quotes en dubbele quotes.
* de data in de formuliervelden kunnen mogelijk HTML bevatten. Deze moeten vervolgens niet ook als HTML geinterpreteerd kunnen worden lijkt mij. Daartoe is het zaak dat je deze data van de mogelijk speciale betekenis binnen HTML stript. Dit doe je met functies als htmlspecialchars().
Escaping-functionaliteit is wel (sterk) afhankelijk van de gebruikte character encoding, dus hier zul je bewust mee moeten omgaan, maar dat is sowieso al nodig om data goed de database in te krijgen en er weer correct uit te halen. Als shorthand zou je hier een functie voor kunnen introduceren, bijvoorbeeld als volgt (aangenomen dat je overal UTF-8 gebruikt):
En vervolgens wordt je HTML zoiets als:
Code (php)
Gewijzigd op 26/11/2018 00:11:56 door Thomas van den Heuvel
@Ozzie: ja, dat werkt. Ik had dit al eerder geprobeerd maar dan zonder die punten en die maken het verschil!
Marc O op 26/11/2018 13:30:19:
Deze zin zegt mij nog niet zoveel: "Escaping-functionaliteit is wel (sterk) afhankelijk van de gebruikte character encoding,".
In een ander draadje (interne link) komt character encoding weer ter sprake. Wat je hiervan mee moet nemen is dat alle tekst een character encoding heeft. Dit wil zeggen dat de grafische karakters (letters en andere symbolen) een bepaalde codering op byte-niveau (in het geheugen) hebben.
Het "escapen" van een passage is het ontdoen van de mogelijk speciale betekenis die de passage heeft binnen de gebruikte context. Dat klinkt misschien wat abstract. Beschouw de PHP-string "<hr>". Als je deze weergeeft in een HTML-document, dan wordt niet de tekst "<hr>" weergegeven, maar een horizontale lijn. Dit komt omdat het geheel "<hr>" een speciale betekenis heeft in HTML - dit is een zogenaamde horizontal rule tag. Een functie als htmlspecialchars() zorgt ervoor dat karakters die een speciale betekenis hebben binnen de HTML-context worden omgezet (of "onschadelijk" worden gemaakt zeg maar) naar een variant die geen speciale betekenis heeft in HTML. Zo zal een openingshaak (het kleiner-dan teken <) worden omgezet naar zijn entiteit (<) en op een zelfde wijze wordt een sluitingshaak (het groter-dan teken >) ook omgezet naar zijn entiteit (>). htmlspecialchars() zorgt dus dat effectief <hr> wordt omgezet naar <hr>, wat in een HTML-document weer wordt weergegeven als (letterlijk) <hr> (dit omdat < de HTML-entiteit is voor <, en > die van >).
Maar om die symbolen dus goed op te kunnen pikken moet je dus weten hoe deze in het geheugen geëncodeerd zijn, daarom is het belangrijk dat je dus de character encoding vastlegt, en ook liefst overal hetzelfde houdt.
Op eenzelfde wijze heb je escaping in de SQL-context (met functies als real_escape_string()). En dit is dan om te voorkomen dat DATA enige speciale betekenis binnen je SQL heeft, met alle mogelijk rampzalige gevolgen van dien, zoals bijvoorbeeld SQL-injectie.
Als je dus netjes en veilig wilt omspringen met content en databases heb je dus wel een zekere minimale set van voorzieningen nodig om ervoor te zorgen dat dit ook echt werkt. Je bewust zijn van zaken als "character encoding", "output escaping" enzo lijken mij een minimale vereiste.
Of je maakt gebruik van een aanpak waarin je gewoon begint en het schip op den duur strandt (interne link) zonder dat je precies weet wat er misgaat... Your choice.
Marc O op 26/11/2018 13:30:19:
De code die je voorstelt werkt (nog) niet.
In de snippet HTML + PHP wordt de functie "escape()" gebruikt - deze staat in de eerdere snippet gedefinieerd. Deze functie zul je dus ergens in je code moeten opnemen (declareren) voordat je deze kunt gebruiken (aanroepen).
Als dat nog steeds niet werkt zul je wat verder moeten uitweiden over wat er precies niet werkt :).
Gewijzigd op 26/11/2018 16:27:37 door Thomas van den Heuvel
Quote:
Als je dus netjes en veilig wilt omspringen met content en databases heb je dus wel een zekere minimale set van voorzieningen nodig om ervoor te zorgen dat dit ook echt werkt. Je bewust zijn van zaken als "character encoding", "output escaping" enzo lijken mij een minimale vereiste.
Of je maakt gebruik van een aanpak waarin je gewoon begint en het schip op den duur strandt (interne link) zonder dat je precies weet wat er misgaat... Your choice.
Of je maakt gebruik van een aanpak waarin je gewoon begint en het schip op den duur strandt (interne link) zonder dat je precies weet wat er misgaat... Your choice.
Dank voor je uitleg! Het heeft mijn onverdeelde aandacht :-)
Marc O op 26/11/2018 13:30:19:
De code die je voorstelt werkt (nog) niet.
Quote:
In de snippet HTML + PHP wordt de functie "escape()" gebruikt - deze staat in de eerdere snippet gedefinieerd. Deze functie zul je dus ergens in je code moeten opnemen (declareren) voordat je deze kunt gebruiken (aanroepen).
Als dat nog steeds niet werkt zul je wat verder moeten uitweiden over wat er precies niet werkt :).
Als dat nog steeds niet werkt zul je wat verder moeten uitweiden over wat er precies niet werkt :).
Ik had die functie opgenomen en aangeroepen maar helaas. Inmiddels werkt het wel zoals ik antwoordde aan Ozzie.
Gewijzigd op 27/11/2018 21:53:11 door Marc O
Ook dan zou je die escape() functie prima kunnen gebruiken.
Maar welke karakterencoding gebruik je? Als je rechtsklikt en de pagina-info bekijkt, dan kan je dit zien.
Als dit UTF-8 is, dan moet je ook consistent UTF-8 toepassen in je website. Van je bestands-encoding, tot je HTML-metatag, eventueel nog de headers, en zelfs je database. Tenzij je vreemde tekens wilt zien bij exotische karakters.
- Ariën - op 27/11/2018 21:55:45:
Zelf raad ik aan om HTML buiten PHP te houden.
Ook dan zou je die escape() functie prima kunnen gebruiken.
Ook dan zou je die escape() functie prima kunnen gebruiken.
Dat ga ik proberen maar kan ik wel om de 'echo' heen?
Quote:
Maar welke karakterencoding gebruik je? Als je rechtsklikt en de pagina-info bekijkt, dan kan je dit zien.
Als dit UTF-8 is, dan moet je ook consistent UTF-8 toepassen in je website. Van je bestands-encoding, tot je HTML-metatag, eventueel nog de headers, en zelfs je database. Tenzij je vreemde tekens wilt zien bij exotische karakters.
Als dit UTF-8 is, dan moet je ook consistent UTF-8 toepassen in je website. Van je bestands-encoding, tot je HTML-metatag, eventueel nog de headers, en zelfs je database. Tenzij je vreemde tekens wilt zien bij exotische karakters.
Ja, ik gebruik UTF-8 in zowel de metatag als de database.
Gewijzigd op 27/11/2018 22:05:29 door Marc O