PHP

Uit Roncalli Wiki
Ga naar: navigatie, zoeken

Inhoud

Brede Basis Cursus

Documentatie en Tutorials

Maken en Doen

Bekijken en bij de hand houden

Oefening 1

Een mail formulier

Maak deze opdrachten zelf en kopieer dus geen code van anderen, behalve als de opdracht het vermeldt. Je kan wel je eigen regels werkende code kopiƫren, dat is immers je eigen code.

Maak een bestand form1.php met daarin de volgende code:

<form action="form2.php" method="get">
Voornaam: <input type="text" name="voornaam">
<input type="submit">
</form>

Maak nu de bestand form2.php met daarin de volgende code:

<? $voornaam = $_REQUEST['voornaam'];
    print "jij bent $voornaam";
?>

Maak nu een bestand form3.php door een kopie van form1.php te maken. Verander het volgende:

  • breidt het formulier met velden voor achternaam, adres en plaats.
  • gebruik radio buttons voor Man/Vrouw velden.
  • gebruik een select input met keuze uit een aantal landen.
  • maak een textarea met ruimte voor een eigen opmerking.
  • zorg ervoor dat je al deze velden ook in beeld brengt.
  • ruim de pagina op door alle velden netjes in een HTML tabel te zetten.
  • Maak nu nog een veld email en stuur een emailtje met deze informatie naar dit email adres.

Je hebt nu een veiligheidslek gemaakt, want spammers gaan dit misbruiken.

  • Verander de code zodanig dat het mailtje alleen naar jou gaat. Komt het aan?
  • Om ook de robots uit te schakelen (geheid dat die ook komen) moet je een Captcha toevoegen aan je formulier. Deze codes mag je zo over-kopiĆ«ren.

Structuur HTML/PHP Pagina

Als je een pagina goed opzet, ziet ie er ongeveer zo uit:

  • 1: $_REQUEST variabelen checken en inlezen
  • 2: Bepalen wat er moet gaan gebeuren
  • 3: Het laten gebeuren
  • 4: Pagina printen
  • re-organiseer je code nu zo dat duidelijk wordt waar wat gebeurt. Gebruik de commentaarvelden:
/* 
  Dit is een commentaar van enkele regels. 
*/

of

// Een commentaar van 1 regel. Kan ook achter een stuk code
     

Database Operaties

Toegang

Bezoek phpMyAdmin of gebruik een andere manier om aan een sql prompt te komen.

Database definitie

Je krijgt de volgende tabel gegeven:

CREATE TABLE `mailMessage` (
 `mailId` int(11) NOT NULL auto_increment,
 `mailNick` varchar(40) NOT NULL default ,
 `mailEmail` varchar(60) default NULL,
 `mailAddress` varchar(40) default NULL,
 `mailAddress2` varchar(40) default NULL,
 `mailZipCode` varchar(40) default NULL,
 `mailCity` varchar(40) default NULL,
 `mailWebsite` varchar(40) default NULL,
 `mailSubject` text,
 `mailText` text,
 `mailPhone1` varchar(12) default NULL,
 `mailDate` datetime NOT NULL default '2007-07-07 00:00:00',
 PRIMARY KEY  (`mailId`),
 FULLTEXT KEY `mailSubject` (`mailSubject`),
 FULLTEXT KEY `mailText` (`mailText`)
) ENGINE=MyISAM AUTO_INCREMENT=39 DEFAULT CHARSET=latin1;

Draai deze code in de SQL prompt. Dan krijg je een tabel: mailMessage. De code is niet helemaal goed voor jou: je hebt een veld land en dat zit hier niet bij. In PhpMyAdmin, maak een extra kolom voor land en evt. andere velden die je mist.

Database Verbinding

Leg verbinding met je database met de volgende code:

$host = "localhost";
$user = "jouwes";
$pass = "jouwes";
$dbname   = "jouwes";
$db = mysql_connect($host, $user, $pass)  or die('Could not connect: ' . mysql_error());
mysql_select_db($dbname) or die('Could not select database');

De code om een query te draaien zoek je maar lekker op in de documentatie. Alleen de queries zelf worden nog gegeven. Deze werken prima op de eerdere versie van de tabel ;-)

