Les 13

In deze les leert u hoe u de MySQL server configureert en hoe je via PHP gebruik kunt maken van de MySQL functies.

 PHP en MySQL, een onafscheidelijk duo.

Met de installatie van onze wampserver heb je reeds de MySQL database software ter beschikking. Om onze MySQL server te beheren, hebben we ook al een prachtig stukje software bij de hand, namelijk phpMyAdmin. PhpMyAdmin is een web gebaseerde toepassing. Via je browser kan je dus je MySQL database beheren. Aangezien je een webserver draait, is die database dan ook van overal ter wereld bereikbaar, voor jou, maar ook voor anderen. We gaan eens phpMyAdmin opstarten en ervoor zorgen dat die wel toegangkelijk wordt voor jou en niet voor anderen.

Klik nu op het wampserver icoontje en kies voor phpMyAdmin. Dit zorgt ervoor dat je webbrowser wordt opgestart en je krijgt de grafische interface van phpmyadmin te zien. Let nu eens speciaal op de rode tekst die je te zien krijgt :

Uw configuratie bestand bevat instellingen (root zonder wachtwoord) die betrekking hebben tot de standaard MySQL account. Uw MySQL server draait met deze standaard waardes, en is open voor ongewilde toegang, het wordt dus aangeraden dit op te lossen.

Mocht jouw phpmyadmin een andere taal spreken dan het Nederlands, geen paniek. Rechts zie je staan phpMyAdmin en daaronder Language. Selecteer daar gewoon Dutch en je phpMyAdmin gaat Nederlands praten.

Onder MySQL heb je een link staan rechten. Deze hebben we nu nodig. Klik op deze link. Je krijgt nu een nieuw venster en je ziet nu de gebruikers in het Gebruikers Overzicht die momenteel toegang hebben tot je MySQL database. Normaal na een nieuwe install, heb je daar de gebruiker Elke staan en root. Tevens zie je in het veld Wachtwoord dat er geen wachtwoord aanwezig is. In het veld Globale privileges zie je dat beide gebruikers die hebben. In het veld Host zie je daar dan staan voor beide gebruikers localhost. Dit is HEEL belangrijk ! Dit wil namelijk zeggen, dat voor het ogenblik niemand anders naar de MySQL server kan connecten dan iemand die daadwerkelijk op de computer werkt waar de MySQL server draait.

Hoe komt een connectie naar een MySQL server tot stand ? Dit gebeurt op een speciale manier. Om te connecten naar een MySQL server heb je een usernaam nodig, een hostnaam en een paswoord. Als je enkel een usernaam en paswoord opgeeft, vult MySQL automatisch de host in, 127.0.0.1 of ook wel de localhost genoemd. Als je nu naar een MySQL server wilt connecten op een andere computer, doet MySQL dat ook. Als je bijvoorbeeld naar een MySQL server wilt connecten op een site die www.ergens.be heet, zet je een mysql connectie op de commandline op als :

mysql -u gebruikersnaam -h www.ergens.be -p een_paswoord

Wat gebeurt er nu in de achtergond ? Wel MySQL past je gebruikersnaam aan vanop de computer waarvandaan je de connectie opstart. Doe je dat lokaal, en je usernaam is bijvoorbeeld Elke, zoals in onze phpmyadmin nu voor het moment, gaat mysql je usernaam aanpassen als Elke@127.0.0.1 of Elke@localhost. Als je connect naar een remote server, zal dit dan Elke@jouw-huidig-ip-adres worden. Dus iemand die voor het moment probeert te connecten naar jouw MySQL server, gaat de toegang geweigerd worden, omdat indien hij als Elke connect, zijn gebruikersnaam dan iets zal zijn als Elke@195.123.15.30. Ben je nu veilig ? Moet je nu al dan niet een paswoord op je server plaatsen ? Dat hangt nu terug van een paar factoren af.

Het addertje onder het gras is hier onze webserver. Van buitenaf kunnen ze niet rechtstreeks een verbinding maken naar je MySQL server die draait op poort 3306. Enkel en alleen kan je dit voor de moment vanaf de localhost. Nu, met onze wampserver komt ook een webserver, en die draait dan op zijn beurt op poort 80. Als je webserver operationeel is, en ze kunnen van buitenaf op je webserver terecht, is dat mooi meegenomen, en kan je fier je eigen website tonen aan de buitenwereld. Als ze eenmaal op je webserver zitten, en ze tikken na de url /phpmyadmin in, dan zitten ze in jouw MySQL server zonder probleem. Als er geen paswoord opstaat kunnen ze zowat alles doen wat ze willen. Als ze op je webserver zitten, maken ze dan geen connectie meer van buitenaf naar je MySQl server, maar doen ze dat vanop de host waar de webserver draait, en dan zijn we terug bij af, onze localhost.

Voor diegene onder jullie die geen schrik hebben van de opdrachtprompt, hier volgen een paar commando's om jullie duidelijk te maken hoe alles in zijn werk gaat. Open een opdrachtprompt (vindt je terug onder Bureauaccesoires) en geef de volgende commando's :

cd c:\ [enter]
cd wamp [enter]
cd mysql [enter]
cd bin [enter]

mysql -uElke mysql [enter]

Opgelet nu ! Je gaat nu zien dat de opdrachtprompt veranderd in mysql> i.p.v. c:\wamp\mysql\bin> We zitten nu in onze MySQL database. Tik nu gewoon het volgende commando :

quit [enter]

En je krijgt nu terug je c:\wamp\mysql\bin> prompt. We gaan nu eens een nieuw commando geven :

mysql -uElke -p1234 mysql [enter]

Na dit commando moet je iets zien als :



                                                  [ de fout in onze opdrachtprompt ]

Je ziet dus dat mysql inderdaad na je usernaam @localhost heeft geplaatst. Aangezien er geen paswoord opstaat, en we gebruiken er nu wel eentje om te connecten, zie je dat de toegang geweigerd wordt.

Je denkt nu bij jezelf, die uitleg is allemaal wel mooi, maar wat ben ik er in feite mee. Wel, het volgende, als we gebruikers gaan aanmaken, kan je in het veld host specifiek bepalen van waar een MySQL server connecties mag toelaten. Je kan natuurlijk ook toestaan dat ze om van het even waar een verbinding maken, of vanop een specifieke lokatie. Met jullie een beetje een inzicht te geven hoe een mysql connectie wordt opgebouwd, zul je ook rapper de fouten begrijpen als een connectie wordt geweigerd. Iemand die ook roet in het eten kan gooien om een mysql verbinding te weigeren, is een firewall. Houd daar ook rekening mee.

Het eerste dat we nu gaan doen, is die gebruiker Elke verwijderen. Plaats een vinkje links naast de gebruiker Elke, kies in het kader eronder voor Verwijder de gebruikers en vernieuw de privileges daarna. En klik dan op de knop start in hetzelfde kadertje.



                   [ Gebruiker Elke selecteren om te verwijderen ]

