File: PHP-MySQL-NL.sgml

package info (click to toggle)
doc-linux-nl 20051127-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 16,408 kB
  • ctags: 94
  • sloc: xml: 47,403; makefile: 312; perl: 193; sh: 116; ansic: 12; csh: 9
file content (1025 lines) | stat: -rw-r--r-- 30,519 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
<!doctype linuxdoc system>
<linuxdoc>
<article>
<titlepag>
<title>PHP / MySQL HOWTO</title>
<author><name>Auteur: Hans Wolters, hans@linux.gelrevision.nl</name></author>
<date>v1.03, 6 maart 2000</date>

<abstract>
Deze howto geeft uitleg over de installatie en het gebruik van PHP4, 
samen met MySQL.
</abstract>
</titlepag>

<!-- ####################################################### -->

<sect><heading>Over deze FAQ</heading>

<sect1><heading>Historie.</heading>
<p>

Deze FAQ is ontstaan naar aanleiding van de vele vragen die 
regelmatig in de nieuwsgroep <htmlurl url="news://nl.internet.ontwerp" 
name="nl.internet.ontwerp"> worden gesteld. Zodra de FAQ van 
Kristian Koehntopp <htmlurl url="http://www.koehntopp.de/php/faq-single.html"
name="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.</p>
</sect1>

<sect1><heading>Copyright.</heading>
<p>
Deze FAQ valt sinds 22 maart 2000 onder de Open Publication License. 
Je kan hem bekijken op de volgende url:
<htmlurl url="http://www.opencontent.org/openpub/" name="http://www.opencontent.org/openpub/"></p>
</sect1> 

<sect1><heading>Kan je helpen met deze FAQ?</heading>
<p>

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.</p>
</sect1>

<sect1><heading>Waar kan je de nieuwste versie vinden van deze FAQ?</heading>
<p>

De nieuwste versie zal binnenkort zijn te vinden op 2 sites in 
Nederland, te weten:

<itemize>

<item><htmlurl name="Gelre Linux Support Site" 
url="http://linux.gelrevision.nl"></item>
<item><htmlurl name="NL.Linux.org" url="http://nl.linux.org"></item>

</itemize>
</p>
</sect1>

<sect1><heading>Bronnen.</heading>
<p>

PHP:

<itemize>
<item><htmlurl url="http://www.php.net/" name="http://www.php.net">.</item>
<item><htmlurl url="http://www.zend.org/" name="http://www.zend.org">.</item>
</itemize>
</p>

<p>MySQL:
<itemize>
<item><htmlurl url="http://www.mysql.org/" 
name="http://www.mysql.org">.</item>
</itemize>

<!-- ####################################################### -->
</p>
</sect1>
</sect>

<sect><heading>PHP. Wat is het, wat kan het?</heading>

<sect1><heading>Wat is PHP.</heading>
<p>

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.</p>
</sect1>


<sect1><heading>Waar kan je PHP voor gebruiken.</heading>
<p>
PHP is voor vele doeleinden geschikt. Het beste komt het tot zijn recht
als je het inzet voor <em/dynamische/ websites. Hierbij kan je denken 
aan:

<itemize>
<item> Gastenboeken.</item>
<item> Forums.</item>
<item> Frontends voor zoekmachines.</item>
<item> Webshops.</item>
</itemize>
</p>

<p>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).</p>
</sect1>

<sect1><heading>Waar kan je hulp krijgen?</heading>
<p>
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.</p>

<sect2><heading>WWW</heading>
<p>

Engelstalige websites.

<itemize>
<item> <htmlurl url="http://www.php.net/" name="http://www.php.net"></item>
<item> <htmlurl url="http://www.zend.org/" name="http://www.zend.org"></item>
<item> <htmlurl url="http://www.phpbuilder.com/" 
                name="http://www.phpbuilder.com/"></item>
<item> <htmlurl url="http://www.weberdev.com/" 
                name="http://www.weberdev.com"></item>
<item> <htmlurl url="http://www.phpwizard.net/" 
                name="http://www.phpwizard.net"></item>
