| 12
 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ï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>
<?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++;
}    
?>
</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<br>\n";
/*
Zet een html tabel op en toon de veldtypes, veldnamen en
de veldlengte van die velden in een loop.
*/
echo  "<table width=\"90%\" border=1><tr><td>";
echo 
"Naam</td><td>VeldType</td><td>Lengte</td><td>Vlag</td></tr>";
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  "<tr><td>";
    echo $name. "</td><td>".$type. 
"</td><td>".$len. "</td><td>".$flags. 
"</td></tr>";    
    $i++;
}
echo  "</table>";
</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>
<?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]\">;
	}
?>
</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>
<?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];
		
	}
	
?>
</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>
<?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");
	
?>
</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>
<?php
	
    session_start();
    session_register("log");
    echo $log;
	
?>
</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>
<?php
	echo "Hello World";
?>
</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 
<br> 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>
<?php
	
	$a = "foo";
	$b = "bar";
	$c = $a . $b;
	
	/*
	Gebruik van het = teken.
	*/
	
	$a = "foo";
	$a .= " bar";
	
?>
</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>
<?php
	
	$a =  "Dit is de orginele string";
	$b =  ereg_replace( " is", " was", $a );
?>
</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ë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>
<?php
/*
Hiertussen kan je de php code opnemen.
*/
?>
</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>
<?php
	include ("/path/bestand.php");
?>
</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ï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>
 |