PHP & MySQL - Introduktion for begyndere samt kodeeksempler

ADVARSEL SAFARI-BRUGERE!
Apples Safari-browser (1.0) er ikke egnet til kopiering af kodeeksempler, hverken her eller på andre sites.
White-space erstattes med usynlige tegn eller ingenting - herunder manglende linieskift. Den kopierede kode vil ikke virke!!!
Brug i stedet Mozilla, Camino eller Mozilla Firefox. http://www.mozilla.org
Safari problemerne er forsvundet med version 1.2 som dog kun findes til OSX 10.3.x (Panther).
Note opdateret 12/05/04

Sidst opdateret 27/10/03 23:16

Du begynder med en skabelon for et html dokument f.eks. sådan (XHTML 1.0):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 <style type="text/css">
/* <![CDATA[ */

/* ]]> */
</style>
<title>Untitled</title>
</head>
<body>

</body>
</html>
Herefter kan du begynde at fylde på med noget php-kode - her markeret med rødt.
F.eks. hente et eksternt dokument ind:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 <style type="text/css">
/* <![CDATA[ */

/* ]]> */
</style>
<title>Untitled</title>
</head>
<body>
<?php
include "min_sang.php";
?>
</body>
</html>
Du skal huske, at det indsatte dokument skal fortsætte html-formatet. 
Filen min_sang.php kan derfor se sådan ud:
<p>
Der er et yndigt land,<br />
det står med brede bøge<br />
nær salten østerstrand<br />
nær salten østerstrand.<br />
Det bugter sig i bakke, dal,<br />
det hedder gamle Danmark,<br />
og det er Frejas sal,<br />
og det er Frejas sal.
</p>
Det vil se sådan ud når du ser det i en browser eks1.php
Hvis du ser kildekoden i din browser vil den se sådan ud:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 <style type="text/css">
/* <![CDATA[ */

/* ]]> */
</style>
<title>Untitled</title>
</head>
<body>
<p>
Der er et yndigt land,<br />
det står med brede bøge<br />
nær salten østerstrand<br />
nær salten østerstrand.<br />
Det bugter sig i bakke, dal,<br />
det hedder gamle Danmark,<br />
og det er Frejas sal,<br />
og det er Frejas sal.
</p></body>
</html> 
Det kan være du gerne vil formatere teksten. 
Det gør du ved at skrive stylesheet-formattering:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
<style type="text/css">
/* <![CDATA[ */
p {margin-left: 80px; 
margin-top: 40px; 
font-family: verdana, sans-serif; 
font-size:20px;
color: red;
background-color: transparent;}
/* ]]> */
</style>
<title>Untitled</title>
</head>
<body>
<?php
include "min_sang.php";
?>
</body>
</html>
Nu ser det sådan ud når du ser det i en browser eks2.php
Headers
Hvis du vil undgå at brugerens browser cacher indholdet af din side
kan du allerførst i dit dokument skrive flg:
<?php
header("Expires Wed, 6 Sep 2000 11:11:11 GMT");
header("Last-Modified:" .gmdate("D,d M Y H:i:s")."GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");     // HTTP/1.0
?>
Headers skal stå først i dit dokument og der må ikke være nogen tom linie 
eller "white space" før.
Anvendelsen af headers er nyttig/nødvendig hvis du har et dokument
der hele tiden skifter indhold - en nyhedsside, en debatside m.v.
Variabler og betingelser.
Vi forestiller os, at vi har lavet en side f.eks. en index.php 
hvor der en fast menu mens indholdet er variabelt.
Det variable indhold kan være brudstykker med tekst - 
lad os kalde dem tekst1.php, tekst2.php, tekst3.php, tekst4.php osv.
Som åbningsside kan vi vælge at der altid skal begyndes med tekst1.php
Brugeren kan så foretage de øvrige valg.
I php erklæres en variabel med tegnet $. 
I dette her tilfælde kan vi kalde variablen $fil
På det sted i din kode hvor det variable indhold skal sættes ind skriver du:
<?php
if ($fil) {include "$fil";
} 
else {include "tekst1.php";
}
?>
Dine links/url i dokumentet skal se sådan ud:
<a href="index.php?fil=tekst1.php">Side1</a>
<a href="index.php?fil=tekst2.php">Side2</a>
<a href="index.php?fil=tekst3.php">Side3</a>
<a href="index.php?fil=tekst4.php">side4</a>
Det kan også være, at du gerne vil have at dokumentets titel - 
det der ses i browseren - skal afspejle indholdet
Det gør du ved at erklære en ny variabel f.eks. $navn