<item> <htmlurl url="http://www.devshed.com/Server_Side/PHP/" 
                name="http://www.devshed.com/Server_Side/PHP/"></item>
<item> <htmlurl url="http://px.sklar.com/" name="http://px.sklar.com"></item>
</itemize>
</p>
</sect2>

<sect2><heading>Online handleidingen PHP.</heading>
<p>
<itemize>
<item> <htmlurl url="http://www.zend.org/manual/" name="http://www.zend.org/manual/"></item>
<item> <htmlurl url="http://www.php.net/manual/" name="http://www.php.net/manual/"></item>
</itemize>
</p>
</sect2>

<sect2><heading>Downloaden offline handleidingen PHP.</heading>
<p>
<itemize>
<item> <htmlurl url="http://www.php.net/docs.php3" name="http://www.php.net/docs.php3"></item>
</itemize></p>
</sect2>

<sect2><heading>Usenet.</heading>
<p>
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 
<htmlurl url="news://de.comp.lang.php/" 
name="news://de.comp.lang.php/">.
De mensen beantwoorden niet alleen Duitstalige vragen.</p>

<p>Naast die Duitstalige nieuwsgroep kan je met je vragen ook terecht bij 
de Nederlandstalige nieuwsgroep
<htmlurl url="news://nl.internet.ontwerp/" 
name="news://nl.internet.ontwerp">.</p>
</sect2>

<sect2><heading>Irc.</heading>
<p>
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.


<!-- ####################################################### -->
</p>
</sect2>
</sect1>
</sect>


<sect><heading>De installatie van PHP</heading>

<sect1><heading>Voorwoord.</heading>
<p>

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.</p>
</sect1>

<sect1><heading>Downloaden.</heading>
<p>
Op dit moment staat PHP4 nog niet op een mirror in Nederland. Je kan 
de nieuwste versie downloaden vanaf.

<htmlurl name="http://www.php.net/version4/downloads.php" 
url="http://www.php.net/version4/downloads.php">
</p>
</sect1>

<sect1><heading>Installatie.</heading>
<p>
Voor het installeren van PHP4.0 ben ik uitgegaan van de volgende 
configuratie.

<itemize>
<item>Apache 1.3.9</item>
<item>mysql  Ver 9.33 Distrib 3.23.1-alpha, for pc-linux-gnu (i686)</item>
</itemize>
</p>

<p>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&iuml;nstalleerd zorg er dan voor dat je ook de
development packages laat installeren.</p>

<sect2><heading>Uitpakken van de source code.</heading>
<p>
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:

<tscreen><code>
$tar -zxf php*.tar.gz
$cd php-4.0b4pl1
</code></tscreen>
</p>

<p>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.</p>

<p>Aan configure script kan je een heleboel opties mee geven. Deze opties 
kan je bekijken door het volgende in te typen:

<tscreen><code>
$ ./configure --help | less
</code></tscreen>
</p>

<p>Om PHP te installeren met de opties die wij nodig hebben (MySQL) heb je
in ieder geval de volgende opties nodig:

<tscreen><code>
$ ./configure --with-apxs=/path/apxs --with-mysql --enable-track-vars 
--enable-trans-id
</code></tscreen>
</p>

<p>Als het script klaar is is het tijd om de module te maken:

<tscreen><code>
$ make
</code></tscreen>
</p>

<p>Hierna moet je als root de module installeren:

<tscreen><code>
$ su
(Geef je wachtwoord op)
# make install
</code></tscreen>
</p>

<p>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:

<tscreen><code>
<?phpinfo()?>
</code></tscreen>
</p>

<p>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 
<em/.php/. Als alles goed is gegaan dan zie je een informatie scherm 
waarin alle opties van PHP zichtbaar worden.</p>
</sect2>
</sect1>

<sect1><heading>Install helpers.</heading>
<p>

Op 
<htmlurl url="http://prometheus.zerodivide.net/apache_kit/about/"  
name="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).</p>

<p>Tip van Alfred Munnikes.

<!-- ####################################################### -->
</p>
</sect1>
</sect>

<sect><heading>PHP en MySQL.</heading>

<sect1><heading>Wat is MySQL.</heading>
<p>
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.). </p>