Nadat je dit hebt gedaan, zal het scherm vernieuwen en zal de gebruiker Elke verwijderd zijn.
Klik nu op de tab rechten
 
   

                              [ verschillende tab's met rechten geselecteerd ]

En je ziet dat de gebruiker effectief weg is.

Nu moeten we terug naar onze home van phpmyadmin om een paswoord te plaatsen op onze root account. Om terug te gaan naar onze phpmyadmin home, klik in het linkse venster om het huisje.

                          

[ door op het huisje te klikken verkrijgen we de phpmyadmin home pagina ]

Klik vervolgens dan terug op de link rechten van MySQL.


 

                         [ de link rechten selecteren ]


Dat brengt ons naar het volgende scherm, waar we nu bij de gebruiker root, helemaal rechts op het ventje met potlood klikken (wijzig rechten).


 

                            [ rechten wijzigen van de gebruiker root ]

Dit brengt ons in een nieuw venster, waar we hier het paswoord voor root kunnen aanmaken. Scroll wat naar beneden tot je het vakje ziet Wijzig wachtwoord en vink de optie aan wachtwoord. Vul dan in het invoerveld je wachtwoord in ( je ziet enkel sterretjes verschijnen ) en herhaal in het ivoerveldveld eronder het paswoord, waarna je op start klikt.


 

              [ het wachtwoord invoeren ]

Nadat je het paswoord hebt ingevoerd, gaat het scherm vernieuwen. Klik nu terug op de tab rechten, waarna je dit te zien gaat krijgen :

 


                      [ geen toegang meer na het invoeren van het wachtwoord ]

Voor het ogenblik kunnen we nu niet meer op onze mysql server. We gaan nu zorgen dat phpmyadmin ook terug werkt. Dubbelklik op Deze computer, en ga naar de map c:\wamp\www\phpmyadmin. Klik vervolgens rechts op de file config.inc.php en kies dan voor openen. Dan krijg je het volgende venster :

     

  [ een programma selecteren om het openen van de file config.inc.php ]

Kies dan voor "Het programma in een lijst selecteren" en klik dan op OK,  waarop je vervolgens een programma kunt kiezen :

  

                  [ wordpad kiezen als programma ]

Kies hier dan voor Wordpad MFC-toepassing en haal het vinkje weg bij "Dit type bestand altijd met dit programma openen". Als je later scripts gaat schrijven en een html- of php-editor gaat gebruiken, doe dan terug hetzelfde, klik dan op bladeren en zoek je favoriete editor op, en dan plaats je wel een vinkje bij "Dit type bestand ....". Als je dan dubbelklikt op een php file, gaat je favoriete editor worden gestart. Ik gebruik hier Wordpad en niet kladbok. Wampserver is hier wel voor Windows, maar het vindt zijn root in de unix wereld. Als je het bestand config.inc.php probeert te openen met kladbok, gaat alle tekst op één lijn staan, aangezien unix een ander regeleinde kent dan dos.

Als je de config.inc.php met wordpad hebt geopend, zoek dan naar het volgende lijntje :

$cfg['Servers'][$i]['auth_type']     = 'config';    // Authentication method (config, http or cookie based)?

En verander dit in :

$cfg['Servers'][$i]['auth_type']     = 'http';    // Authentication method (config, http or cookie based)?

En sla de file vervolgens op. Klik dan terug op het wampserver ikoontje en kies terug voor phpmyadmin. Dan krijg je een pop-up venster dat vraagt naar een gebruiker ( root ) en het paswoord dat je hebt aangemaakt.


 

                               [ pop-up voor gebruiker en paswoord ]

 

              [ inloggen met root account en bijhorend wachtwoord ]

Als je de gebruikersnaam en het paswoord hebt ingevuld, klik dan op OK en we krijgen dan dit resultaat :

 

                                [ succesvol ingelogd in phpmyadmin ]

Het pop-up venster kan verschillen in uiterlijk. Dit hangt af van de gebruikte browser. Dus na het correct ingeven van de gebruikersnaam en paswoord, zijn we terug in onze MySQL database via phpmyadmin.

We hebben nu een root gebruiker met alle privileges. Werken als root is uit den boze. Root is de machtigste gebruiker op je MySQL server. Root kan alles, en met alles bedoel ik ook alles. Die kan databases aanmaken, verwijderen, veranderen, gebruikers aanmaken, rechten toekennen aan gebruikers enz ....

Als je PHP gaat gebruiken te samen met MySQL, ga je in je scripts een gebruiker en een database opgeven om mee te werken. We zijn dus beter af met een gebruiker met bepaalde rechten op een database, dan met de root account. Mocht er iemand per toeval, of moedwillig aan je root account en paswoord geraken, is de schade die deze persoon aan je database kan toebrengen ongekend.
Ben je er zeker van dat niemand aan je root paswoord zal geraken ? Vergeet het maar, wij zijn mensen en fouten maakt iedereen. Iemand vraagt mij om een script aan te passen, dus moet ik op mijn computer die gegevens in mijn database stoppen, het script werkt, en je stuurt alles terug. Wat ik wel vergeten was, was om mijn gebruikersnaam en paswoord te verwijderen uit het script. Nu was dat geen enkel probleem, want het was slechts een gebruikersnaam met beperkte rechten op een database die ik had aangemaakt, waarna ik de desbetreffende database terug verwijderd had nadat het script werkte.

Dat is maar één van de vele mogelijkheden hoe iemand aan je paswoord kan geraken.


Geef steeds een gewone user rechten op een bepaalde database, en werk nooit met de account root, tenzij voor onderhouds werkzaamheden, of in de gevallen dat het niet anders kan.


Een gebruiker aanmaken met rechten op één bepaalde database.

Ik ga jullie hierbij aanleren hoe je een gebruiker aanmaakt, vervolgens de rechten van die gebruiker instelt, gekoppeld aan een database.

Gegevens die ik zal gebruiken :

         1. Naam database : brol
         2. In de database brol gaan we een tabel aanmaken meerbrol met 4 velden , brol1,brol2,brol3,brol4
         3. Gebruikersnaam : essetee
         4. Paswoord : abcd1234
         5. We gaan de gebruiker essetee alle rechten geven op de database brol.


Om te beginnen moeten we inloggen als root ( we kunnen niet anders voor de moment ) met phpmyadmin. We krijgen dan het scherm Welkom bij phpMyAdmin. In het vak MySQL zien we daar staan : Nieuwe database aanmaken. In het invoerveld tikken we brol en klikkken dan op aanmaken.

 

                 [ aanmaken van de database brol ]

Nadat we op aanmaken hebben geklikt, wordt het scherm vernieuwd en zien we nu de mededeling dat er geen tabellen gevonden zijn in de database, en krijgen we de kans om dit nu te doen. In het invoerveld naam tikken we in meerbrol, en voor het aantal velden, tikken we in 4 en vervolgens op start.

  

        [ aanmaken van de tabel meerbrol ]

Nadat we dit hebben gedaan, wordt het scherm opnieuw vernieuwd, en kunnen we nu de namen van onze velden ingeven. In de invoervelden van de kolom veld, voeren we onder elkaar in, brol1, brol2, brol3, brol4 en in het veld lengte/waardes vullen we telkens 20 in waarna we vervolgens klikken op opslaan.

 

                                                   [ onze velnamen invoeren ]

Zo, we hebben nu een database brol aangemaakt. We klikken nu terug in het linkse venster op het huisje, zodat we de homepagina terug te zien krijgen van onze phpmyadmin server, waarop we vervolgens terug klikken op de link rechten. Nadat het scherm vernieuwd werd, klikken we nu op de link Voeg een nieuwe gebruiker toe.

 

                    [ nieuwe gebruiker toevoegen ]

Na op de link geklikt te hebben, krijgen we een nieuw scherm. Vul de gebruikersnaam in (essetee), kies in het volgende vakje van waar essetee mag connecten (lokaal) voer het paswoord in ( 2 maal ) en je klikt vervolgens op start.

  


                            [ gebruiker, host en paswoord ingeven ]

Nadat je op start hebt geklikt, wordt het scherm opnieuw vernieuwd. Je ziet nu bovenaan staan Gebruiker essetee@localhost. Hier kan je nu het paswoord wijzigen, andere privileges toekennen, enz ... Wat we nu gaan doen, is essetee enkel toegang verlenen tot de database brol. Ga naar het vakje Database specifieke privileges en kies uit het pulldown menu de database brol.

  


                               [ de gebruiker rechten toekennen op onze database brol ]

Zodra je brol gekozen hebt, wordt het scherm vernieuwd, en klik nu vervolgens op de link Selecteer alles en klik vervolgens op de knop start.



      [ specifieke toegangsrechten specifiëren ]

Nadat we dit gedaan hebben heeft essetee nu enkel rechten op de database brol. Om dit te bewijzen, klik links terug op ons huisje, klik dan in het rechtse venster op de link uitloggen.In het pop-up venster dat nu verschijnt tik je niet meer in als gebruiker root, maar essetee en het paswoord abcd1234. Nadat je ingelogd bent, kijk dan eens helemaal in het linkse venster, en selecteer eens een database.
Je gaat nu merken dat je enkel keuze hebt uit brol en test.

     

  [ enkel brol en test beschrikbaar ]

Als je alles eens hebt uitgeprobeerd, kan je nu net op dezelfde manier dat we de user Elke hebben verwijderd, nu ook de gebruiker essetee verwijderen. Om de database brol echter te dumpen, ga je moeten inloggen met je root account, de database brol slecteren en dan klikken in het rechtse venster op verwijderen.

Je ziet dat het niet echt moeilijk is om een database aan te maken, gebruikers toevoegen of verwijderen, rechten toekennen, enz … met deze uitstekende tool. PhpMyAdmin heeft nog meer leuke dingen aan boord, die we langzamerhand gaan ontdekken.

We gaan nu een database aanmaken waarin we gegevens gaan stoppen van onze vrienden. Hun adres, eventueel telefoonummer, gsmnummer, e-mail adres ….

Welke gegevens moeten we nu invoeren ?

1. De naam van de database (adreslijst)
2. De naam van een tabel (adressen)
3. De naam van de velden (naam,voornaam,straat ….)

Het is van het grootste belang dat je op voorhand een schema opmaakt van wat je juist in je tabel wenst te plaatsen.

Via phpmyadmin is het een koud kunstje om velden toe te voegen aan je tabel. Je kan die velden om het even waar invoegen. Neem nu bijvoorbeeld dat je een veldnaam naam hebt en dadelijk erna straat. We zijn hier vergeten een veld met voornaam in te voeren.
Wanneer ga je dat merken dat je iets vergeten bent ? Over het algemeen als je al scripts aan het schrijven bent en je plots vaststelt dat je iets vergeten bent.
Via phpmyadmin is het dan heel eenvoudig om tussen het veld naam en straat een veldnaam voornaam in te voegen. Wel doe dit niet als je al aan het scripten bent, want je gaat al je scripts moeten gaan aanpassen omdat de volgorde van de veldnamen gewijzigd is.


Voeg een veldnaam steeds onderaan toe, zo voorkom je problemen.



Het aanmaken van een database.

We gaan eerst het gemakkelijkste doen, een database aanmaken met de naam adreslijst.
Open daarvoor de phpmyadmin pagina in het wampserver menu. Log in als user root.
Vervolgens vul je in bij Nieuwe database aanmaken : adreslijst en je klikt op de knop aanmaken. Je krijgt nu een nieuw scherm waar je een nieuwe tabel kan aanmaken met het aantal velden.  Je ziet daar nu ook echter staan : Database adreslijst is aangemaakt.


Er staat daar ook een belangrijke link : Creëer PHP code. Dit is een extra van phpmyadmin. Klik op de link en hij gaat de PHP-code tonen die je kan gebruiken in een script om een database aan te maken.


SQL-query:
$sql = 'CREATE DATABASE `adreslijst`';

Wens je dit commando niet te vergeten ? Wel we gaan ervoor zorgen dat onze crimson editor dit commando bijhoudt. Open de editor,nieuw document en klik op macros en vervolgens op Begin Recording.
Er gaat nu een venstertje open. Vul onderaan in het venstertje create_database in en druk op ok. In de nieuwe pagina tik je nu het commando :

$sql = 'CREATE DATABASE `adreslijst`';

Klik dan terug op macros en kies voor End Recording. Als je dit gedaan hebt, en je klikt nu terug op macros, ga je daar nu zien staan :  1. create_database Alt+1. Als je daar nu op klikt gaat onze editor de tekst $sql = 'CREATE DATABASE `adreslijst`'; in ons document plaatsen. Of je kunt met Alt+1 ook die tekst in je document krijgen.
We gaan veelvuldig dezelfde commando's gebruiken, het is dan eenvoudig om die terug op te roepen via een macro, dan steeds de code opnieuw te moeten intikken.

Aanmaken van een tabel in onze database.

Nu hebben we aan database adreslijst en we gaan nu een tabel aanmaken met de naam adressen. We moeten ook het aantal velden opgeven die we in de tabel willen. Met een schema stellen we dat zo op :

    1. Een veld dat uniek is voor elk record, we noemen dit veld id
    2. Vervolgens een veld naam
    3. een veld voornaam
    4. een veld straat
    5. een veld nummer
    6. een veld postcode
    7. een veld plaats
    8. een veld telefoon_thuis
    9. een veld telefoon_werk
    10. een veld gsm_1
    11. een veld gsm_2
    12. een veld email

We hebben hier dus 12 velden van doen. We vullen dus in adressen en voor het aantal velden 12 en we klikken op start. In het nieuw venster dat nu opent, gaan we de namen invoeren in de kolom Veld.

    1. id
    2. naam
    3. voornaam
    4. straat
    5. nummer
    6. postcode
    7. plaats
    8. telefoon_thuis
    9. telefoon_werk
    10. gsm_1
    11. gsm_2
    12. email

Je ziet hier nu dat ik geen hoofdletters gebruik. Naam staat leuker dan naam, maar naam tikt vlotter dan Naam. Gebruik kleine letters zoals ik, dan weet je steeds dat een veldnaam begint met een kleine letter. Je ziet ook dat ik een underscore gebruik om de spatie op te vullen in de veldnamen 8 tot en met 11. Dit is ook een goede gewoonte, want spaties in veldnamen zijn uit den boze. Geef verder je veldnamen een naam die ook iets te betekenen hebben. Ik kon die veldnamen ook eenvoudig a tot en met l genoemd hebben, alleen als je later gegevens uit je database zult halen, zul je zelf niet meer weten waarvoor die letters staan.

Het volgende wat we moeten doen, is een type definiëren van ons veld. We moeten dit doen voor elk veld afzonderlijk.

Wat betreft getallen beschikt MySQL over verschillende types. Default zijn dat SIGNED waarden. SIGNED waarden bevatten negatieve en positieve getallen.
Als we enkel positieve getallen wensen, kunnen we dit specifïeren door ze UNSIGNED te maken.
 

Type

SIGNED waarden

UNSIGNED waarden

TINYINT

-127 tot 128

0 tot 255

SMALLINT

-32 768 tot 32 767

0 tot 65 535

MEDIUMINT

-8 388 608 tot 8 388 607

0 tot 16 777 215

INT

-2 147 483 648 tot 2 147 483 647

0 tot 4 294 967 295

BIGINT

-9 223 372 036 854 775 808 tot 9 223 372 036 854 775 807

0 tot 18 446 744 073 709 551 615


Voor de teksttekens hebben we een type nodig dat karakters kan bevatten. MySQL beschikt over het type CHAR en VARCHAR.

* CHAR : neemt karakters aan met een vaste lengte. Dit wil zeggen, als de ingevoerde karakters niet de juiste lengte hebben, worden die aangevuld met spaties tot ze de juiste lengte hebben bereikt.

* VARCHAR : neemt karakters aan met een variabele lengte. De karakters worden niet aangevuld met spaties.
VARCHAR wordt het meest gebruikt, en die gaan wij dan ook gebruiken.

Zowel de CHAR als VARCHAR aanvaarden maximum 255 karakters. Als je nu gegevens gaat invoeren met meer dan 255 tekens, ga je fouten krijgen. Om teksten in te voeren ga je geen gebruik mogen maken van varchar of char. Daarvoor hebben we dan TINYTEXT , TEXT, MEDIUMTEXT en LONGTEXT.

* TINYTEXT :  kan tekens bevatten tot max 255 karakters
* TEXT : kan tekens bevatten tot 65535 karakters.
* MEDIUMTEXT : kan tekens bevatten tot 16777215 karakters
* LONGTEXT : kan tekens bevatten tot 4294967295 karakters

Hier voor onze adressen gaan we gebruik maken van de varchar, uitgezonderd voor het eerste veld, waarvoor we een SMALLINT gaan gebruiken dat we unsigned gaan maken, zodat we 65535 adressen gaan kunnen opnemen in onze database adressen, vooraleer we fouten gaan krijgen. Verder gaan we ervoor zorgen dat telkens we iemand toevoegen aan onze database, ons id veld met één zal worden verhoogd (auto_increment).

Kies nu voor het veld id, het type SMALLINT,  in de kolom Attributen kies je voor UNSIGNED, onder Extra kies je voor auto_increment en als laatste vink je het bolletje aan onder het bliksemtekenetje wat staat voor index.

Voor de rest van onze velden gaan we dan varchars gebruiken. Ook voor het huisnummer, postcode, telefoonnumers. Waarom VARCHAR en geen SMALLINT ? Wel om de eenvoudige reden dat niet alle landen bijvoorbeeld postnummers gebruiken die uitsluitend uit cijfers bestaan. Huisnummers kunnen bijvoorbeeld ook 121a zijn. Veel mensen schrijven hun internationale telfoonnnumers als +32555123. Dus gaan we VARCHARS gebruiken, alleen moeten we nog de lengte bepalen van de VARCHARS die we moeten invoeren voor elk veld in de kolom Lengte/Waardes* .
Neem een ruime marge voor je lengtes, beter teveel dan tekort. Daarom ken ik volgende waarden toe aan de velden :

* naam varchar 80
* voornaam varchar 80
* straat varchar 80
* nummer varchar 10
* postcode varchar 10
* plaats varchar 80
* telefoon_thuis varchar 20
* telefoon_werk varchar 20
* gsm_1 varchar 20
* gsm_2 varchar 20
* email varchar 80

Nadat je de waarden allemaal netjes hebt ingevuld, klik op opslaan. Onze database is nu klaar voor gebruik. En klik nu eens terug op Creëer PHP code om de code te zien van wat we allemaal juist hebben gedaan.

Met phpmyadmin kunnen we nu een backup maken van onze database. Klik daarvoor op de tab exporteer, plaats een vinkje bij DROP TABLE toevoegen en plaats een vinkje bij verzenden en klik vervolgens op de knop start. Er zal je nu gevraagd worden waar je de file moet opslaan. Maak eventueel een nieuwe map aan die je mysql-backup noemt, en sla de file op als adreslijst_begin.sql. We kunnen dan heel eenvoudig via phpmyadmin onze tabel terugplaatsen.

Klik nu links op de link adressen, en vervolgens in het rechtse venster op verwijderen. Er zal je nu gevraagd worden of je de tabel werkelijk wilt droppen. Antwoord ja. Nadien klik je op de tab SQL en je klikt op de knop bladeren bij Locatie van het tekstbestand. Je selecteert nu de zopas weggeschreven file, en je klikt op start. Je gaat nu links terug de link naar adressen zien verschijnen, en als je op de link klikt, zul je zien  dat onze database er terug staat.
Zo zie je hoe je makkelijk een backup kan nemen van je database en hoe je die kunt terug plaatsen. Van zodra we gegevens in onze database invoeren, is het beter om de backup file te saven als adreslijst-dd-mm-yyyy.sql. Zo zul je steeds backups hebben volgens datum van je database.

Voor we nu verder gaan, maak nu een gebruiker aan in phpmyadmin die alle rechten heeft op de database adreslijst. Ik zal als voorbeeld de gebruiker essetee nemen, met paswoord abcd1234. Vervang dit dus door jouw gebruikersnaam en paswoord.

We gaan nu via PHP en zijn MySQL functies gegevens invoeren in onze database. Je kan natuurlijk direct gegevens invoeren via phpmyadmin, door op de tab invoegen te klikken, maar dat is hier niet de bedoeling. We gaan hier leren hoe je dit doet via PHP scripts.
Ik maak nu in mijn documentroot van mijn server een nieuwe map mysql aan, waarin alle voorbeelden hierna in terecht zullen komen. Kwestie van alles wat bij elkaar te houden.

Met onze scripts gaan we gegevens invoeren, verwijderen, opvragen en aanpassen. We maken nu dus 4  pagina's aan met de respectievelijke namen :

* invoeren.php
* opvragen.php
* verwijderen.php
* aanpassen.php

Elke pagina voorzien we van volgende inhoud :

<?php
include("header.html");
include("footer.html");
?>

Zoals je kunt zien, gaan we hier 2 html pagina's includen, header.html en footer.html. Onze code van ons script zal dus voor elke pagina tussen deze 2 includes komen.

Hier dan de code van header.html :

<html>
<head>
<title>Beheren van onze database Adreslijst</title>
</head>
<body leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" background="images/background.gif">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="#d8cc08"><td><div align="center"><h1>Beheren van onze database Adreslijst</h1></div></td></tr>
</table>
<table width="100%" height="3" border="0" cellspacing="0" cellpadding="0">
<tr bgcolor="black"><td>&nbsp;</td></tr>
</table>
<br><br>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr valign="top">
<td width="125"><a href="invoeren.php">Gegevens invoeren</a><br><br>
<a href="opvragen.php">Gegevens opvragen</a><br><br>
<a href="verwijderen.php">Gegevens verwijderen</a><br><br>
<a href="aanpassen.php">Gegevens aanpassen</a><br><br>
</td>
<td>

En de code van onze footer.html :

</td>
</tr>
</table>
</body>
</html>

Dit is nu simpele html code voor de opmaak van onze pagina's. Niets speciaals. Het speciale komt er nu aan. Ons script om gegevens in onze database in te voeren. Daarvoor gebruiken wij onze invoeren.php.


Vooraleer we ook maar iets kunnen doen met onze mysql database, moeten we altijd eerst een connectie opzetten met onze database.



Een connectie opzetten naar onze database

Om een connectie op te zetten hebben we volgende gegevens nodig :

    Een gebruiker : essetee ($dbuser)
    Het paswoord van die gebruiker : abcd1234 ($dbpass)
    De host van de database : localhost ($dbhost)
    De naam van de database : adreslijst ($db)

De functie die daarvoor gebruik wordt heet : mysql_connect("$argument1","$argument2","argument3");
De uitvoer van dat commando wordt opgeslagen in een array, die wij de naam $mysql_id zullen geven. Argument1 is de database host, argument 2 is de database user en argument 3 is het database paswoord.

Het commando wordt dan :

$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");

Je kunt natuurlijk in plaats van die variabelen alles in klare taal plaatsen. Dat wordt dan :

$mysql_id=mysql_connect("localhost","essetee","abcd1234");

Het voordeel van de eerste werkwijze is dat we dit kunnen toepassen op elke database met om het even welke gebruiker. Het enige wat we moeten doen, is php vertellen waar hij die informatie kan vinden. Aangezien we dit gaan toepassen op onze database adreslijst, gaan we een file aanmaken db_adreslijst.php waarin we die gegevens plaatsen, om ze vervolgens te includen in onze pagina's die van toepassing zijn op de database adreslijst.

Inhoud van onze db_adreslijst.php

<?php
$dbhost="localhost";
$dbuser="essetee";
$dbpass="abcd1234";
$db="adreslijst";
?>

We openen nu onze invoeren.php en op regel 3 voeren we een nieuwe include in :

include("db_adreslijst.php");

En we voeren nu onze mysql_connectie in op regel 4 :

$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");

We slaan nu alles op en surfen naar de pagina invoeren.php. Normaal zie je nu enkel een blanco pagina, met links onze hyperlinks naar de pagina's die we gaan gebruiken. Heeft dat commando nu iets gedaan ? Inderdaad, de connectie naar onze database MySQL werd uitgevoerd. We kunnen dat controleren met een echo. Plaats op regel 5 :

echo "onze array mysql_id bevat nu de waarde $mysql_id<br>\n";

Als je nu de pagina vernieuwt, zul je iets te zien krijgen als :

onze array mysql_id bevat nu de waarde Resource id #4

Zoals je kunt merken bevat onze variabele $mysql_id de waarde Resource id #4. (kan bij jullie een andere waarde dan 4 zijn)

Als je nu in db_adreslijst.php het paswoord veranderd en je vernieuwt de pagina opnieuw, dan ga je een error krijgen in de aard van :

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'essetee'@'localhost' (using password: YES) in c:\wamp\www\invoeren.php on line 4

Wat we nu doen, is enkel een connectie opzetten naar de database MySQL en nog niet naar onze database adreslijst. Door dit commando uit te voeren wordt door MySQL gekeken als de gebruiker die inlogt met een gebruikersnaam en paswoord, iets te zoeken heeft in de database. Indien deze gebruiker niet voorkomt in de tabel met de rechten, of er wel in voorkomt maar met een ander paswoord, gaat MySQL direct de toegang weigeren.

Als hij de gebruiker wel vindt in de tabel en het paswoord is OK, dan laat MySQL je voor de moment met rust. Je bent een erkende gebruiker. Dat de gegevens OK zijn voor MySQL slaat hij op in onze variabele $mysql_id. Voor ons betekent Resource id #4 niet veel, maar wel voor MySQL. Van het ogenblik dat we onze database adreslijst willen manipuleren, gaan we MySQL moeten vertellen dat we dit gaan doen met de gegevens die hij in $mysql_id heeft opgeslagen. Als je dan probeert met die gegevens aan andere database te benaderen, gaat MySQL aan de hand van die Resource id #4 kijken of je dat wel mag.

Laten we nu eerst een formulier aanmaken waarbij we gegevens kunnen invoeren in onze invoeren.php. Het echo commando op regel 5 kan je nu rustig verwijderen. Onze code ziet er nu zo uit :

<?php
include("header.html");
include("db_adreslijst.php");
$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
?>
<form action="<?php echo $_SERVER[PHP_SELF];?>" method="post"
<table>
<tr><td>Naam :</td><td><input type="text" name="naam"></td></tr>
<tr><td>Vooraam :</td><td><input type="text" name="voornaam"></td></tr>
<tr><td>Straat :</td><td><input type="text" name="straat"></td></tr>
<tr><td>Nummer :</td><td><input type="text" name="nummer"></td></tr>
<tr><td>Postcode :</td><td><input type="text" name="postcode"></td></tr>
<tr><td>Plaats :</td><td><input type="text" name="plaats"></td></tr>
<tr><td>Telefoon thuis :</td><td><input type="text" name="telefoon_thuis"></td></tr>
<tr><td>Telefoon werk :</td><td><input type="text" name="telefoon_werk"></td></tr>
<tr><td>Gsm 1 :</td><td><input type="text" name="gsm_1"></td></tr>
<tr><td>Gsm 2 :</td><td><input type="text" name="gsm_2"></td></tr>
<tr><td>E-mail :</td><td><input type="text" name="email"></td></tr>
<tr><td>&nbsp;</td><td>&nbsp;</td></tr>
<tr><td><input type="submit" name="invoeren" value="Gegevens invoeren"></td></tr>
</table>
</form>
<?php
include("footer.html");
?>

Dit is nu terug niets speciaals. Let wel even op de <input> regels. Bij "name" gebruik ik de waarden van onze veldnamen in onze tabel. Dit moet niet zo, maar het is makkelijker werken. Op die manier weet je altijd wat je naar waar zult wegschrijven.

We zien hier verder ook dat we terug gebruik maken van de variabele $_SERVER['PHP_SELF'], dit wil zeggen dat we door middel van een isset gaan controleren of er iemand gegevens wilt invoeren, indien niet, worden de invoervelden getoond. We voegen nu na regel 4 een blanco regel in, en op regel 5 voeren we dan volgende code in :

5. if(isset($_POST[invoeren])) {
6.    $naam=$_POST[naam];
7.     $voornaam=$_POST[voornaam];
8.     $straat=$_POST[straat];
9.    $nummer=$_POST[nummer];
10.    $postcode=$_POST[postcode];
11.    $plaats=$_POST[plaats];
12.    $telefoon_thuis=$_POST[telefoon_thuis];
13.    $telefoon_werk=$_POST[telefoon_werk];
14.    $gsm_1=$_POST[gsm_1];
15.    $gsm_2=$_POST[gsm_2];
16.    $email=$_POST[email];
17. }
18. else {
19 ?>
en we maken onder regel 37  ( <?php) een blanco regel waarop we de sluitende accolade plaatsen van onze else lus.
37. <?php
38. }
39. include("footer.html");
40. ?>

Van regel 6 tot en met 16 doe ik niets anders dan de waarden recupereren uit ons formulier en ken ik de waarden van onze $_POST toe aan variabelen met dezelfde naam van onze velden in onze tabel.

Je kunt nu het formulier uittesten en op de submit knop klikken, er kan niets gebeuren. Aangezien we nog geen routine hebben opgenomen om de ingevulde gegevens weg te schrijven naar een database.

Gegevens invoeren in onze database

Het INSERT commando

Om gegevens in een tabel in te voeren hebben we het commando INSERT tot onze beschikking. Het commando INSERT gebruiken we als volgt :
INSERT into adressen VALUES ('1','2','3'…..). De waarden tussen de haakjes zijn onze veldnamen. In ons geval gaan we er dus 12 hebben ('id','naam','voornaam'…..).

Dit commando wil dus zeggen, voeg in onze tabel adressen de waarden (…..). Met deze schrijfwijze is niets mis. Alleen, herinner je nog wat ik schreef over ons veld id ? Dat veld gaat automatisch met één verhoogd worden, en mysql zal dit zelf doen. Met deze schrijfwijze moeten we voor elk veld een waarde invoeren, en in het geval van ons id veld, moeten wij daar zelf niets invullen, maar ze moet wel aanwezig zijn.

Als we nu de waarden van ons formulier willen invoeren zou dit commando er dan als volgt uitzien :

INSERT into adressen VALUES ('','$naam','$voornaam','$straat','$nummer','$postcode','$plaats','$telefoon_thuis','telefoon_werk','$gsm_1','$gsm_2','$email');

Mysql zal met dit commando de waarden invoegen in de velden 1 tot en met 12. Aangezien het eerste argument ledig is, zal mysql zelf het id nummer invullen. Als je nu per vergissing eerst $voornaam geeft en dan $naam, zal mysql die gevevens verkeerdelijk invoeren. Mysql is hier wel niet verkeerd, dat ben jij.  Het commando INSERT kan ook op een andere manier geschreven worden, de manier die ik verkies. Je kan INSERT zeggen in welke velden hij welke informatie moet wegschrijven. Dat doen we zo :

INSERT into adressen (naam,voornaam,straat,nummer,postcode,plaats,telefoon_thuis,telefoon_werk,gsm_2,email,gsm_1) VALUES ('$naam','$voornaam','$straat','$nummer','$postcode','$plaats','$telefoon_thuis','$telefoon_werk','$gsm_2','$email','$gsm_1');

Tussen de eerste haakjes vinden we de namen van onze velden terug. Zoals je kan zien heb ik ze wat door elkaar gehaald op het laatste. Het enige belangrijke is nu, dat de volgorde van de reeks tussen de tweede haakjes hetzelfde is van deze uit de eerste. Nu vertellen we INSERT dat hij in de veldnamen die tussen de eerste haakjes staan, de waarden moet invoeren die tussen de tweede haakjes staan. Je ziet hier ook dat ik nu het veld id niet meer gebruik. Zoals gezegd, mysql zal die zelf wel verhogen, ik moet daar niet naar om zien.

Voor het geval van onze invoer is het schrijven van de tweede methode omslachter. In dit geval kan de eerste schrijfwijze ons wat tikwerk besparen. Nu, we hebben niet alleen het insert commando, maar we kunnen ook verwijderen, aanpassen enz … Dan gaat de tweede schrijfwijze aan te raden zijn, omdat we dan maar een paar velden gaan aanpassen.

We hebben nu ons insert commando klaar voor gebruik. We gaan dit commando opslaan in een variabele dat we $sql gaan noemen.

$sql=" INSERT into adressen (naam,voornaam,straat,nummer,postcode,plaats,telefoon_thuis,telefoon_werk,gsm_2,email,gsm_1) VALUES ('$naam','$voornaam','$straat','$nummer','$postcode','$plaats','$telefoon_thuis','$telefoon_werk','$gsm_2','$email','$gsm_1')";

Een verzoek (query) doen op de database

Onze tabel heet nu adressen, maar onze database heet adreslijst. Als we nu dit commando willen uitvoeren, gaan we mysql moeten vertellen dat hij dit moet doen op de database adreslijst. We doen dus een verzoek, en het commando daarvoor is :
mysql_db_query.

Het mysql_db_query moet je aanroepen met 3 argumenten.

1. De database waarop je de query wilt doen ($db)
2. Het commando dat moet worden uitgevoer ($sql)
3. Onze gegevens uit onze mysql_cnnect ($mysql_id)

En alles komt ook in een array terecht. Onze query ziet er dan als volgt uit :

$res=mysql_db_query("$db","$sql",$mysql_id);

Let nu goed op de schrijfwijze van dit commando. $db en $sql worden geïnterpoleerd en staan dus tussen dubbele quotes. Onze $mysql_id moet niet meer geïnterpoleerd worden en staat bijgevolg niet tussen quotes.

Tijd nu om deze code in ons document invoeren.php in te voeren. We zorgen dat we nu een blanco regel hebben op  17 en we voeren de volgende code in :

17. $sql=" INSERT into adressen (naam,voornaam,straat,nummer,postcode,plaats,telefoon_thuis,telefoon_werk,gsm_2,email,gsm_1) VALUES ('$naam','$voornaam','$straat','$nummer','$postcode','$plaats','$telefoon_thuis','$telefoon_werk','$gsm_2','$email','$gsm_1')";
18. $res=mysql_db_query("$db","$sql",$mysql_id);

Regel 17 moet allemaal op 1 regel.

We surfen nu naar onze invoeren.php pagina en we voeren volgende gegevens in :

Naam : Terryn
Voornaam : Serge
Straat: Polenplein
Nummer : 20/34
Postcode : 8800
Plaats: Roeselare
Telefoon_thuis : 051/55.55.55
Telefoon_werk : 051/55.55.56
Gsm_1 : 0498/33.33.33
Gsm_2 : 0496/33.22.22
E-mail : serge@essetee.be

Als je nu op de knop Gegevens invoeren klikt, zullen de gegevens naar onze database geschreven worden. Zodra dit gebeurd is, ga je een blanco pagina zien. We gaan daar seffens iets aan doen, maar voor het ogenblik ga je eens naar phpmyadmin, je vraagt de database adreslijst aan en je klik op de link adressen en in het rechtste venster op de tab verkennen. Ja gaat nu zien dat de gegevens wel degelijk naar de database werden geschreven. Als je nu een vinkje plaatst en je klikt vervolgens op het potloodje ga je mooi zien dat elk veld netjes werd ingevuld.

Zoals gezegd, na de afhandeling krijg je gewoon een blanco pagina. We gaan nu na ons mysql_db_query een fout routine inlassen. Indien er een fout gebeurt, zal ons dan netjes verteld worden wat de fout is, en indien er geen fouten werden gemaakt, printen we de tekst af dat alle gegevens corect werden weggeschreven naar de database.
Om op fouten te controleren beschikt mysql op het commando mysql_errno. We gebruiken dat als volgt :

De functie mysql_errno()

$fout=mysql_errno($mysql_id);

if ($fout != 0) {
    $fout=mysql_error($mysql_id);
    echo '<font color="#FF2306">' . $fout . '</font>';
    mysql_close($mysql_id);
    echo '</body></html>';
    exit;
    }

Als er iets fouts gebeurt dan geeft mysql een nummercode weer van de error. Indien er geen errors gebeuren, dan geeft mysql het getal 0 weer. Het enige wat wij hier doen, is kijken of $fout niet gelijk is aan 0, en indien dit het geval is, printen we een fout bericht af en sluiten we netjes de mysql connectie en verlaten we met exit het script, zodat er geen rare dingen gebeuren op je database. We kunnen daar nu ook nog een else {} aan toevoegen die dan gewoon print dat de gegevens correct werden weggeschreven.

else {
    echo '<div align="center"><h3>De gegevens werden correct weggeschreven naar de database</h3></div>';
}

Die fout routine is hier een kandidaat voor onze macro's in onze editor.

We maken nu een nieuwe regel onder regel 18 en voegen de volledige code in :

19. $fout=mysql_errno($mysql_id);
20. if ($fout != 0) {
21.    $fout=mysql_error($mysql_id);
22.    echo '<font color="#FF2306">' . $fout . '</font>';
23.    mysql_close($mysql_id);
24.    echo '</body></html>';
25.    exit;
26.    }
27. else {
28.    echo '<div align="center"><h3>De gegevens werden correct weggeschreven naar de database</h3></div>';
29. }

En om alles eens uit te testen, voeg jezelf maar eens toe aan de database door middel van invoeren.php.
Als je nu de melding krijgt dat alles correct werd weggeschreven controleer dan nu terug de database met phpmyadmin en je moet nu 2 records hebben in je database. Je gaat ook zien dat mysql ons id veld terug met eentje heeft verhoogd. Als je nu terug op de link gegevens invoeren klikt in onze invoeren.php pagina, kan je opnieuw gegevens invoeren in de database.

Gegevens uit onze database selecteren

Het select commando

Nu dat we gegevens in onze database hebben, zijn we toe aan het volgende commando : SELECT, waarmee je gegevens kunt opvragen. SELECT kent veel verschillende opties. Als we nu bijvoorbeeld alles willen selecteren uit onze tabel adressen, gebruiken we voor alles de "*". Het commando daarvoor is :

SELECT * from adressen

We gaan nu eens de verschillende mogelijkheden van het SELECT commando nagaan. Zoals bij invoeren.php om gegevens in te voeren, moet je ook voor gegevens opvragen altijd eerst een connectie maken met de MySQL database.  We openen nu onze pagina opvragen.php en voegen op regel 3 opnieuw toe :

include("db_adreslijst.php");
$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
$sql="select * from adressen";

Om dit commando nu uit te voeren, maken we terug gebruik van ons mysql_db_query en onze fout routine (ditmaal zonder de else voor het ogenblik).

$res=mysql_db_query("$db","$sql",$mysql_id);
     $fout=mysql_errno($mysql_id);
     if ($fout != 0) {
    $fout=mysql_error($mysql_id);
        echo '<font color="#FF2306">' . $fout . '</font>';
        mysql_close($mysql_id);
        echo '</body></html>';
        exit;
        }

Onze opvragen.php ziet er nu als volgt uit :

1. <?php
2. include("header.html");
3. include("db_adreslijst.php");
4. $mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
5. $sql="select * from adressen";
6. $res=mysql_db_query("$db","$sql",$mysql_id);
7.    $fout=mysql_errno($mysql_id);
8.        if ($fout != 0) {
9.        $fout=mysql_error($mysql_id);
10.        echo '<font color="#FF2306">' . $fout . '</font>';
11.        mysql_close($mysql_id);
12.        echo '</body></html>';
13.        exit;
14.        }
15. include("footer.html");
16. ?>

Als je nu het script uitvoert, zul je alleen een blanco pagina te zien krijgen. Waarom ? Wel we schrijven nu niets weg naar de database, de uitvoer van ons commando zit nu in de array $res.

Het resultaat van een verzoek op een database wordt aanzien als een tabel en we moeten er de speciale functies van mysql voor gebruiken om die te bewerken.

Onze tabel adressen bevat nu enkele namen. (bij mij 2) maar het kunnen er bij jullie intussen wat meer zijn. Met de functie mysql_num_rows($res) kunnen we nagaan hoeveel er nu juist in onze tabel zitten. Maak een blanco regel op 15 en voeg volgend commando toe :

De functie mysql_num_rows()

$aantal_lijnen=mysql_num_rows($res);


En druk maar op enter, zodat je een nieuwe blanco regel eronder krijgt, want er volgt nog heel wat code.

En we voeren vervolgens in :

echo "aantal_lijnen = $aantal_lijnen<br>\n";

En als je nu onze pagina opvragen.php opvraagt, zal het aantal_lijnen getoond worden. Dit is het aantal personen die reeds in je tabel adressen staan.
Tijdens de installatie hebben we een aantal velden aangemaakt met de namen naam, voornaam, straat, enz … In totaal hadden we er 12. Aangezien we deze zopas hebben aangemaakt ligt het nog vers in het geheugen. Als je meerdere databases aangemaakt hebt, zul je niet meer weten hoeveel velden elke aangemaakte database heeft. Om dat te weten te komen heeft mysql natuurlijk ook een commando, namelijk : mysql_num_fields()

Onze $res bevat nu die informatie en die kunnen we dan zo opvragen :

De functie mysql_num_fields()

$aantal_velden=mysql_num_fields($res);


We voegen nu dat commando toe aan onze opvragen.php en dan ook nog eens een echo commando om de inhoud van variabele $aantal_velden te tonen :

echo "aantal_velden = $aantal_velden<br>\n";

Nu eens opnieuw onze opvragen.php laden in onze browser, en je gaat nu zien dat onze $aantal_lijnen 2 is en het aantal_velden 12. Onze variabele $res bevat dus heel wat info niet ? Wel, we gaan er nog wat meer uithalen. Nu dat we het aantal velden weten, bestaat de kans dat je nu niet meer weet hoe die velden heten. Wel geen probleem, mysql heeft ook daarin voorzien met het commando :  mysql_field_name($res,veldnummer).

De functie mysql_field_name()

Voor het ogenblik weten we dat ons eerste veld van ons de naam id gekregen heeft. Het is nu eenvoudig om die informatie op te vragen met mysql_field_name. Dit doen we zo :

$naam_veld=mysql_field_name($res,1);

En het echo commando :

echo "naam_veld = $naam_veld<br>\n";

Als we nu terug opvragen.php opvragen krijgen we als resultaat :

aantal_lijnen = 2
aantal_velden = 12
naam_veld = naam

En dat is niet wat we verwachtten ! De variabele naam_veld zou volgens ons nu de naam id moeten bevatten en niet naam, wat ons tweede veld is in onze tabel. Dit zijn foutjes die rap gemaakt zijn, en waarbij je niet bij stilstaat. Er is in dit boek al veel geschreven, jullie hebben al veel geleerd en het is begrijpelijk dat je niet alles kan onthouden. In het begin van het boek heb ik jullie er reeds attent op gemaakt dat een computer telt vanaf 0 en niet vanaf 1 zoals wij gewoon zijn.

Een computer begint te tellen van 0 en niet vanaf 1 zolals wij gewoon zijn.


Dus in dit geval om het veld id te zien te krijgen moesten we het volgende commando ingevoerd hebben : $naam_veld=mysql_field_name($res,0); Ik heb nu opzettelijk deze fout gemaakt om jullie er nogmaals attent op te maken. We doen nu een globaal select commando, en we hebben nu in onze variabele $res ook alle gegevens van onze tabel adressen. Als we later ons select commando gaan verfijnen, en slechts een paar gegevens uit onze database opvragen, zal dat tellen vanaf 0 opeens heel belangrijk zijn.

Met ons huidig commando vragen we 1 veld op. Aangezien we nu weten dat de variabela $aantal_velden de waarde 12 bevat, is het via een lus heel eenvoudig om alle velden te tonen in plaats van één enkel veld. Dit doen we dan zo :

for($i=0;$i<$aantal_velden;$i++){
    $naam_veld=mysql_field_name($res,$i);
    echo "Onze veldnaam nr. $i is gelijk aan $naam_veld<br>\n";
}

Als we deze code nu toevoegen aan onze opvragen.php en we voeren die vervolgens uit krijgen we dit als resultaat :

aantal_lijnen = 2
aantal_velden = 12
naam_veld = naam
Onze veldnaam nr. 0 is gelijk aan id
Onze veldnaam nr. 1 is gelijk aan naam
Onze veldnaam nr. 2 is gelijk aan voornaam
Onze veldnaam nr. 3 is gelijk aan straat
Onze veldnaam nr. 4 is gelijk aan nummer
Onze veldnaam nr. 5 is gelijk aan postcode
Onze veldnaam nr. 6 is gelijk aan plaats
Onze veldnaam nr. 7 is gelijk aan telefoon_thuis
Onze veldnaam nr. 8 is gelijk aan telefoon_werk
Onze veldnaam nr. 9 is gelijk aan gsm_1
Onze veldnaam nr. 10 is gelijk aan gsm_2
Onze veldnaam nr. 11 is gelijk aan email

En zo komen we netjes te weten hoe onze veldnamen heten. We gaan nu nog een stapje verder. Aangezien we nu weten hoe onze veldnamen heten, willen we dit alles mooi in een tabel hebben. Dit is nu enkel een kwestie van html opmaak. Om alles in een mooie tabel te krijgen voegen we volgende code toe :

echo '<br><br><table border=1 celpadding=2 width="100%">';
echo '<tr>';
for($i=0;$i<$aantal_velden;$i++) {
    printf("<th>%s</th>",mysql_field_name($res,$i));
    }
echo '</tr>';
echo '</table>';

Ik voeg nu steeds code toe aan het document opvragen.php. Zo kan je steeds alle stappen volgen die we nu uitvoeren. Als je nu opvragen.php bekijkt, ga je nu zien dat al onze veldnamen netjes in een tabel worden afgedrukt. Het zou nu natuurlijk ook leuk zijn dat we de gegevens uit onze database ook netjes worden afgedrukt in onze tabel, elk onder zijn eigen veldnaam. Ook deze gegevens zitten in onze variabele $res. Om nu de informatie uit elke rij te halen van onze tabel adressen beschikt mysql over het commando :
mysql_fetch_row($res)

De functie mysql_fetch_row()

De gegevens van dit commando zullen opnieuw in een array moeten opgenomen worden. De output van dit commando stoppen we in de variabele $row en ons commando wordt dan :

$row=mysql_fetch_row($res);

En met een simpele lus en een foreach kunnen we hier dan alle informatie uit onze $row halen :

for($i=0;$i<$aantal_lijnen;$i++) {
    $row=mysql_fetch_row($res);
        foreach($row as $col) {
        echo "$col";
        }
}

Hopelijk begrijpen jullie deze code. Onze tabel adressen bevat 2 rijen met gegevens. Dit kwamen we te weten door het commando $aantal_lijnen=mysql_num_rows($res); We gaan dus de lus in dit geval 2 maal moeten doorlopen. De eerste maal doen we een $row=mysql_fetch_row($res); en dat levert ons een array $row op waarin alle gegevens van de rij staan.

Met een foreach lus, halen we dan de nodige informatie uit onze $row array. Zolang er gegevens zitten in de array $row, sla de inhoud op in de variabele $col en print deze af. Als alle gegevens zijn afgeprint, verlaten we de foreach lus, en komen we terug in onze for-lus, die nu voor de tweede maal doorlopen wordt.

Het commando $row=mysql_fetch_row($res); gaat nu automatisch de tweede rij nemen om de gegevens ervan in te lezen, enz …

En we gaan nu via html code ervoor zorgen dat alles netjes in een tabel wordt gestoken. We combineren daarvoor ons vorig commando met het laatste tot één geheel :

echo "<br><br>";
echo '<table border=2 celpadding=2 width="100%">';
for($i=0;$i<$aantal_velden;$i++) {
    printf("<th>%s</th>",mysql_field_name($res,$i));
    }
for($i=0;$i<$aantal_lijnen;$i++) {
    $row=mysql_fetch_row($res);
    echo '<tr>';
    foreach($row as $col) {
        if(!$col) $col=" ";
        echo "<td>$col</td>";
    }
    echo "</tr>";
    }
echo "</table>";

Als je na het toevoegen van deze code de pagina opvragen.php opvraagt, ga je nu een foutmelding krijgen. Zoals ik al schreef hierboven, als je een mysql_fetch_row uitvoert, gaat mysql automatisch de rijen af. Aangezien we met de vorige commando's de rijen reeds hebben opgevraagd, heeft mysql nu geen rijen meer om op te halen, en daarom krijg je die error in je foreach lus, aangezien je $row geen gegevens meer bevat. Hoe moet je dat nu oplossen ? Wel, door de vorige commando's te verwijderen of deze in commentaar te plaatsen, of de verbinding met de mysql database te verbreken en een nieuwe connectie op te zetten. De eerste optie moet je niet overwegen, het is de tweede optie die we gaan gebruiken. Dit zijn fouten die soms opduiken en waarvan je niet dadelijk de oplossing ziet.

Bij het begin van opvragen.php heb ik daar geen aandacht aan besteed tot we hier aan die fout toekwamen. De correcte manier om een mysql database te benaderen is, een connectie maken, de gegevens die je wilt verwerken uitvoeren, en de connectie verbreken als alles klaar is. Als je opnieuw gegevens nodig hebt uit de database in dezelfde pagina, maak een nieuwe connectie.

De functie mysql_close()

Ons voorgaande commando gaan we dus als volgt aanpassen :

mysql_close($mysql_id);
$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
$sql="select * from adressen";
$res=mysql_db_query("$db","$sql",$mysql_id);
    $fout=mysql_errno($mysql_id);
        if ($fout != 0) {
        $fout=mysql_error($mysql_id);
        echo '<font color="#FF2306">' . $fout . '</font>';
        mysql_close($mysql_id);
        echo '</body></html>';
        exit;
        }
$aantal_lijnen=mysql_num_rows($res);
$aantal_velden=mysql_num_fields($res);
echo "<br><br>";
echo '<table border=2 celpadding=2 width="100%">';
for($i=0;$i<$aantal_velden;$i++) {
    printf("<th>%s</th>",mysql_field_name($res,$i));
    }
for($i=0;$i<$aantal_lijnen;$i++) {
    $row=mysql_fetch_row($res);
    echo '<tr>';
    foreach($row as $col) {
        if(!$col) $col=" ";
        echo "<td>$col</td>";
    }
    echo "</tr>";
    }
echo "</table>";

Op de eerste regel sluiten we de bestaande connectie met de database mysql, vervolgens openen we een nieuwe connectie. We doen een nieuwe query op onze database en we recuperen terug onze variabelen. Als je nu de pagina vernieuwd, gaat alles correct getoond worden. Misschien vinden jullie dit omslachtig, en was gewoon de code verwijderen voor jullie de snelste en gemakkelijkste manier, maar het is aan te raden om de methode van een nieuwe connectie te volgen.

We zijn bezig met php, we hebben nu reeds veelvuldig gebruik gemaakt van een prachtige funktie van php, namelijk include() of require(). Met deze funktie haal je code in je huidige formulier, die elders staat in een andere pagina. En zo kan het dan gebeuren dat je plots fouten gaat krijgen of onjuiste gegevens doordat je terug gegevens uit de database wilt halen, die misschien al ter beschikking werden gesteld aan de pagina waarin je de include toevoegt.

We hebben nu 1 mogelijkheid gezien van het select commando, feitelijk het gemakkelijkste, alles selecteren uit onze tabel adressen. Meestal zul je dit commando niet in deze vorm gebruiken. Als je gegevens opvraagt uit een database doe je dat met een specifieke reden. Je wilt weten wie er allemaal in Roeselare woont, je wilt iemands email adres enz …

Roeselare heeft de postcode 8800. Als ik nu iedereen wil selecteren die in Roeselare woont, kan ik dit zo doen :

select * from adressen where postcode='8800'

Op die wijze selecteren we terug alles maar hebben nu nader gespecifieerd wat we zoeken met de where opdracht. Dit commando gaat het veld postcode na, en slecteert elke rij waarvan de postcode 8800 is.

We tonen dit aan door middel van een voorbeeld :

echo '<br><br>';
mysql_close($mysql_id);
$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
$sql="select * from adressen where postcode='8800'";
$res=mysql_db_query("$db","$sql",$mysql_id);
    $fout=mysql_errno($mysql_id);
        if ($fout != 0) {
        $fout=mysql_error($mysql_id);
        echo '<font color="#FF2306">' . $fout . '</font>';
        mysql_close($mysql_id);
        echo '</body></html>';
        exit;
        }
$aantal_lijnen=mysql_num_rows($res);
for($i=0;$i<$aantal_lijnen;$i++) {
    $row=mysql_fetch_row($res);
    foreach($row as $col) {
        if(!$col) $col="&nbsp;";
        echo "$col";
    }
    echo '<br>';
}

Je voegt nu die code toe aan opvragen.php en als je nu de pagina opvraagt, mag je enkel de personen te zien krijgen die in je database de postcode 8800 hebben. Het resultaat is wel dat de ganse inhoud van de rij wordt getoond. Stel nu dat we enkel de naam en voornaam wensen te zien van de personen die in 8800 wonen. Het select commando voorziet natuurlijk ook in die behoefte. In plaats van een "*" te gebruiken, kunnen we mysql vertellen wat hij precies moet selecteren. Het is belangrijk voor de volgende commando's van select dat je weet hoe je velden noemen. Ik heb al aangetoond hoe je die kan opvragen, je kan natuurlijk ook eenvoudig gaan kijken naar de database adressen via phpmyadmin om de namen te weten te komen. Als we nu enkel de naam en voornaam wensten te weten van de personen die allemaal in Roeselare wonen, gaan we enkel die velden selecteren als volgt :

select naam,voornaam from adressen where postcode='8800'

Je ziet nu dat ik het "*" vervangen heb door de namen van de velden die ik wens te zien. We proberen dat nu eveneens uit met de volgende code :


mysql_close($mysql_id);
$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
$sql="select naam,voornaam from adressen where postcode='8800'";
$res=mysql_db_query("$db","$sql",$mysql_id);
    $fout=mysql_errno($mysql_id);
        if ($fout != 0) {
        $fout=mysql_error($mysql_id);
        echo '<font color="#FF2306">' . $fout . '</font>';
        mysql_close($mysql_id);
        echo '</body></html>';
        exit;
        }
$aantal_lijnen=mysql_num_rows($res);
for($i=0;$i<$aantal_lijnen;$i++) {
    $row=mysql_fetch_row($res);
    foreach($row as $col) {
        if(!$col) $col="&nbsp;";
        echo "$col" . "&nbsp;";
    }
    echo '<br>';
}

De code verschilt hier praktisch niets van ons vorig commando, alleen de variabele $sql is nu anders. Ook heb ik de regel echo "$col"; vervangen door echo "$col" . "&nbsp;"; dit om te voorkomen dat de namen tegen elkaar worden geplakt als je ze afprint.

Wat als je nu select voornaam,naam had gedaan ipv select naam,voornaam ? Wel heel eenvoudig, je gaat dan eerst de voornaam zien ipv de familienaam als je het script runt.

Ons script werkt nu wel goed, maar wat zou je ervan denken om de gegevens die hij toont, ze ook nog eens alfabetisch zou rangschikken ? Ook daar bestaat natuurlijk een oplossing voor, namelijk de optie order by van het commando select. Vanaf nu zal ik de ganse code niet meer in het boek afbeelden. In de crimson editor selecteer je de vorige code en je plakt die onderaan terug in het document. Het enige wat we nu steeds gaan veranderen is de variabele $sql. Om onze inwoners van Roeselare alphabetisch te sorteren op naam veranderen we het select commando als volgt :

$sql="select naam,voornaam from adressen where plaats='roeselare' order by naam";

Je ziet nu dat ik hier nu zoek op de plaats ipv de postcode. Als je de gegevens wenst te sorteren op de voornaam, verander je het order by lijntje door voornaam.

$sql="select naam,voornaam from adressen where plaats='roeselare' order by voornaam";

Door steeds de code na de vorige te plakken, zul je steeds zien wat er juist veranderd.

We gaan nu eens het select commando wat wijzigen, zodat we het id nummer krijgen van de personen die we zoeken.

$sql="select id,naam,voornaam from adressen where plaats='roeselare' order by id";

Na het commando te hebben aangepast, ga je nu voor de namen hun id nr zien uit de database. Ze staan netjes op een rij, beginnend met het id nr. 1. Ik denk dat je mij nu al voelt aankomen. Inderdaad, we gaan nu eens hetzelfde doen, maar ik wil dat ze omgekeerd gesorteerd worden. Dus het grootste id nr. bovenaan. Dit is eenvoudig te bereiken door achteraan het commando de opdracht DESC mee te geven. Het commando wordt dan :

$sql="select id,naam,voornaam from adressen where plaats='roeselare' order by id DESC";

Het opnieuw runnen van het script zal nu tonen dat ze inderdaad omgekeerd gesorteerd zijn. Je merkt ook dat ik hier roeselare schrijf met een kleine letter. Als ik het schrijf met een hoofdletter zoals het in de database opgenomen is, gaat het natuurlijk ook werken. Mysql doet dat graag auto voor jouw.

Om nu verder te gaan is het nodig om wat meer gegevens in onze database te hebben. Klik rechts op de file adressen.sql en sla deze op.. Importeer deze aan de hand van phpmyadmin. Blader wat terug in de cursus als je niet meer weet hoe je het juist moet doen. (je moet nu wel in de database adreslijst staan om de sql in te voeren)

Nu wens ik enkel de personen te zien, die een postnummer hebben dat tussen 2000 en 5000 ligt. Om dat voor elkaar te krijgen gaan we ons select commando nog wat uitbreiden. We kunnen nu een AND toevoegen aan ons commando.

$sql="select naam,voornaam,postcode from adressen where postcode >= '2000' and postcode <= '5000'";

Zoals je ziet, toont hij nu enkel 2 personen, iemand met postnummer 2000 en eentje met 4516.  

We gaan ons select commando nog wat uitbreiden. Ik heb nu de personen met een postnummer groter of gelijk aan 2000 of met een postnummer kleiner of gelijk aan 5000. Ik wens echter ook dat de personen met de naam "Terryn" ook worden afgeprint. Daarvoor hebben we dan de optie OR voor.

$sql="select naam,voornaam,postcode from adressen where postcode >= '2000' and postcode <= '5000' or naam='terryn'";

Na dit commando ga je nu 4 personen zien. Ik wens ze nu ook nog eens alphabetisch gerangshikt op naam.

$sql="select naam,voornaam,postcode from adressen where postcode >= '2000' and postcode <= '5000' or naam='terryn' order by naam";


En nu gaan we nog een stapje verder. Ze staan nu mooi gerangschikt op familienaam, maar ik zou ze ook graag gesorteerd zien op familienaam en voornaam. Dit bereiken we door het commando lichtjes te wijzigen in :

$sql="select naam,voornaam,postcode from adressen where postcode >= '2000' and postcode <= '5000' or naam='terryn' order by naam,voornaam";

Met het select commando kan je ook gegevens selecteren uit verschillende databases, maar deze materie is hier niet op zijn plaats voor beginnende php'ers.

We hebben nu genoeg gezien van het commando select, met deze kennis ga je al heel wat uit je database kunnen selecteren.

Gegevens verwijderen uit onze database

Het delete commando

We kunnen nu al gegevens invoeren en selecteren, het is dus nu de beurt om ze ook te verwijderen. Het commando om te verwijderen heet, DELETE. Wat had je anders verwacht ?


Het DELETE commando is onherroepelijk ! Er gaat niets naar een prullenbak. DELETE = WEG ! Zorg dus steeds voor een backup van je database.



Verwijderen van gegevens gaan we doen met onze verwijderen.php pagina. Ik zal kort zijn over dit onderwerp. Deleten is heel eenvoudig. We moeten enkel weten wat we moeten verwijderen, en we gaan nog eens een bevestiging vragen vooraleer we verwijderen.

Om iemand uit de database te verwijderen gaat dat heel eenvoudig met phpmyadmin. De bedoeling is hier echter dat we een pagina ontwerpen die de inhoud van onze database toont in tabelvorm, en via een link gaan we deze persoon kunnen verwijderen.

Om onze personen in een tabelvorm te tonen, gaan we nu ons script gebruiken uit ons opvragen.php. Breng volgende code in verwijderen.php :

1. <?php
2. include("header.html");
3. include("db_adreslijst.php");
4. $mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
5. $sql="select * from adressen";
6. $res=mysql_db_query("$db","$sql",$mysql_id);
7.    $fout=mysql_errno($mysql_id);
8.        if ($fout != 0) {
9.        $fout=mysql_error($mysql_id);
10.        echo '<font color="#FF2306">' . $fout . '</font>';
11.        mysql_close($mysql_id);
12.        echo '</body></html>';
13.        exit;
14.        }
15. $aantal_lijnen=mysql_num_rows($res);
16. $aantal_velden=mysql_num_fields($res);
17. echo "<br><br>";
18. echo '<table border=2 celpadding=2 width="100%">';
19. for($i=0;$i<$aantal_velden;$i++) {
20.    printf("<th>%s</th>",mysql_field_name($res,$i));
21.    }
22. for($i=0;$i<$aantal_lijnen;$i++) {
23.    $row=mysql_fetch_row($res);
24.    echo '<tr>';
25.    foreach($row as $col) {
26.        if(!$col) $col="&nbsp;";
27.        echo "<td>$col</td>";
28.    }
29.    echo "</tr>";
30.    }
31. echo "</table>";
32. echo '<br><br>';
33. mysql_close($mysql_id);

Als je nu deze code uitvoert, ga je gewoon alle personen zien in onze database in tabelvorm. Het enige wat we hier moeten toevoegen, is een extra table data met een link delete, en deze link moet dus wel verwijzen naar de juiste persoon. Iedere persoon in onze database heeft een uniek gegeven, namelijk zijn id nummer. Het is dan ook via dit id nummer dat we de gewenste persoon zullen verwijderen. Het toevoegen van de link gaat heel eenvoudig, verander regel 29 in :

echo '<td><a href="verwijderen.php">Delete</a></td></tr>';

Als je nu het script uitvoert, ga je zien dat de link delete aangemaakt is. Je mag er nu op klikken, er zal niets gebeuren. Het oog wilt ook wat. Onze tabel oogt niet mooi meer, want boven de table data staat een leeg veld. Dat lossen we op door een regel toe te voegen na regelnummer 21 met volgende inhoud :

echo "<th bgcolor=\"orange\">Delete</th>";

En we passen regel 21 ook als volgt aan :

printf("<th bgcolor=\"orange\">%s</th>",mysql_field_name($res,$i));

Een URL aanmaken met een waarde en opvragen via $_GET

Nu gaan onze veldnamen een oranje achtergrond kleur krijgen. Nu moeten we aan onze link nog het juiste id nummer koppelen. Dit doen we door een GET link te maken : verwijderen.php?wegid=$wegid

Maar vooraleer die link gaat werken, moeten we eerst ons id nr in de variabele $wegid krijgen.

Daarvoor moeten we niet veel moeite doen. Onder regel 26 (foreach($row as $col) {, plaatsen we een nieuw regeltje met volgende inhoud :

$wegid=$row[0];

Zoals reeds eerder gezegd, onze $row is een array die al de gegevens van onze rij bevat. Het eerste gegeven van deze rij is ons id nummer, en dat kunnen we dus gewoon opvragen uit de variabele $row[0].

Om de ons id nummer nu definitief aan onze delete link te binden, veranderen we nu regel 31 in :

echo "<td><a href=\"verwijderen.php?wegid=$wegid\">Delete</a></td></tr>";

Als je nu het script runt, en je gaat met je muis over een delete link in de tabel, ga je onderaan in je browser de link zien, en je zult inderdaad merken dat onze variabele $wegid effectief de waarde bezit van het id nummer van de persoon waarachter zijn naam deze delete link te zien is.

Klik nu eens op een dergelijke link en kijk dan eens naar je url balk van je browser. De URL zal er nu als volgt uitzien :

http://localhost/verwijderen.php?wegid=5

Dit is nu zo gezegd een GET link. We hebben nu altijd voor onze formulieren de methode POST gebruikt, dit is nu één van de gevallen waarbij men GET gebruikt. Met post zouden we de waarde recuperen door middel van $wegid=$_POST[wegid]. Wel, om de variabele met GET te recuperen gebruiken we : $wegid=$_GET[wegid]. Eenvoudig niet ? En nu ga je zien waarom het verstandig is om de mysql connectie te sluiten. We gaan nu een ferm stukje script neerpennen die we starten op regel 4.

Het eerste 2 lijntjes code die we nu invoeren zijn :

$wegid=$_GET[wegid];
echo "wegid is nu $wegid<br>";

Sla het script op, en voer het uit. Klik op een link en je zult zien dat de variabele $wegid telkens de waarde zal krijgen van het id veld van de aangeklikte link. Die echo is er enkel ter controle, die kun je nu gerust uitcommentariëren door er // voor te plaatsen of verwijder de regel.

Dat was het eenvoudigste stukje code. Nu komt het serieuze werk. We breiden onze code uit tot :

$wegdoen=$_GET[wegdoen];
if(isset($wegdoen)){
        $iduser=explode(",",$wegdoen);
        trim($iduser);
        $idweg="$iduser[1]";
        $mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
            $sql="delete from adressen where id=$idweg";
            $res=mysql_db_query("$db","$sql",$mysql_id);
            $fout=mysql_errno($mysql_id);
            if ($fout != 0) {
            $fout=mysql_error($mysql_id);
            echo '<font color="#FF2306">$fout</font>';
            mysql_close($mysql_id);
            echo '</body></html>';
            exit;
            }
            else {
            echo '<div align="center"><h3>De persoon werd uit de database verwijderd !</h3></div>';
            mysql_close($mysql_id);    
            exit;
            }            
}
if(isset($wegid)) {
        $mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
        $sql="select * from adressen where id=$wegid";
        $res=mysql_db_query("$db","$sql",$mysql_id);
        $row=mysql_fetch_row($res);
        echo "<h3>De volgende gebruiker zal verwijderd worden</h3>\n";
        foreach($row as $col) {
        echo "<b>$col</b><br>\n";
    }
mysql_close($mysql_id);
        echo "<br><h3><a href=verwijderen.php?wegdoen=ok,$wegid>Ja, verwijder deze gebruiker</a></h3><br>\n";
}
else {

En je ziet dat we stoppen met een else { . Dus gaan we nog ergens een sluitende accolade moeten plaatsen voor onze else lus. Die plaatsen we dan juist boven de include("footer.html"); regel helemaal onderaan het script.

Uit onze variabele $wegid weten we nu welke persoon we willen verwijderen uit de database. We gaan na met een isset of de variabele $wegid een waarde bevat, dit zal zo zijn als we in onze tabel op een delete link geklikt hebben. Indien $wegid leeg is, wordt onze tabel getoond met de gegevens uit onze database.

Indien $wegid niet ledig is, geven we te kennen dat we iets uit onze database willen verwijderen. Voor alle zekerheid tonen we nog eens wat we gaan verwijderen en maken we een nieuwe link aan waarop we moeten klikken om de persoon daadwerkelijk te verwijderen. De link maken we terug aan volgens het GET principe, alleen moeten we nu ook nog het id meegeven van de data die we willen verwijderen. Dit is de waarde van onze $wegid variabele. Ik maak dus een nieuwe variabele aan wegdoen die ik de waarde geef van ok tesamen met de waarde van het id dat we willen verwijderen :

<a href=verwijderen.php?wegdoen=ok,$wegid>

Dit zorgt ervoor dat er in de url balk van je browser verschijnt :

http://localhost/verwijderen.php?wegdoen=ok,2

Die waarde recupereren we dan met onze $_GET[wegdoen]; Met een isset controleren we of de variabele een waarde bevat, en indien ja, dan splitsen we de variabele in een nieuwe array $userid door middel van de functie explode. We laten een trim los op de array $userid, die ervoor zorgt dat voor elk element van de array de overbodige spaties worden verwijderd. We hebben dus maar 2 waarden in onze array, ok en de waarde van het id nummer. Dit verkrijgen we dus gewoon door de variabele $idweg de waarde toe te kennen van $iduser[1]. Dan komt ons delete commando :


$sql="delete from adressen where id=$idweg";

We bouwen terug een fout routine in, en als er geen fouten gebeuren, vertellen we dat de gegevens uit de database werden verwijderd.

Probeer het script maar uit, en telkens je terug op de link Gegevens verwijderen klikt, zal je zien dat je tabel met gegevens steeds kleiner zal worden.

Plaats gewoon de backup terug dan van je database als er niets meer te verwijderen valt.

Na invoegen, selecteren en verwijderen, rest ons nu nog het updaten van gegevens. Om een update te doen hebben we natuurlijk het commando UPDATE.

Gegevens uit onze database aanpassen

Het update commando


Je kan geen gegevens overschrijven in een database met het insert commando ! Om gegevens aan te passen heb je het update commando nodig, zoniet ga je fouten krijgen.



Het update commando gebruik je als volgt :

Update adressen set naam='$naam',voornaam='$voornaam' …..

In onze database kan je alles updaten met uitzondering van het id veld. Zoals gezegd, mysql houdt zelf dat id veld bij. Je kan dat natuurlijk altijd updaten, dat zal in eerste instantie geen problemen geven. Laten we nu eens aannemen dat je het id 1 update naar 10. Zolang je geen 10 personen in je database hebt zal er niets gebeuren, van zodra je de tiende toevoegt ga je een fout krijgen. Mysql houdt in de achtergond een teller bij voor dit veld. Aangezien dit een uniek gegeven is in onze database ( geen enkel id kan tweemaal voorkomen ) zal mysql je daarvan dadelijk melding maken als je probeert om een tweede id veld aan te maken met dezelfde waarde. Als jij een id veld update, wordt de teller van mysql niet geüpdate.

We gaan nu om gegevens te updaten, gebruik maken van code uit invoeren.php en verwijderen.php We gaan nu dezelde code gebruiken als verwijderen.php om onze tabel te tonen, we zullen echter nu een link aanmaken naar update ipv delete.

Dit wordt dan onze eerste code voor aanpassen.php :

<?php
include("header.html");
include("db_adreslijst.php");
$mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
$sql="select * from adressen";
$res=mysql_db_query("$db","$sql",$mysql_id);
    $fout=mysql_errno($mysql_id);
        if ($fout != 0) {
        $fout=mysql_error($mysql_id);
        echo '<font color="#FF2306">' . $fout . '</font>';
        mysql_close($mysql_id);
        echo '</body></html>';
        exit;
        }
$aantal_lijnen=mysql_num_rows($res);
$aantal_velden=mysql_num_fields($res);
echo "<br><br>";
echo '<table border=2 celpadding=2 width="100%">';
for($i=0;$i<$aantal_velden;$i++) {
    printf("<th bgcolor=\"orange\">%s</th>",mysql_field_name($res,$i));
    }
    echo "<th bgcolor=\"orange\">Update</th>";        #veranderd
for($i=0;$i<$aantal_lijnen;$i++) {
    $row=mysql_fetch_row($res);
    echo '<tr>';
    foreach($row as $col) {
        $upid=$row[0];                             #veranderd
        if(!$col) $col="&nbsp;";
        echo "<td>$col</td>";
    }
    echo "<td><a href=\"aanpassen.php?upid=$upid\">Update</a></td></tr>"; #veranderd
    }
echo "</table>";
echo '<br><br>';
mysql_close($mysql_id);
include("footer.html");
?>

Zoals je kunt zien heb ik slechts 3 regels veranderd ( deze waar op het einde #veranderd bijstaat) Je kan nu het script runnen en als je op een link klikt, ga je nu zien dat de url wordt :

http://localhost/verwijderen.php?upid=5

Je ziet nu dat we een GET variabele upid hebben die we gaan recupereren in ons script. Met de waarde van upid, gaan we dan een formulier aanroepen, hetzelfde als in invoeren.php, maar de invoervelden zullen nu de gegevens bevatten van deze uit onze database. Het enige wat we moeten doen, zijn de gegevens aanpassen en deze via een submit knop naar de database sturen.

Hier volgt dan de code :

<?php
include("header.html");
include("db_adreslijst.php");
$upid=$_GET[upid];
if(isset($upid)) {
    $mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
    $sql="select * from adressen where id=$upid";
    $res=mysql_db_query("$db","$sql",$mysql_id);
    $row=mysql_fetch_row($res);
    ?>
    <form action="<?php echo $_SERVER[PHP_SELF];?>" method="post"
    <table>
    <tr><td>Naam :</td><td><input type="text" name="naam" value="<?php echo $row[1];?>"></td></tr>
    <tr><td>Vooraam :</td><td><input type="text" name="voornaam" value="<?php echo $row[2];?>"></td></tr>
    <tr><td>Straat :</td><td><input type="text" name="straat" value="<?php echo $row[3];?>"></td></tr>
    <tr><td>Nummer :</td><td><input type="text" name="nummer" value="<?php echo $row[4];?>"></td></tr>
    <tr><td>Postcode :</td><td><input type="text" name="postcode" value="<?php echo $row[5];?>"></td></tr>
    <tr><td>Plaats :</td><td><input type="text" name="plaats" value="<?php echo $row[6];?>"></td></tr>
    <tr><td>Telefoon thuis :</td><td><input type="text" name="telefoon_thuis" value="<?php echo $row[7];?>"></td></tr>
    <tr><td>Telefoon werk :</td><td><input type="text" name="telefoon_werk" value="<?php echo $row[8];?>"></td></tr>
    <tr><td>Gsm 1 :</td><td><input type="text" name="gsm_1" value="<?php echo $row[9];?>"></td></tr>
    <tr><td>Gsm 2 :</td><td><input type="text" name="gsm_2" value="<?php echo $row[10];?>"></td></tr>
    <tr><td>E-mail :</td><td><input type="text" name="email" value="<?php echo $row[11];?>"></td></tr>
<tr><td><input type="hidden" name="upid" value="<?php echo $upid;?>"></td></tr>
    <tr><td>&nbsp;</td><td>&nbsp;</td></tr>
    <tr><td><input type="submit" name="updaten" value="Gegevens updaten"></td></tr>
    </table>
    </form>
<?php
mysql_close($mysql_id);
}
else {

<input type="hidden">

Je ziet nu dat we terug eindigen met een else {. De sluitende accolade plaatsen we terug net boven include("footer.html");
Let nu ook op de regel :

<tr><td><input type="hidden" name="upid" value="<?php echo $upid;?>"></td></tr>

We hebben hier dus een input type van het type hidden. Dit wil zeggen dat je deze niet te zien krijgt, maar deze zorgt ervoor dat we de waarde van $upid meesturen met onze post.

Run nu maar het script. Als je op een link klikt om up te daten, ga je nu terug hetzelfde scherm te zien krijgen als bij invoeren.php, alleen zullen de invoervelden nu de inhoud hebben van de gegevens teruggevonden in de database. Je kan nu gewoon in die invoervelden de gegevens gaan veranderen, of gegevens toevoegen in de blanke velden. Als je dan op de knop Gegevens updaten drukt, zal er niets gebeuren omdat we daarvoor nu nog de code niet hebben. In de code zien we dat onze submit knop de naam updaten bevat. Aangezien we hier nu met een formulier werken, gebruiken we terug de methode post. We moeten dus eerst controleren of de submit knop werd gebruikt, en indien wel, dan schrijven we de gegevens weg naar de database.

De code doe we daarvoor gebruiken plaatsen we net onder : include("db_adreslijst.php");

if(isset($_POST[updaten])) {
        $naam=$_POST[naam];
        $voornaam=$_POST[voornaam];
        $straat=$_POST[straat];
        $nummer=$_POST[nummer];
        $postcode=$_POST[postcode];
        $plaats=$_POST[plaats];
        $telefoon_thuis=$_POST[telefoon_thuis];
        $telefoon_werk=$_POST[telefoon_werk];
        $gsm_1=$_POST[gsm_1];
        $gsm_2=$_POST[gsm_2];
        $email=$_POST[email];
        $upid=$_POST[upid];
        $mysql_id=mysql_connect("$dbhost","$dbuser","$dbpass");
        $sql="update adressen set naam='$naam',voornaam='$voornaam',straat='$straat',nummer='$nummer',postcode='$postcode',plaats='$plaats',telefoon_thuis='$telefoon_thuis',telefoon_werk='$telefoon_werk',gsm_1='$gsm_1',gsm_2='$gsm_2',email='$email' where id='$upid'" ;
        $res=mysql_db_query("$db","$sql",$mysql_id);
            $fout=mysql_errno($mysql_id);
            if ($fout != 0) {
            $fout=mysql_error($mysql_id);
            echo '<font color="#FF2306">$fout</font>';
            mysql_close($mysql_id);
            echo '</body></html>';
            exit;
            }
            else {
                echo '<div align="center"><h3>De gegevens werden in de database aangepast</h3><br></div>';
                mysql_close($mysql_id);
                exit;
            }    
}

Als we op onze submitknop hebben geklikt, zal onze variabele updaten niet meer leeg zijn, en zullen we dan de code van de isset uitvoeren. Hier niets speciaals, we recupereren gewoon de data uit ons formulier en plaatsen die in een variabele.
We maken terug een mysql connectie en het enige wat belangrijk is hier, is ons update commando :

$sql="update adressen set naam='$naam',voornaam='$voornaam',straat='$straat',nummer='$nummer',postcode='$postcode',plaats='$plaats',telefoon_thuis='$telefoon_thuis',telefoon_werk='$telefoon_werk',gsm_1='$gsm_1',gsm_2='$gsm_2',email='$email' where id='$upid'" ;


Om het even bij welk commando je een SQL opdracht uitvoert, het commando moet steeds op één regel staan .



Deze code moet wel allemaal op één regel staan. De volgorde speelt hier eigenlijk geen rol voor het set commando. Je specifieert het veld dat moet worden aangepast en je geeft de waarde ervan op.

Dit is hier enkel het topje van de ijsberg wat betreft MySQL. Eenmaal je de basisprincipes wat in je handen hebt, gaat het makkelijker gaan om moeilijkere opdrachten te gaan uitvoeren op de MySQL database.

En aktie !

Je kan nu het script runnen en uittesten.

Tot zover deze cursus over PHP en MYSQL.



Les 1 Les 2 Les 3 Les 4 Les 5 Les 6 Les 7 Les 8 Les 9 Les 10 Les 11 Les 12 Les 13 Home