Din index.php kan f.eks se sådan ud:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">
<head>
 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
 <style type="text/css">
/* <![CDATA[ */
p {margin-left: 80px; 
margin-top: 40px; 
font-family: verdana, sans-serif; 
font-size:20px;
color: red;
background-color: transparent;}
/* ]]> */
</style>
<title><?php
       $HTTP_GET_VARS = $_GET;        // PHP Superglobals. [link]
       $HTTP_POST_VARS = $_POST;
       $HTTP_SERVER_VARS = $_SERVER;
       extract($_GET);
       extract($_POST);
       extract($_SERVER);
       
            if ($navn) {echo "$navn";
            }
            else {echo "Side1";
            }
            ?>
</title>       
</head>
<body>
<p>
<a href="index.php?fil=tekst1.php&navn=Side1">Side1</a><br />
<a href="index.php?fil=tekst2.php&navn=Side2">Side2</a><br />
<a href="index.php?fil=tekst3.php&navn=Side3">Side3</a><br />
<a href="index.php?fil=tekst4.php&navn=Side4">Side4</a>
</p>    
<?php
       if ($fil) {include "$fil";
       } 
       else {include "tekst1.php";
       }
?>
</body>
</html>
Hvis du gerne ville have, at titlen på dokumentet skal være "Side 1"
(med mellemrum) skal du huske,at der i en url ikke må optræde mellemrum.
Et mellemrum skal skrives som %20:
Din reference skal derfor se sådan ud 

       <a href="index.php?fil=tekst1.php&navn=Side%201">Side 1</a>
Kommentering/udkommentering i kode.
I enten html eller i php (eller i programmeringssprog som perl, java m.v.) 
har man ofte behov for at kommentere den kode man har skrevet.
Det er også en rigtig god ide at gøre.
Så kan du/andre huske/lære og forstå hvad der sker.

Det modsatte - udkommentering - er mest vigtig for programmøren.
Han/hun har måske et script liggende i et dokument.
Scriptet har været brugt og skal måske ikke længere bruges.
Men måske kan det blive aktuelt igen.

I html kommenteres/udkommenteres på denne måde:

      <!--Dette skal ikke vises for brugeren-->

Kommentaren vil være synlig, hvis man kigger på kildekoden.
      
I et php-script skrives en kommentar bl.a. ved at sætte // før kommentaren og
i forlængelse af den pågældende linie - som her:

      <?php
      header("Expires Wed, 6 Sep 2000 11:11:11 GMT");
      header("Last-Modified:" .gmdate("D,d M Y H:i:s")."GMT");
      header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
      header("Cache-Control: post-check=0, pre-check=0", false);
      header("Pragma: no-cache");                          // HTTP/1.0
      ?>

Hvis man ikke har brug for scriptet kan man slette det eller udkommentere det.
Det foregår ved at sætte et hash-tegn (eller på dansk havelåge)
foran den kode-linie som ikke skal bruges:

      <?php
       #header("Expires Wed, 6 Sep 2000 11:11:11 GMT");
       #header("Last-Modified:" .gmdate("D,d M Y H:i:s")."GMT");
       #header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
       #header("Cache-Control: post-check=0, pre-check=0", false);
       #header("Pragma: no-cache");                          // HTTP/1.0
       ?>