<p>Zelf heb ik tot volle tevredenheid gewerkt met aanzienlijke databases 
(600.000 records). </p>
</sect1>

<sect1><heading>Waar kan ik meer leren over SQL.</heading>
<p>
<itemize>
<item> 
<htmlurl url="http://www.mysql.org/Manual_chapter/manual_Tutorial.html#Tutorial"name="http://www.mysql.org/Manual_chapter/manual_Tutorial.html#Tutorial">
</item>

<item> <htmlurl url="http://www.self-evident.com/sql/index.htm"  
                name="http://www.self-evident.com/sql/index.htm">
</item>
</itemize>
</p>
</sect1>

<sect1><heading>Hoe benader je een MySQL database vanuit PHP.</heading>
<p>
Voor het benaderen van een MySQL server zijn er twee mogelijkheden. Je
kan een default server opgeven in je <em/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.</p>

<p>Om contact te leggen naar een MySQL server heb je de volgende drie 
gegevens nodig:

<itemize>
<item> De hostnaam.</item>
<item> De gebruikersnaam.</item>
<item> Het wachtwoord.</item>
</itemize>
</p>

<p>De functie om de connectie op te bouwen is
<htmlurl url="http://www.php.net/manual/function.mysql-connect.php3" 
name="mysql-connect">:

<tscreen><code>
mysql_connect("servernaam","user","wachtwoord");
</code></tscreen>
</p>

<p>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 <htmlurl url="http://www.php.net/manual/function.mysql-select-db.php3" 
name="mysql-select-db"> functie. Ook controleer je of het is gelukt om 
die database te selecteren:

