PHP / MySQL HOWTO
Auteur: Hans Wolters, hans@linux.gelrevision.nl
v1.03, 6 maart 2000
Deze howto geeft uitleg over de installatie en het gebruik van PHP4,
samen met MySQL.
1. Over deze FAQ
1.1. Historie.
Deze FAQ is ontstaan naar aanleiding van de vele vragen die regelmatig
in de nieuwsgroep nl.internet.ontwerp worden gesteld. Zodra de FAQ van
Kristian Koehntopp Kristian Koehntopp ook aan de Open Publication
License voldoet zal er een samenwerking volgen waarbij vooral moet
worden gedacht aan het uitwisselen van tips, nieuwtjes, etc.
1.2. Copyright.
Deze FAQ valt sinds 22 maart 2000 onder de Open Publication License.
Je kan hem bekijken op de volgende url:
http://www.opencontent.org/openpub/
1.3. Kan je helpen met deze FAQ?
Ja natuurlijk, graag zelfs. Op dit moment heb ik de FAQ nog niet op
een CVS account staan maar zodra dat het geval zal zijn zal dat hier
worden vermeld.
1.4. Waar kan je de nieuwste versie vinden van deze FAQ?
De nieuwste versie zal binnenkort zijn te vinden op 2 sites in
Nederland, te weten:
· Gelre Linux Support Site
· NL.Linux.org
1.5. Bronnen.
PHP:
· http://www.php.net.
· http://www.zend.org.
MySQL:
· http://www.mysql.org.
2. PHP. Wat is het, wat kan het?
2.1. Wat is PHP.
PHP is een server side script taal dat op allerlei manieren kan worden
ingezet. Het is voor de gemiddelde persoon vrij snel op te pikken.
Mensen die al enige/veel programmeer/scripting ervaring hebben zullen
zeer snel in staat zijn om een webapplicatie er mee te maken. PHP is
ook als CGI parser in te zetten.
2.2. Waar kan je PHP voor gebruiken.
PHP is voor vele doeleinden geschikt. Het beste komt het tot zijn
recht als je het inzet voor dynamische websites. Hierbij kan je denken
aan:
· Gastenboeken.
· Forums.
· Frontends voor zoekmachines.
· Webshops.
Eigenlijk is dit maar een kleine greep van wat er mogelijk is. De
grote kracht van PHP is eigenlijk het feit dat je support kan
meecompileren voor een groot aantal database(servers).
2.3. Waar kan je hulp krijgen?
Het is de bedoeling dat deze FAQ zal uitgroeien tot een document
waarin je veel antwoorden zal kunnen terugvinden. Naast deze FAQ zijn
er een aantal plekken op het internet waar je informatie kan terug
vinden.
2.3.1. WWW
Engelstalige websites.
· http://www.php.net
· http://www.zend.org
· http://www.phpbuilder.com/
· http://www.weberdev.com
· http://www.phpwizard.net
· http://www.devshed.com/Server_Side/PHP/
· http://px.sklar.com
2.3.2. Online handleidingen PHP.
· http://www.zend.org/manual/
· http://www.php.net/manual/
2.3.3. Downloaden offline handleidingen PHP.
· http://www.php.net/docs.php3
2.3.4. Usenet.
Naast de hierboven genoemde websites kan je ook terecht op usenet. Op
usenet is er op dit ogenblik maar 1 nieuwsgroep waar je terecht kan
met je vragen. Het is de Duitstalige nieuwsgroep
news://de.comp.lang.php/. De mensen beantwoorden niet alleen
Duitstalige vragen.
Naast die Duitstalige nieuwsgroep kan je met je vragen ook terecht bij
de Nederlandstalige nieuwsgroep news://nl.internet.ontwerp.
2.3.5. Irc.
Er is een Engelstalig php kanaal op irc (#php) maar daar is een ban op
alle mensen gezet die uit Nederland komen. Zelf is het me niet gelukt
om met de operaters in contact te treden en te vragen wat er aan de
hand is.
3. De installatie van PHP
3.1. Voorwoord.
Bij het samenstellen van de FAQ ben ik uitgegaan van PHP4.0 (Beta4).
Dit aangezien de verwachting is dat PHP4 binnenkort overal in gebruik
zal worden genomen.
3.2. Downloaden.
Op dit moment staat PHP4 nog niet op een mirror in Nederland. Je kan
de nieuwste versie downloaden vanaf.
http://www.php.net/version4/downloads.php
3.3. Installatie.
Voor het installeren van PHP4.0 ben ik uitgegaan van de volgende
configuratie.
· Apache 1.3.9
· mysql Ver 9.33 Distrib 3.23.1-alpha, for pc-linux-gnu (i686)
Deze configuratie heb ik op een Red Hat 6.0 distributie draaien maar
dit mag op zich niets uitmaken. Mocht je MySQL en Apache via een
package system zoals rpm hebben geïnstalleerd zorg er dan voor dat je
ook de development packages laat installeren.
3.3.1. Uitpakken van de source code.
Zorg dat je een directory hebt waar je php kan compileren en pak de
source uit op de volgende manier en ga naar de directory die is
aangemaakt:
______________________________________________________________________
$tar -zxf php*.tar.gz
$cd php-4.0b4pl1
______________________________________________________________________
Controleer of apxs op je machine aanwezig is. Dit kan met locate
danwel whereis. Deze locatie heb je nodig om als parameter mee te
geven aan het configure script.
Aan configure script kan je een heleboel opties mee geven. Deze opties
kan je bekijken door het volgende in te typen:
______________________________________________________________________
$ ./configure --help | less
______________________________________________________________________
Om PHP te installeren met de opties die wij nodig hebben (MySQL) heb
je in ieder geval de volgende opties nodig:
______________________________________________________________________
$ ./configure --with-apxs=/path/apxs --with-mysql --enable-track-vars
--enable-trans-id
______________________________________________________________________
Als het script klaar is is het tijd om de module te maken:
______________________________________________________________________
$ make
______________________________________________________________________
Hierna moet je als root de module installeren:
______________________________________________________________________
$ su
(Geef je wachtwoord op)
# make install
______________________________________________________________________
Het script heeft als het goed is alle opties in de configuratie
bestanden van Apache aangepast en de php.ini op de juiste plek gezet.
Maak een bestandje aan waarin je de volgende code zet:
______________________________________________________________________
______________________________________________________________________
Plaats dit bestand in de root van de apache server en roep het op via
de browser. Let op dat PHP4.0 de bestanden ziet met een extensie .php.
Als alles goed is gegaan dan zie je een informatie scherm waarin alle
opties van PHP zichtbaar worden.
3.4. Install helpers.
Op http://prometheus.zerodivide.net/apache_kit/about/ kan je een
Apache Compile Kit downloaden die het zware werk voor je doet. Op dit
moment heb ik er nog geen ervaring mee opgedaan. Volgens de website
werkt het i.i.g. met Apache 1.3.12 en PHP3/4 (t/m Beta3).
Tip van Alfred Munnikes.
4. PHP en MySQL.
4.1. Wat is MySQL.
MySQL is een Client/Server SQL database server. Het is voornamelijk
gericht op snelheid. Veel mensen maken de vergissing dat je alleen
kleine databases kan gebruiken met MySQL. Dit is echter afhankelijk
van andere factoren (mogelijkheden voor transakties, e.d.).
Zelf heb ik tot volle tevredenheid gewerkt met aanzienlijke databases
(600.000 records).
4.2. Waar kan ik meer leren over SQL.
· http://www.mysql.org/Manual_chapter/manual_Tutorial.html#Tutorial
· http://www.self-evident.com/sql/index.htm
4.3. Hoe benader je een MySQL database vanuit PHP.
Voor het benaderen van een MySQL server zijn er twee mogelijkheden. Je
kan een default server opgeven in je php.ini en je kan het
rechtstreeks vanuit de code regelen. Die eerste optie heeft als groot
nadeel dat mensen die php scripts op dezelfde server kunnen draaien
zeer snel het wachtwoord uit de configuratie kunnen ophalen.
Om contact te leggen naar een MySQL server heb je de volgende drie
gegevens nodig:
· De hostnaam.
· De gebruikersnaam.
· Het wachtwoord.
De functie om de connectie op te bouwen is mysql-connect:
______________________________________________________________________
mysql_connect("servernaam","user","wachtwoord");
______________________________________________________________________
Als er een connectie naar de database server tot stand is gebracht
moet je de database selecteren die je wilt gebruiken. Daarvoor gebruik
je de mysql-select-db functie. Ook controleer je of het is gelukt om
die database te selecteren:
______________________________________________________________________
mysql_select_db("databasenaam") or die ("Verdorie, kan de database
niet openen");
______________________________________________________________________
4.4. Hoe zie je welke tabellen er op een MySQL server staan?.
Afhankelijk van de rechten die de gebruiker heeft kan hij/zij toegang
hebben tot meerdere tabellen. Deze tabellen zijn op te vragen met de
mysql-list-tables functie:
______________________________________________________________________
";
$i++;
}
?>
______________________________________________________________________
4.5. Hoe kijk je welke velden er in een tabel staan?
Elke MySQL tabel zal verschillende velden bevatten. Om deze velden op
te halen pas je de de volgende code toe:
______________________________________________________________________
/*
Connectie opzetten.
*/
mysql_connect( "server", "inlognaam", "wachtwoord");
/*
Geef de database en de tabelnaam op bij de functie mysql-list-fields
*/
$fields = mysql_listfields( "database", "tabel");
/*
Kijk hoeveel velden er totaal zijn en zet de teller $i op 0.
*/
$field_num = mysql_num_fields($fields);
$i=0;
/*
Toon het totaal aantal velden ($field_num) in de browser.
*/
echo $field_num . " veld(en) gevonden
\n";
/*
Zet een html tabel op en toon de veldtypes, veldnamen en
de veldlengte van die velden in een loop.
*/
echo "
| ";
echo
"Naam | VeldType | Lengte | Vlag |
";
while ($i < $field_num){
$type = mysql_field_type ($fields, $i);
$name = mysql_field_name ($fields, $i);
$len = mysql_field_len ($fields, $i);
$flags = mysql_field_flags ($fields, $i);
echo "| ";
echo $name. " | ".$type.
" | ".$len. " | ".$flags.
" |
";
$i++;
}
echo "
";
______________________________________________________________________
4.6. Hoe maak je backslashes onzichtbaar in data?
Als je via een html form gegevens laat invoeren in de database kan het
gebeuren dat mensen gebruik maken van (o.a.) single en double quotes.
Als je geen gebruik maakt van de functie stripslashes() bij het
uitlezen van die data krijg je voor iedere quote een \' te zien in
plaats van het normale quote teken.
4.7. Kan je binaire data opslaan in MySQL?
Het is mogelijk om (b.v.) plaatjes op te slaan in MySQL. Of het slim
is is een andere vraag. Veel beter is het om de plaatjes een logische
benaming te geven (product_id) en een kleine functie in je code te
zetten die kijkt of een bepaald plaatje in een bepaalde directory
aanwezig is. Dit heeft als voordeel dat je zelfs de url naar die
plaatjes niet in de database hoeft op te slaan.
Om te kijken of het plaatje aanwezig is maak je gebruik van de
file_exists() functie:
______________________________________________________________________
;
}
?>
______________________________________________________________________
4.8. Hoe kan je X records per pagina tonen?
Hiervoor moet je de limit functie gebruiken. Voorbeeld:
______________________________________________________________________
______________________________________________________________________
Als laatste zou je dan nog een volgende/vorige pagina functie kunnen
bouwen door naar het totaal aantal records te kunnen kijken in
samenhang met de $start en $view.
4.9. Kant en klare oplossingen voor PHP (en MySQL).
Er zijn op het internet diverse kant en klare oplossingen te vinden.
Men hoeft alleen de configuratie aan te passen en de scripts te
installeren.
4.9.1. Database onderhoud.
· http://modems.rosenet.net/FaceMySQL/
· http://www.htmlwizard.net/phpMyAdmin/
4.9.2. Zoeken.
· http://mysearch.udm.net/
4.9.3. Forum.
· http://fumanchi.tabu.uni-bonn.de/forum/
· http://www.neoqst.com/public/neoboard/neoboard.html
· http://www.phunkbros.dk/products.html
· http://www.phorum.org/
· http://w-agora.araxe.fr/
4.9.4. Gastenboek.
· http://mygb.php-homepage.de/
4.9.5. E-Commerce oplossingen.
· http://www.fishcart.org/
· http://www.w3-concept.net/
· http://modems.rosenet.net/MyCart/
· http://www.phpauction.org/
· http://phpshop.sourceforge.net/
5. Sessions in PHP.
5.1. Wat is een session.
Sessions maken het mogelijk om variabelen te gebruiken binnen een hele
website. Op het moment dat een bezoeker een site bezoekt kan je een
sessie id opvragen. Zo'n id is een uniek nummer. Het unieke nr komt te
vervallen op het moment dat de bezoeker de browser zal afsluiten. Je
kan met sessions werken via een cookie of via de session_id in de
url. De onderstaande voorbeelden gaan uit van een cookie.
5.2. Session variabelen meegeven en opvragen.
Om variabelen mee te geven in een session moet je eerst de variabele
de gewenste waarde geven. Daarna moet je die sessie nog een keer
registreren:
______________________________________________________________________
______________________________________________________________________
PHP maakt aan de hand van de bovenstaande code een bestandje aan in de
/tmp directory met als bestandsnaam het session_id. In het bestand
worden alle variabelen opgeslagen. Hierna kan je in elke willekeurige
php pagina (zolang die session nog intact is) de waarde $log opvragen:
______________________________________________________________________
______________________________________________________________________
6. Strings in PHP.
6.1. String weergeven in PHP.
6.1.1. Echo
Echo is geen functie maar een commando, je gebruikt het om strings
waarmee je geen aparte bewerkingen hoeft uit te voeren op het scherm
te zetten:
______________________________________________________________________
______________________________________________________________________
6.1.2. Print
Met print heb je iets meer mogelijkheden dan met echo. Zo kan je
bijvoorbeeld op meerdere regels printen zonder gebruik te maken van
en/of "\n".
6.1.3. Printf
Printf geeft je de mogelijkheid om een formatted output te genereren.
6.2. String samenvoegen (concat).
Voor het samenvoegen van string gebruik je een . (eventueel in
combinatie met een = teken):
______________________________________________________________________
______________________________________________________________________
6.3. Gedeelte van een string vervangen.
Je kan heel snel een gedeelte van een string vervangen. Je gebruikt
daarvoor de ereg_replace() functie voor:
______________________________________________________________________
______________________________________________________________________
7. PHP code opnemen in je bestanden.
7.1. Hoe kan ik PHP opnemen in mijn html bestanden.
Afhankelijk van de http server waarop PHP staat zijn er diverse
manieren om php code op te nemen in je bestanden. In de meeste
gevallen zullen de bestanden een aparte extensie hebben. Dit kan
afhankelijk van de PHP versie variëren in o.a. phtml, php3 en php.
De code kan op elke willekeurige plek in een bestand worden opgenomen.
Dit doe je d.m.v. openings en sluit tags:
______________________________________________________________________
______________________________________________________________________
Het is gebruikelijk om commentaar regels op te nemen in de C
programmeer style. Normaal gesproken neem je geen code op in een
document als het onzinnig is om het door php te laten parsen. Dit doe
je dan gewoon in html.
7.2. Bestanden includen.
Het is mogelijk om bestanden te includen. Dit is vooral handig als je
code schrijft die je in meerdere bestanden wilt aanroepen. Op die
manier kan je de code overzichtelijk houden. Je kan hiervoor het
include of het require commando gebruiken. Het grote verschil tussen
deze twee commando's zit hem hierin dat het include commando waarden
kan teruggeven. Om een bestand te includen ga je als volgt te werk:
______________________________________________________________________
______________________________________________________________________
Je kan in de php.ini een default plek aangeven voor bestanden die je
wilt includen zodat je alleen de bestandsnaam hoeft aan te roepen. Je
kan ze natuurlijk ook op een logische plek op de webserver neerzetten.
Zorg in dat laatste geval wel dat je de bestanden een extensie geeft
die wordt geparsed door de PHP interpreter zodat mensen niet de inhoud
van die bestanden kunnen lezen. Ook is het verstandig om een disallow
op te nemen voor zo'n directory in je robots.txt zodat de bestanden
niet worden geïndexeerd door zoekmachines.
8. PHP error's en bugs.
8.1. Ik krijg de melding "Call to unsupported or undefined function:
mysql_connect()".
Als je gebruik maakt van de standaard packages voor het installeren
van PHP dan zit daar vaak geen support voor MySQL bij in. Je zult de
source zelf moeten compileren.
8.2. Mail functie werkt niet onder PHP4.
Er zit een vervelende bug in de PHP4 (beta4) configuratie. In de
php.ini kan je het path aangeven naar sendmail. Standaard is die regel
leeg in de eerdere versies. Als je het leeg laat in de php.ini kan PHP
het path niet vinden. De oplossing is heel eenvoudig. Zet een ; voor
de regel, PHP gebruikt dan de default instellingen.
9. MySQL.
9.1. SQL.
Om gegevens te bewerken, verwijderen en op te vragen uit MySQL maak je
gebruik van SQL, oftwel Structured Query Language. Dit is een taal die
in veel database(servers) voor handen is. De SQL die gebruikt wordt
zal verschillen per databaseserver.
9.2. Gegevens selecteren en opvragen in MySQL.
Om gegevens op te vragen in MySQL maak je gebruik van het SELECT
statement. In combinatie met een paar eventuele voorwaardes kan je
precies de gegevens opvragen die je nodig hebt. We gaan nu even uit
van een database met twee tabellen. Samen vormen ze een database
waarin links en omschrijvingen van programma's staan. De database naam
is internet en de tabelnamen zijn link_soort en links:
______________________________________________________________________
$mysql -u guest -p internet
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19 to server version: 3.23.1-alpha
Type 'help' for help.
mysql>
______________________________________________________________________
We kunnen nu eerst eens gaan bekijken welke velden er in de tabellen
staan:
______________________________________________________________________
mysql> show fields from links;
+------------+--------------+------+-----+---------+----------------+----------------------+
| Field | Type | Null | Key | Default | Extra | Privileges |
+------------+--------------+------+-----+---------+----------------+----------------------+
| id | int(11) | | PRI | NULL | auto_increment | select,insert,update |
| url | varchar(255) | | MUL | | | select,insert,update |
| url_naam | varchar(255) | YES | | NULL | | select,insert,update |
| license | varchar(60) | YES | | NULL | | select,insert,update |
| discript | tinyblob | YES | | NULL | | select,insert,update |
| link_soort | int(11) | | | 0 | | select,insert,update |
+------------+--------------+------+-----+---------+----------------+----------------------+
mysql> show fields from link_soort;
+-------+-------------+------+-----+---------+----------------+----------------------+
| Field | Type | Null | Key | Default | Extra | Privileges |
+-------+-------------+------+-----+---------+----------------+----------------------+
| id | int(11) | | PRI | NULL | auto_increment | select,insert,update |
| naam | varchar(50) | YES | | NULL | | select,insert,update |
+-------+-------------+------+-----+---------+----------------+----------------------+
______________________________________________________________________
Op die manier krijg je een overzicht van de velden, rechten en
veldtypes die er in de database staan. Om nu alle velden uit de
link_soort tabel te selecteren gebruik je de volgende code:
______________________________________________________________________
mysql> select * from link_soort;
+----+---------------------------+
| id | naam |
+----+---------------------------+
| 33 | security_sites |
| 31 | w-managers |
| 32 | wm-tools |
.................
______________________________________________________________________
Je ziet dat er een hele rij gegevens te voorschijn komen die bestaan
uit een id en een naam. Als je nu alleen wilt weten hoeveel records er
in die tabel staan dan kan je dat opvragen met COUNT:
______________________________________________________________________
mysql> select count(id) from link_soort;
+-----------+
| count(id) |
+-----------+
| 51 |
+-----------+
______________________________________________________________________
Als je nu gegevens wilt toevoegen aan deze tabel dan kan je dat met
het INSERT commando doen. Bij het opvragen van de tabel gegevens heb
je kunnen zien dat het veld id een veld is dat de eigenschap
auto_increment heeft. Je hoeft in dat geval dus geen eigenlijke
waarde mee te geven voor dat veld als je een nieuw record wilt
invoeren. Je gebruikt in dat geval de null waarde. MySQL zal zelf
bekijken welk nummer er zal worden gebruikt voor het id:
______________________________________________________________________
mysql> insert into link_soort values (null, 'test');
Query OK, 1 row affected (0.13 sec)
______________________________________________________________________
Om het record te verwijderen kan je DELETE gebruiken. In dit voorbeeld
zou het niet kunnen aangezien de gebruiker geen rechten heeft om
records te verwijderen maar de syntax die iemand met voldoende rechten
moet gebruiken is de volgende:
______________________________________________________________________
mysql> DELETE FROM link_soort WHERE naam = 'test';
Query OK, 1 row affected (0.02 sec)
______________________________________________________________________
9.3. De site bezoeker toegang geven tot een database.
Om site bezoekers gegevens uit een database te kunnen laten opvragen
moet je bepaalde rechten toekennen. Dit is het snelste te realiseren
in de mysql monitor. We gebruiken hiervoor het GRANT statement:
______________________________________________________________________
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 3.23.1-alpha
Type 'help' for help.
mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
______________________________________________________________________
Je kan ook gelijk vanaf de prompt de database selecteren die je wilt
gebruiken, je doet dit vanaf de prompt door mysql aan te roepen met
als argument de database die je wilt gebruiken:
______________________________________________________________________
$mysql mysql
______________________________________________________________________
Je kan de gebruiker verschillende rechten toekennen. De meest
voorkomende rechten zijn SELECT, INSERT en UPDATE. Dit doe je op de
volgende manier:
______________________________________________________________________
GRANT SELECT, INSERT ON gb.gb TO guest@localhost IDENTIFIED BY 'hallo';
______________________________________________________________________
We hebben de gebruiker guest nu rechten gegeven om records toe te
voegen en te selecteren in de gb database waarbij hij alleen rechten
heeft in de tabel gb. Dit alles kan alleen op de machine waarop MySQL
staat. Het wachtwoord voor die gebruiker is hallo.
Mocht je de gebruiker nu ook UPDATE rechten willen geven en hij moet
alles vanaf een andere machine kunnen doen dan gebruik je het
volgende:
______________________________________________________________________
GRANT SELECT, INSERT, UPDATE ON gb.gb TO guest@domeinnaam IDENTIFIED BY 'hallo';
______________________________________________________________________
Mocht de database gb uit diverse tabellen bestaan waarop de gebruiker
allemaal moet kunnen lezen, schrijven en aanpassen dan gebruik je de
volgende syntax:
______________________________________________________________________
GRANT SELECT, INSERT, UPDATE ON gb.* TO guest@domeinnaam IDENTIFIED BY 'hallo';
______________________________________________________________________