Nu har scriptet ingen funktion.
PHP-parseren vil læse koden som
       <?php
       ?>
Altså ingenting!

Der findes flere varianter af kommentering/udkommentering alt efter hvilket 
programmeringssprog man anvender.
Filendelser/suffix
Hvis du bruger php og din kode skal virke skal du være opmærksom på, 
at filen skal have endelsen/suffix .php
Du kan have et fuldtgyldigt html-dokument og indføje nogle php-scripts 
som også er korrekte
Men ingenting sker!
Apacheserveren er sådan indrettet i sin tænkemåde (sic!),
at hvis endelsen er .html behøver den ikke foretage sig noget.
Hvis der bruges .php vækkes den til dåd og php-parseren går igang.

Så husk, at alle filer med php-kode skal have suffix .php

Det omvendte er ikke tilfældet.
Hvis du har et dokument uden php-kode, men alligevel har givet filen endelsen .php
betyder det i praksis ingen ting - det kræver måske lidt mere CPU-tid (for at finde ud af,
at der ikke skal ske noget), men det er i småtings-afdelingen.
Sende en email med php.
Ofte vil man have brug for at have et script på sin hjemmeside som kan sende en
meddelelse. Det kan være en indmeldelsesformular til en forening m.v.
Vær opmærksom på, at du ikke kan få scriptet til at virke på din lokale server 
hvis du ikke har sendmail m.v. aktiveret.
Men det vil virke hvis du har et webhotel med php.
Her er hele koden for en formateret side. 
De anvendte variabler som $alder og $adresse er medtaget for eksemplets skyld. 
De kan udelades eller erstattes af noget andet.
Du skal ændre your@email.dk til din egen email-adresse. 
Ligesom YourSubject kan erstattes med noget andet.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
	"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
	<title>mail</title>
</head>
<body>
<div style="text-align: left; font-size: 10px; font-family: Verdana, Geneva, Arial, sans-serif; 
	margin-left: 100px;">
<?php // Sender en email
$HTTP_GET_VARS = $_GET;         // PHP Superglobals
$HTTP_POST_VARS = $_POST; 
$HTTP_SERVER_VARS = $_SERVER; 

extract($_GET); 
extract($_POST); 
extract($_SERVER); 
 
$email_from = "$navn <$email>";  //Afsenders navn og email-adresse 
$email_besked = "Besked: $besked\nAdresse: $adresse\nAlder: $alder";    //Besked i mail med flere variabler

  if($email){  //hvis betingelsen er opfyldt - at email i form er udfyldt - sendes en mail
  $header="From: $email_from\n";  
  $header .= "X-Mailer: PHP/" . phpversion(). "\n";           
  $header .= "X-Sender-IP: $REMOTE_ADDR\n";
  $header .= "MIME-Version: 1.0\n";  
  $header .= "Content-Type: text/plain; charset=iso-8859-1\n";
  $header .= "Content-Transfer-Encoding: 8bit";
  mail("your@email.dk","YourSubject",$email_besked,$header); // til , subject, besked, fra 
  echo "<p style=\"color: #090; font-weight: 700\">Din mail er sendt!</p>"; // Giver brugeren en besked
  exit;  
  }  