<tscreen><code>
mysql_select_db("databasenaam") or die ("Verdorie, kan de database 
niet openen");
</code></tscreen>
</p>
</sect1>

<sect1><heading>Hoe zie je welke tabellen er op een MySQL server staan?.</heading>
<p>
Afhankelijk van de rechten die de gebruiker heeft kan hij/zij toegang 
hebben tot meerdere tabellen. Deze tabellen zijn op te vragen met de 
<htmlurl url="http://www.php.net/manual/function.mysql-list-tables.php3" 
name="mysql-list-tables"> functie:

<tscreen><code>
&lt;?php

/*
Connectie naar de database
*/
mysql_connect( "server", "inlognaam", "wachtwoord");

/*
Uit welke database wil je de tabellen ophalen.
*/
$tabellen = mysql_list_tables( "database");

/*
Tellertje en loop om de tabellen te tonen.
*/
$i=0;
while ($i < mysql_num_rows($tabellen)){
    $t_name[$i] = mysql_tablename ($tabellen, $i);
    echo $t_name[$i]. "<br>";
    $i++;
}    
?&gt;
</code></tscreen>
</p>
</sect1>

<sect1><heading>Hoe kijk je welke velden er in een tabel staan?</heading>
<p>

Elke MySQL tabel zal verschillende velden bevatten. Om deze velden op 
te halen pas je de de volgende code toe:

<tscreen><code>
/*
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&lt;br&gt;\n";

/*
Zet een html tabel op en toon de veldtypes, veldnamen en
de veldlengte van die velden in een loop.
*/
echo  "&lt;table width=\"90%\" border=1&gt;&lt;tr&gt;&lt;td&gt;";
echo 
"Naam&lt;/td&gt;&lt;td&gt;VeldType&lt;/td&gt;&lt;td&gt;Lengte&lt;/td&gt;&lt;td&gt;Vlag&lt;/td&gt;&lt;/tr&gt;";
while ($i &lt; $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  "&lt;tr&gt;&lt;td&gt;";
    echo $name. "&lt;/td&gt;&lt;td&gt;".$type. 
"&lt;/td&gt;&lt;td&gt;".$len. "&lt;/td&gt;&lt;td&gt;".$flags. 
"&lt;/td&gt;&lt;/tr&gt;";    
    $i++;
}
echo  "&lt;/table&gt;";
</code></tscreen>
</p>
</sect1>

<sect1><heading>Hoe maak je backslashes onzichtbaar in data?</heading>
<p>
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 <em/stripslashes()/ bij het uitlezen 
van die data krijg je voor iedere quote een \' te zien in plaats van het 
normale quote teken. 
</p>
</sect1>

<sect1><heading>Kan je binaire data opslaan in MySQL?</heading>
<p>
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.</p>

<p>Om te kijken of het plaatje aanwezig is maak je gebruik van de 
<em/file_exists()/ functie:

<tscreen><code>
&lt;?php
	/*
	Zet een connectie naar de database op en voer de gewenste 
	query uit.Je kan dan een variabele aanmaken ($product_id) 
	waarin je het gewenste recordnr van het product dumpt. Daarna 
	voer je de volgende check uit.
	*/
	
	if (file_exists("/path/$product_id.jpg")){
		echo "<img src=\"/path/$product_id\" border=0 
		alt=\"$row[product_omschrijving]\">;
	}
?&gt;
</code></tscreen>
</p>
</sect1>

<sect1><heading>Hoe kan je X records per pagina tonen?</heading>
<p>
Hiervoor moet je de limit functie gebruiken. Voorbeeld:

<tscreen><code>
&lt;?php

	/*
	Connectie is al gemaakt. Via de parameter $start weten we op 
	welke plek in de resultset we de limit moeten laten starten, als 
	$start leeg is weten we dat we op 0 moeten beginnen. $view is het 
	totaal aantal records dat we willen tonen
	*/
	
	$view = 5;
	
	$query = "SELECT * FROM tabela WHERE conditie = 'blauw'";
	$result = mysql("database", $query);
	
	/*
	Om te weten hoeveel records er in de resultset zitten vragen 
	we eerst het aantal rijen op.
	*/
	$total = mysql_num_rows($result);
	
	/*
	We weten nu dat er bijvoorbeeld 45 records in zitten. We vullen
	dan de query aan met de limitfunctie zodat we de volgende X 
	records kunnen opvragen. 
	*/
	$query .= " limit $start, $view";
	
	/*
	We runnen de query nog een keer.
	*/
	$result = mysql("database", $query);
	
	/*
	We hebben nu een resultset met 5 records die beginnen op 
	$start. Je kan het tonen door een simpele lus. 
	*/
	while ($row=mysql_fetch_array($result)){
	
		echo $row[veldnaam];
		
	}
	

?&gt;
</code></tscreen>
</p>
	
<p>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.</p>
</sect1>

<sect1><heading>Kant en klare oplossingen voor PHP (en MySQL).</heading>
<p>
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.</p>

<sect2><heading>Database onderhoud.</heading>
<p>
<itemize>
<item> <htmlurl url="http://modems.rosenet.net/FaceMySQL/" name="http://modems.rosenet.net/FaceMySQL/">
</item>
<item> <htmlurl url="http://www.htmlwizard.net/phpMyAdmin/" name="http://www.htmlwizard.net/phpMyAdmin/">
</item>
</itemize>
</p>
</sect2>

<sect2><heading>Zoeken.</heading>
<p>
<itemize>
<item> <htmlurl url="http://mysearch.udm.net/" name="http://mysearch.udm.net/">
</item>
</itemize>
</p>
</sect2>

<sect2><heading>Forum.</heading>
<p>
<itemize>
<item> <htmlurl url="http://fumanchi.tabu.uni-bonn.de/forum/" name="http://fumanchi.tabu.uni-bonn.de/forum/"></item>
<item> <htmlurl url="http://www.neoqst.com/public/neoboard/neoboard.html" name="http://www.neoqst.com/public/neoboard/neoboard.html"></item>
<item> <htmlurl url="http://www.phunkbros.dk/products.html" name="http://www.phunkbros.dk/products.html"></item>
<item> <htmlurl url="http://www.phorum.org/" name="http://www.phorum.org/">
</item>
<item> <htmlurl url="http://w-agora.araxe.fr/" name="http://w-agora.araxe.fr/">
</item>
</itemize>
</p>
</sect2>

<sect2><heading>Gastenboek.</heading>
<p>
<itemize>
<item> <htmlurl url="http://mygb.php-homepage.de/" name="http://mygb.php-homepage.de/"></item>
</itemize>
</p>
</sect2>

<sect2><heading>E-Commerce oplossingen.</heading>
<p>
<itemize>
<item> <htmlurl url="http://www.fishcart.org/" name="http://www.fishcart.org/">
</item>
<item> <htmlurl url="http://www.w3-concept.net/" name="http://www.w3-concept.net/">
</item>
<item> <htmlurl url="http://modems.rosenet.net/MyCart/" name="http://modems.rosenet.net/MyCart/">
</item>
<item> <htmlurl url="http://www.phpauction.org/" name="http://www.phpauction.org/">
</item>
<item> <htmlurl url="http://phpshop.sourceforge.net/" name="http://phpshop.sourceforge.net/">
</item>
</itemize>
	
	
<!-- ####################################################### -->
</p>
</sect2>
</sect1>
</sect>

<sect><heading>Sessions in PHP.</heading>

<sect1><heading>Wat is een session.</heading>
<p>
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 <em/cookie/ of via de  session_id in de url. De onderstaande 
voorbeelden gaan uit van een cookie.</p>
</sect1>

<sect1><heading>Session variabelen meegeven en opvragen.</heading>
<p>

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:

<tscreen><code>
&lt;?php
		/*
		Session starten.
		*/
		session_start();
		
		/* 
		Zet de waarde in de variabele.
		*/
		$log = "Dit is de waarde die ik wil meegeven";
		
		/*
		Registreer de session
		*/
		session_register("log");
	
?&gt;
</code></tscreen>
</p>

<p>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:

<tscreen><code>
&lt;?php
	
    session_start();
    session_register("log");
    echo $log;
	
?&gt;
</code></tscreen>

<!-- ####################################################### -->
</p>
</sect1>
</sect>

<sect><heading>Strings in PHP.</heading>

<sect1><heading>String weergeven in PHP.</heading>

<sect2><heading>Echo</heading>
<p>
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:

<tscreen><code>
&lt;?php
	echo "Hello World";
?&gt;
</code></tscreen>
</p>
</sect2>

<sect2><heading>Print</heading>
<p>
Met print heb je iets meer mogelijkheden dan met echo. Zo kan je 
bijvoorbeeld op meerdere regels printen zonder gebruik te maken van 
&lt;br&gt; en/of 
"\n".
</p>
</sect2>


<sect2><heading>Printf</heading>
<p>
Printf geeft je de mogelijkheid om een <em/formatted output/ te 
genereren.
</p>
</sect2>
</sect1>

<sect1><heading>String samenvoegen (concat).</heading>
<p>
Voor het samenvoegen van string gebruik je een . (eventueel in 
combinatie met een = teken):

<tscreen><code>
&lt;?php
	
	$a = "foo";
	$b = "bar";
	$c = $a . $b;
	
	/*
	Gebruik van het = teken.
	*/
	
	$a = "foo";
	$a .= " bar";
	
?&gt;
</code></tscreen>
</p>
</sect1>

<sect1><heading>Gedeelte van een string vervangen.</heading>
<p>
Je kan heel snel een gedeelte van een string vervangen. Je gebruikt 
daarvoor de ereg_replace() functie voor:

<tscreen><code>
&lt;?php
	
	$a =  "Dit is de orginele string";
	$b =  ereg_replace( " is", " was", $a );

?&gt;
</code></tscreen>

<!-- ####################################################### -->
</p>
</sect1>
</sect>

<sect><heading>PHP code opnemen in je bestanden.</heading>

<sect1><heading>Hoe kan ik PHP opnemen in mijn html bestanden.</heading>
<p>
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&euml;ren in o.a. <em/phtml/, <em/php3/ en <em/php/.</p>

<p>De code kan op elke willekeurige plek in een bestand worden opgenomen. 
Dit doe je d.m.v. openings en sluit tags:

<tscreen><code>
&lt;?php
/*
Hiertussen kan je de php code opnemen.
*/
?&gt;
</code></tscreen>
</p>

<p>Het is gebruikelijk om commentaar regels op te nemen in de C 
programmeer <em/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.</p>
</sect1>


<sect1><heading>Bestanden includen.</heading>
<p>
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 <em/include/ 
of het <em/require/ commando gebruiken. Het grote verschil tussen deze twee 
commando's zit hem hierin dat het <em/include/ commando waarden kan teruggeven. 
Om een bestand te includen ga je als volgt te werk:

<tscreen><code>
&lt;?php
	include ("/path/bestand.php");
?&gt;
</code></tscreen>
</p>

<p>Je kan in de <em/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 
<em/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&iuml;ndexeerd door zoekmachines.


<!-- ####################################################### -->
</p>
</sect1>
</sect>

<sect><heading>PHP error's en bugs.</heading>

<sect1><heading>Ik krijg de melding "Call to unsupported or undefined function: 
mysql_connect()".</heading>
<p>
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.</p>
</sect1>

<sect1><heading>Mail functie werkt niet onder PHP4.</heading>
<p>
Er zit een vervelende bug in de PHP4 (beta4) configuratie. In de php.ini
kan je het <em/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 <em/path/
niet vinden. De oplossing is heel eenvoudig. Zet een ; voor de regel, 
PHP gebruikt dan de default instellingen.

<!-- ####################################################### -->
</p>
</sect1>
</sect>

<sect><heading>MySQL.</heading>

<sect1><heading>SQL.</heading>
<p>
Om gegevens te bewerken, verwijderen en op te vragen uit MySQL maak je gebruik van 
SQL, oftwel <em/Structured Query Language/. Dit is een taal die in veel 
database(servers) voor handen is. De SQL die gebruikt wordt zal verschillen per 
databaseserver.
</p>
</sect1>

<sect1><heading>Gegevens selecteren en opvragen in MySQL.</heading>
<p>
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:</p>

<p>
<tscreen><code>
$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> 
</code></tscreen>
</p>

<p>We kunnen nu eerst eens gaan bekijken welke velden er in de tabellen
staan:

<tscreen><code>
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 |
+-------+-------------+------+-----+---------+----------------+----------------------+
</code></tscreen>
</p>

<p>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:

<tscreen><code>
mysql> select * from link_soort;
+----+---------------------------+
| id | naam                      |
+----+---------------------------+
| 33 | security_sites            |
| 31 | w-managers                |
| 32 | wm-tools                  |

.................
</code></tscreen>
</p>

<p>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:

<tscreen><code>
mysql> select count(id) from link_soort;
+-----------+
| count(id) |
+-----------+
|        51 |
+-----------+
</code></tscreen>
</p>

<p>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 <em/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:</p>

<p>
<tscreen><code>
mysql> insert into link_soort values (null, 'test');
Query OK, 1 row affected (0.13 sec)

</code></tscreen>
</p>

<p>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:

<tscreen><code>
mysql> DELETE FROM link_soort WHERE naam = 'test';  
Query OK, 1 row affected (0.02 sec)
</code></tscreen>
</p>
</sect1>

<sect1><heading>De site bezoeker toegang geven tot een database.</heading>
<p>
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:

<tscreen><code>
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> 
</code></tscreen>
</p>

<p>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:

<tscreen><code>
$mysql mysql
</code></tscreen>
</p>

<p>Je kan de gebruiker verschillende rechten toekennen. De meest voorkomende
rechten zijn SELECT, INSERT en UPDATE. Dit doe je op de volgende manier:

<tscreen><code>
GRANT SELECT, INSERT ON gb.gb TO guest@localhost IDENTIFIED BY 'hallo'; 
</code></tscreen>
</p>

<p>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.</p>

<p>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:

<tscreen><code>
GRANT SELECT, INSERT, UPDATE ON gb.gb TO guest@domeinnaam IDENTIFIED BY 'hallo'; 
</code></tscreen>
</p>

<p>Mocht de database gb uit diverse tabellen bestaan waarop de gebruiker
allemaal moet kunnen lezen, schrijven en aanpassen dan gebruik je de volgende
syntax:

<tscreen><code>
GRANT SELECT, INSERT, UPDATE ON gb.* TO guest@domeinnaam IDENTIFIED BY 'hallo'; 
</code></tscreen>
</p>
</sect1>
</sect>
</article>
</linuxdoc>