Insert Query

De database queries in SQL worden gegeven. Als eerste moet je de gegevens uit het formulier - die je dus ook al mailt - ook nog eens in de database zetten. Gebruik de volgende query als voorbeeld, maar gebruik variabelen in plaats van de vaste gegevens die er nu in staan.

$sql_ins = "insert into mailMessage 
                    (mailNick,mailEmail,mailAddress,mailAddress2,mailZipCode,mailCity,mailWebsite,
                     mailSubject,mailText,mailPhone1,mailDate)
                     values  
                     ('Ichnaton','bvoeten@roncallimavo.ennel', 'Tattistraat 3','Prinsenland','Rotterdam','3306 AA','http://roncalli.nu',
                     'Test Bericht','Hoi. Goed, het lukt! Er zit 1 fout in, haal die er effe uit?','0123456789',NOW())";

De code moet je alsvolgt uitvoeren:

$query = mysql_query($sql_ins)
if ( mysql_error() ) }
   print "Fout in $sql_ins" :  mysql_error() ;
} else {
   print "Gegevens opgeslagen";
}

Select Query

Met een select query kun je gegevens ophalen uit de database. Maak een pagina lijst.php die een lijst maakt van alle mailMessages in de database.

$sql_select =  "select  mailId, mailNick,mailEmail,mailAddress,mailAddress2,mailZipCode,mailCity,mailWebsite,
                     mailSubject,mailText,mailPhone1,mailDate from mailMessage";
$query = mysql_query($sql_select);
 if (mysql_error() ) {
    print "Fout in $sql_select" :  mysql_error() ;
} else {
      while ($res = mysql_fetch_array($query)) {
         * hier nog meer code
          print $res['mailNick' ] ;
        * hier nog meer code
   }

Ga met deze code verder zodat voor elke mailMessage een rij in een tabel wordt geprint met ook alle andere velden. Maak van het subject een link naar de pagina bewerken.php. Geef de GET-parameter mailId mee, zoals in dit voorbeeld: bewerken.php?mailId=123 .

Edit formulier

Maak nu de pagina bewerken.php. Begin met een kopietje van het invoer-formulier. Bouw het nu om zodat:

  • je de variabele mailId ophaalt uit $_GET
  • deze variabele meeneemt naar een nieuwe select query (select .... from .. where mailId = 123).
  • precies 1 rij ophalen uit de database. Controleer daar weer op.
  • de waarden van de velden weergeven in het formulier: <input name=... type=.... value="Voorbeeld Text" >
  • een Submit knop met als tekst (value) Wijzigingen Opslaan
  • bedenk waar je het formulier heen laat posten: de pagina opslaan_wijzigingen.php . Maak deze pagina en zet daarin een update query: sql_update = "update mailMessage set mailEmail = 'blabla' , mailMessage = 'bla di blaaaat' where mailId = 1"
  • Het kan zijn dat die 1 een andere mailID betreft, maar het gaat om het voorbeeld. Als je meer velden moet updaten dan kan dat.

Meer anti-inbraak code met mysql_real_escape_string

Als je variabelen die van een gebruiker komen zomaar in je database loslaat, krijg je geheid inbrekers. Gebruik de functie mysql_real_escape_string om de strings eerst te escapen: $variabele = mysql_real_escape_string($_GET['variabele']); Verander nu alle pagina's zodanig dat $_GET variabelen eerst allemaal 1 voor 1 door deze functie heen worden gehaald.


Omgaan met Smarty template

Je ziet dat je PHP/HTML code nu 1 grote chaos is. Goed zo. Jij kan het nu. Een ander kan het alleen niet lezen. Om te kunnen samenwerken met HTML Vormgevers is er Smarty.

  • Lees de documentatie van Smarty
  • Installeer Smarty in je site
  • Kopieer je hele map naar een map php_smarty en pas die bestanden aan zodanig dat er geen regel HTML meer wordt geprint! Dat doe je zo:
    • Kloon een bestaande HTML pagina die netjes is vormgegeven met tabellen
    • Bouw die om tot smarty sjabloon
    • Zorg voor een formulier een resultaat pagina.
Persoonlijke instellingen