?>
<form method=post action="<?php echo $HTTP_SERVER_VARS['PHP_SELF']; ?>">
navn: <input type="text" name="navn"><br><br>
email: <input type="text" name="email"><br><br>
Besked: <textarea name="besked" cols="60" rows="5"></textarea><br><br>
Adresse: <textarea name="adresse" cols="60" rows="1"></textarea><br><br>
Alder: <textarea name="alder" cols="30" rows="1"></textarea><br><br>
<input type="submit" value="Send">&nbsp;&nbsp;&nbsp;<input type="reset" value="fortryd">
</form>
</div>
</body>
</html>        
I ovennævnte script er anvendt såkaldte escape-tegn.
En escape er nødvendig når et tegn kan forveksles med en kode og sættes med et backslash \
\n betyder i unix-sprog en ny linie
I udtrykket echo "<p style=\"color: #090; font-weight: 700\">Din mail er sendt!</p>"
er det nødvendigt at lave 2 escapes: \"color: #090; font-weight: 700\"
Og hvad så hvis jeg vil ...
PHP har et utal af muligheder og der findes masser af php-kode, bøger etc. 
som du kan finde på nettet eller købe. 
Introen på http://uzu.dk/kursus/ giver nogle links.
Der er også ting, der ikke er blevet omtalt - bl.a. arrays.
Men prøv f.eks at se på koden for startsiden på uzu.dk
MySQL
På adressen http://www.mysql.com/doc/en/Tutorial.html finder du en introduktion
til brug af MySQL via en terminal.
Selv om du foretrækker at bruge en GUI såsom phpMyAdmin eller CocoaMySQL
kan det være nyttigt at prøve denne introduktion, da du lærer hvordan man kontakter
en database, laver forespørgsler m.v.
Hele dokumentationen til MySQL (ca. 750 sider) kan downlades i forsk. formater på
http://www.mysql.com/documentation/index.html
Reference-manualen kan også købes: ISBN 0596002653 og koster kr. 339,63 hos www.saxo.dk

Hvis du har hostet din hjemmeside hos en udbyder der tilbyder MySQL vil du normalt
kun have adgang til 1 database. I forbindelsen med oprettelsen får du at vide hvilken
MySQL server du skal bruge, dit brugernavn og din adgangskode.
Nu kan du begynde at lave tabeller eller tables.
Lad os antage at du på din web-side vil lave en gæstebog
hvor man kan skrive sit navn, email, dato og en besked.
Lad os kalde tabellen "bog".
For at oprette tabellen skal du have logget dig ind i din database hvorefter
du skriver/kopiere flg. i en mysql-promt (eller via den GUI du bruger):

CREATE TABLE bog (
  nr int(11) NOT NULL auto_increment,
  navn tinytext NOT NULL,
  email tinytext NOT NULL,
  dato tinytext NOT NULL,
  besked text NOT NULL,
  PRIMARY KEY  (nr)
) TYPE=MyISAM PACK_KEYS=1;

Nedenfor er gengivet en terminalsession fra OSX:

     Last login: Sun Oct 26 16:47:58 on ttyp1
     Welcome to Darwin!
     [min-computer:~] jens% mysql -h localhost -u root -p
     Enter password: 
     Welcome to the MySQL monitor.  Commands end with ; or \g.
     Your MySQL connection id is 51 to server version: 3.23.55
     
     Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
     
     mysql> use uzu;
     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> show tables;
     +---------------+
     | Tables_in_uzu |
     +---------------+
     | debat         |
     | documents     |
     | documents1    |
     +---------------+
     3 rows in set (0.00 sec)
     
     mysql> CREATE TABLE bog (
         ->   nr int(11) NOT NULL auto_increment,
         ->   navn tinytext NOT NULL,
         ->   email tinytext NOT NULL,
         ->   dato tinytext NOT NULL,
         ->   besked text NOT NULL,
         ->   PRIMARY KEY  (nr)
         -> ) TYPE=MyISAM PACK_KEYS=1;
     Query OK, 0 rows affected (0.00 sec)
     
     mysql> show tables;
     +---------------+
     | Tables_in_uzu |
     +---------------+
     | bog           |
     | debat         |
     | documents     |
     | documents1    |
     +---------------+
     4 rows in set (0.01 sec)
     
     mysql> describe bog;
     +--------+----------+------+-----+---------+----------------+
     | Field  | Type     | Null | Key | Default | Extra          |
     +--------+----------+------+-----+---------+----------------+
     | nr     | int(11)  |      | PRI | NULL    | auto_increment |
     | navn   | tinytext |      |     |         |                |
     | email  | tinytext |      |     |         |                |
     | dato   | tinytext |      |     |         |                |
     | besked | text     |      |     |         |                |
     +--------+----------+------+-----+---------+----------------+
     5 rows in set (0.00 sec)
     
     mysql> quit
     Bye
     [min-computer:~] jens% 
     
Nu har vi fået oprettet tabellen "bog" og er klar til at indsætte data.
Til dette skal vi bruge et php-script og en (html) form:
<?php
header("Expires Wed, 6 Sep 2000 11:11:11 GMT");
header("Last-Modified:" .gmdate("D,d M Y H:i:s")."GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");  // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");                          // HTTP/1.0
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da" lang="da">
<head>
<title>Min G&aelig;stebog</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<body id="top">
<h2 style="text-align:center">Min G&aelig;stebog</h2>
<table align="center" width="640">
<tr>
<td height="30" align="center"><a href="#id1">Skriv!</a></td>
</tr>
<tr>
<td align="center">
<hr />
</td>
</tr>
</table>

  <?php // sript1 - kontakter databasen og indsætter data
  $db = mysql_connect("yoursqlhost.dk", "your-username", "your-password"); // Skriv de rigtige navne
  mysql_select_db("yourdatabase", $db);   // Valg af database. Husk at ændre navnet.                                  
  if ($skriv){
       $besked = str_replace("\n", "<br />", $besked);
       $dato_array = getdate();
       $dato = $dato_array["mday"]  . "/" . $dato_array["mon"]  . "/" . $dato_array["year"];
  mysql_query("INSERT INTO bog (navn, email, dato, besked) values ('$navn', '$email', '$dato', '$besked')");
  }
  ?>

<table align="center" width="640">

  <?php // script2 henter data                                          
  $foresp = "SELECT nr, navn, email, dato, besked FROM bog ORDER BY nr DESC"; // kald til serveren - viser tidl.
  while($data = mysql_fetch_row($foresp)){                                    // beskeder i aftagende orden
      echo "<tr align=\"left\"><td valign=\"top\" width=\"120\">"; // html-formateringskode med en del escapes.
      echo "fra: <a href=\"mailto:$data[2]\">$data[1]</a>"; // her gengives data om email og navn
      echo "<br />$data[3]"; // her gengives data[3] = dato, (data[0] = nr)
      echo "</td><td valign=\"top\" width=\"10\">&nbsp;</td><td valign=\"top\">$data[4]<hr /></td></tr>"; //besked 
      }
  ?>

</table>

<div style="text-align:center" id="id1">
  <form method="post" action="<?php echo $HTTP_SERVER_VARS['PHP_SELF']; ?>">
  <input type="hidden" name="skriv" VALUE=1> <!--Her aktiveres php-script1 hvis brugeren trykker submit/send-->
  navn:&nbsp; <input type="text" name="navn" /><br />
  email: <input type="text" name="email" /><br />
  <br />
  <textarea name="besked" cols="60" rows="5"></textarea><br />
  <br />
  <input type="submit" value="send" />&nbsp;&nbsp;&nbsp;<input type="reset" value="fortryd" />
  </form>
</div>
<p align="center"><a href="#top">Til toppen</a></p>
</body>
</html>
Flg. udtryk skal kun bruges en gang i dit script:

     $db = mysql_connect("yoursqlhost.dk", "your-username", "your-password"); 
     mysql_select_db("yourdatabase", $db);

Du kan se et "working" eksempel på anvendelse af en næsten identisk kode -
blot er det her en debatside: http://www.arch.dk/debatforum/

Der findes smartere måder at connecte til sin database og hvor man ikke hver gang i sit php-script
skal angive hostname, brugernavn og password.
Det sker ved brug af php-classes og objektorienteret programmering.
Mest kendt er PEAR http://pear.php.net/
På kurset i MacØstjylland brugtes et eksempel fra "MySQL Cookbook" af Paul Dubois ISBN 0-596-00145-2

To be continued..
code2html generated with jEdit
Valid HTML 4.01    Valid CSS