[ Utskriftsversion av dessa uppgifter ]
Sidans tema: include_once, allmänt om kodning
Denna övning är en flerstegsprocess där resultatet skall bli en sida där man kan sätta in och ta bort länkar. Jag använder inte en databas, utan kör mot en vanlig textfil. Som lite extra krydda skall sidan ha möjlighet att kontrollera att länkarna är i skick samt - vid behov - tid och storlek för filen som länkats till.
<?php
# det kommer nog mer hit...
?>
<?php
include_once( dirname ( __FILE__ ) . "/o1code.php" );
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
</body>
</html>
http://www.puv.fi/ En websajt 1 Vasa Yrkeshögskola
http://www.puv.fi/not_exist.asp En annan 2 En sida
http://www.not_exist.fi/test.htm Funkar? 3 Titel
OBS! Se till att URL slutar med / om du inte har ett filnamn angivet
OBS! Jag måste skapa nya filer för varje steg. Ni skall använda samma filer som i föregående sida.
Öppna o1code.php och sätt in följande
<?php
# en funktion som visar innehållet i
# länklistan
# parameter: namnet på filen
function visaLänkarna ( $filnamn )
{
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
# vi skall returnera en komplett HTML-tabell
# observera .= (en punkt före =)
$result = "<table border=\"1\">";
$result .= "<tr>";
$result .= "<td>URL</td>";
$result .= "<td>Förklaring</td>";
$result .= "<td>Betyg</td>";
$result .= "<td>Titel</td>";
$result .= "</tr>";
# loopa genom arrayen allt
# raden kommer att vara en rad i filen
foreach( $allt as $raden )
{
# plocka ut ut de enskilda fälten
# explode skapar en array och
# list skapar enskilda variabler av arrayen
list($url, $description, $rating, $title ) = explode ( "\t", $raden );
# plocka ihop såval tabellen men också "a href"
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
$result .= "<td>$description</td>";
$result .= "<td>$rating</td>";
$result .= "<td>$title</td></tr>";
}
# avsluta tabellen
$result .= "</table>";
# returnera den genererade tabellen
return $result;
}
?>
Sätt sedan in detta i links.php. Observera att det även har ändrats i början av filen
<?php
# jag måste skapa en ny fil - du skall fortfarende
# inkludera "/o1code.php"
# om du bara tar copy/paste varje gång
# så får du problem (skyll dig själv)
include_once( dirname ( __FILE__ ) . "/o1code2.php" );
# med den katalogstruktur som er övning har
# kan du även skriva
# $länkFilen = "links.txt" ;
# med min struktur måste jag skriva lite annorunda
$länkFilen = dirname ( __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<?php
# använd funktionen i den inkuderade filen
# och visa dess resutat
echo visaLänkarna( $länkFilen );
?>
</body>
</html>
URL | Förklaring | Betyg | Titel |
Förstår du hur systemet fungerar? Om inte...
Skule det inte vara bra att kunna visa listan sorterad på lite
olika sätt? Se nästa sida.
Sidans tema: $HTTP_SERVER_VARS
Öppna o1code.php och ändra den på följande sätt
<?php
# en funktion som visar innehållet i
# länklistan
# parameter: namnet på filen
function visaLänkarna ( $filnamn )
{
# NYTT------------------------------------------
# I PHP 4.1.0 skulle vi också kunnat skriva
# $filen = $_SERVER["PHP_SELF"];
# och inte behövt global raden...
global $HTTP_SERVER_VARS;
$filen = $HTTP_SERVER_VARS["PHP_SELF"];
# SLUT PÅ NYTT-----------------------------------
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
# vi skall returnera en komplett HTML-tabell
$result = "<table border=\"1\">";
# ÄNDRADE ---------------------------------------
$result .= "<tr>";
$result .= "<td><a href=\"$filen?SORT=url\">URL</a></td>";
$result .= "<td><a href=\"$filen?SORT=description\">Förklaring</a></td>";
$result .= "<td><a href=\"$filen?SORT=rating\">Betyg</a></td>";
$result .= "<td><a href=\"$filen?SORT=title\">Titel</a></td>";
$result .= "</tr>";
# SLUT PÅ ÄNDRADE -------------------------------
# loopa genom arrayen allt
# raden kommer att vara en rad i filen
foreach( $allt as $raden )
{
# plocka ut ut de enskilda fälten
# explode skapar en array och
# list skapar enskilda variabler av arrayen
list($url, $description, $rating, $title ) = explode ( "\t", $raden );
# plocka ihop såval tabellen men också "a href"
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
$result .= "<td>$description</td>";
$result .= "<td>$rating</td>";
$result .= "<td>$title</td></tr>";
}
# avsluta tabellen
$result .= "</table>";
# returnera den genererade tabellen
return $result;
}
?>
Inga ändringar i links.php
<?php
# jag måste skapa en ny fil - du skall fortfarende
# inkludera "/o1code.php"
# om du bara tar copy/paste varje gång
# så får du problem (skyll dig själv)
include_once( dirname ( __FILE__ ) . "/o1code3.php" );
# med den katalogstruktur som er övning har
# kan du även skriva
# $länkFilen = "links.txt" ;
# med min struktur måste jag skriva lite annorunda
$länkFilen = dirname ( __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<?php
# använd funktionen i den inkuderade filen
# och visa dess resutat
echo visaLänkarna( $länkFilen );
?>
</body>
</html>
URL | Förklaring | Betyg | Titel |
Observera att när du klickar på länkarna i tabellen
kommer ?SORT=x att sättas till arderssen
Öppna o1code.php och ändra den på följande sätt
<?php
# NYA ----------------------------------------------
# funktion som sorterar arrayen
# observera & tecknet som gör att
# arrayen sänds med referens
# och modifieras "in-place"
function minSortering( &$arrayen )
{
# Kolla om det fanns en sortering i adressraden
global $HTTP_GET_VARS;
if ( isset ( $HTTP_GET_VARS["SORT"] ) )
{
$sorteringsNyckel = $HTTP_GET_VARS["SORT"];
}
else
{
# default sortering är enligt url
$sorteringsNyckel = "url" ;
}
# sortera enligt angiven nyckel
# det vi i praktiken sände via URL var vilken
# funktion vi skulle använda för sortering
uasort( $arrayen, $sorteringsNyckel );
}
# funktion som sorterar enligt url
function url( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[0], $rightArray[0] );
}
# funktion som sorterar enligt description
function description( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[1], $rightArray[1] );
}
# funktion som sorterar enligt rating
function rating( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[2], $rightArray[2] );
}
# funktion som sorterar enligt title
function title( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[3], $rightArray[3] );
}
# SLUT PÅ NYA --------------------------------------
# en funktion som visar innehållet i
# länklistan
# parameter: namnet på filen
function visaLänkarna ( $filnamn )
{
global $HTTP_SERVER_VARS;
$filen = $HTTP_SERVER_VARS["PHP_SELF"];
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
# NYTT ---------------------------------------------
minSortering( $allt );
# SLUT PÅ NYTT -------------------------------------
# vi skall returnera en komplett HTML-tabell
$result = "<table border=\"1\">";
$result .= "<tr>";
$result .= "<td><a href=\"$filen?SORT=url\">URL</a></td>";
$result .= "<td><a href=\"$filen?SORT=description\">Förklaring</a></td>";
$result .= "<td><a href=\"$filen?SORT=rating\">Betyg</a></td>";
$result .= "<td><a href=\"$filen?SORT=title\">Titel</a></td>";
$result .= "</tr>";
# loopa genom arrayen allt
# raden kommer att vara en rad i filen
foreach( $allt as $raden )
{
# plocka ut ut de enskilda fälten
# explode skapar en array och
# list skapar enskilda variabler av arrayen
list($url, $description, $rating, $title ) = explode ( "\t", $raden );
# plocka ihop såval tabellen men också "a href"
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
$result .= "<td>$description</td>";
$result .= "<td>$rating</td>";
$result .= "<td>$title</td></tr>";
}
# avsluta tabellen
$result .= "</table>";
# returnera den genererade tabellen
return $result;
}
?>
Du behöver inte göra några ändringar i links.php
<?php
# jag måste skapa en ny fil - du skall fortfarende
# inkludera "/o1code.php"
# om du bara tar copy/paste varje gång
# så får du problem (skyll dig själv)
include_once( dirname ( __FILE__ ) . "/o1code4.php" );
# med den katalogstruktur som er övning har
# kan du även skriva
# $länkFilen = "links.txt" ;
# med min struktur måste jag skriva lite annorunda
$länkFilen = dirname ( __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<?php
# använd funktionen i den inkuderade filen
# och visa dess resutat
echo visaLänkarna( $länkFilen );
?>
</body>
</html>
Skulle det inte vara bra om man kunde kolla om sidorna finns kvar och när de ändrats om de finns kvar? OK, lets do it!
Sätt den i samma katalog som de övriga och sätt in följande:
<?php
function kollaLänkarna ( $filnamn )
{
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
# filen har redan stängts
# öppna upp filen för skrivning
$fp = fopen( $filnamn, "w+" );
# lås filen så att andra kan läsa men inte skriva
flock( $fp, 1 );
# loopa genom arrayen allt
foreach( $allt as $raden )
{
list( $url, $description, $rating, $title ) = explode ( "\t", $raden );
# plocka ut servernamn respektive filnamn ur url:n
# sätt dem in i en array där $matches[1] är servern
# och $matches[2] är sidan (om någon)
preg_match( "/http:\/\/([^\/]*)\/(.*)/", $url, $matches );
# skapa en tom header för reslutatet
$headerdata = array();
# kolla om sidan finns
# om funktionen returnerar true kommer
# $headerdata att fyllas med headerns data
# i annat fall kommer $headerdata["Status"] att
# innehålla orsaken till felet
if ( kontaktaServern( $matches ,$headerdata ) )
{
# skapa en tabseparerad rad
$nyrad = $url . "\t";
$nyrad .= $description. "\t";
$nyrad .= $rating . "\t";
$nyrad .= trim($title) . "\t";
$nyrad .= $headerdata["Date"] ."\r\n" ;
}
else
{
# skapa en tabseparerad rad
$nyrad = $url . "\t";
$nyrad .= $description. "\t";
$nyrad .= $rating . "\t";
$nyrad .= trim($title) . "\t";
$nyrad .= $headerdata["Status"] . "\r\n";
}
# skriv den tabseparerade raden till links.txt
fputs( $fp, $nyrad );
}
# tag bort fillåsningen
flock( $fp, 3 );
# stäng filen
fclose( $fp );
}
# funktion som kollar om en server är vid liv och om sidan
# finns
# första parametern är en array med servernamnen
# och file (inklusive path)
# andra är en *referens* till en array som kommer att användas för
# resultat-rapportering
function kontaktaServern( $data , &$resultat )
{
$server = $data[1];
# det finns kanske inte alltid ett andra element
# i arrayen - därav @
$file = "/" . @ $data[2];
# prova öppna porten
$fp = fsockopen (
$server, # adressen - ip går också
80, # port. 80 = HTTP
$errno, # för eventuella felnummer
$errstr, # eventuella felmeddelanden
20 # timeout tid innan vi skall ge upp
);
# gick det inte att öppna ?
if ( !$fp )
{
# Sätt felmeddelande om inte det gick
$resultat["Status"] = "Servern död";
# och returnera false
return false;
}
else
{
# skapa ett normalt HTTP GET kommando
# observera att en den alltid måste sluta
# med \r\n\r\n (två CRLF)
$command = "GET $file ";
$command .= "HTTP/1.0\r\n";
$command .= "Host: $server\r\n\r\n";
# sänd detta
fputs ( $fp, $command );
# läs första raden
$row = fgets ( $fp, 4096 );
# ett normalt status medelande innehåller alltid 200
# alla andra nummer visar på fel - t.ex att sidan inte finns
# Vanliga meddelandenummer
# 200 - OK
# 301 - Moved Permanently
# 302 - Moved Temporarily
# 400 - Bad Request
# 401 - Unauthorized
# 402 - Forbidden
# 404 - Not found
# 500 - Internal server error
if ( ! ( strpos ( $row, "200" ) > 0 ) )
{
$resultat["Status"] = "Sidan finns inte";
return false;
}
# läs vidare tills headern är slut
while ( trim( $row ) != "" AND ( !feof( $fp ) ) )
{
$row = fgets ( $fp, 4096 );
# tag bort nedanstående kommentarstecken # om du vill
# se vad som egentligen händer.
# echo "$row <br />";
# Headern från min server innehåller bland annat
# Server: Microsoft-IIS/5.0
# Date: Thu, 28 Feb 2002 14:52:40 GMT
# Connection: Keep-Alive
# Content-Length: 10168
# Content-Type: text/html
# observera att det alltid är ett kolon i raden
if (strpos ( $row, ":") > 0 )
{
# plocka ut det före kolon och det efter kolon
list( $header, $content ) = explode ( ":", $row );
# kolla om det var date
# konvertera från GMT datum til en dateserial
if ( strcasecmp( trim( $header ), "Date" ) == 0 )
$content = strtotime( $content ) ;
# sätt in detta i resultat arrayen
$resultat[ trim( $header ) ] = trim ( $content );
}
}
# stäng porten
fclose ( $fp );
# kom vi ända hit måste väl allt vara ok
return true;
}
}
?>
<?php
# funktion som sorterar arrayen
# observera & tecknet som gör att
# arrayen sänds med referens
# och modifieras "in-place"
function minSortering( &$arrayen )
{
# Kolla om det fanns en sortering i adressraden
global $HTTP_GET_VARS;
if ( isset ( $HTTP_GET_VARS["SORT"] ) )
{
$sorteringsNyckel = $HTTP_GET_VARS["SORT"];
}
else
{
# default sortering är enligt url
$sorteringsNyckel = "url" ;
}
# sortera enligt angiven nyckel
# det vi i praktiken sände via URL var vilken
# funktion vi skulle använda för sortering
uasort( $arrayen, $sorteringsNyckel );
}
# funktion som sorterar enligt url
function url( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[0], $rightArray[0] );
}
# funktion som sorterar enligt description
function description( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[1], $rightArray[1] );
}
# funktion som sorterar enligt rating
function rating( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[2], $rightArray[2] );
}
# funktion som sorterar enligt title
function title( $left, $right )
{
$leftArray = explode ( "\t", $left );
$rightArray = explode ( "\t", $right );
return strcasecmp( $leftArray[3], $rightArray[3] );
}
# en funktion som visar innehållet i
# länklistan
# parameter: namnet på filen
function visaLänkarna ( $filnamn )
{
global $HTTP_SERVER_VARS;
$filen = $HTTP_SERVER_VARS["PHP_SELF"];
# öppna filen och sätt allt in i en array
$allt = file( $filnamn );
minSortering( $allt );
# vi skall returnera en komplett HTML-tabell
$result = "<table border=\"1\">";
$result .= "<tr>";
$result .= "<td><a href=\"$filen?SORT=url\">URL</a></td>";
$result .= "<td><a href=\"$filen?SORT=description\">Förklaring</a></td>";
$result .= "<td><a href=\"$filen?SORT=rating\">Betyg</a></td>";
$result .= "<td><a href=\"$filen?SORT=title\">Titel</a></td>";
$result .= "</tr>";
# loopa genom arrayen allt
# raden kommer att vara en rad i filen
foreach( $allt as $raden )
{
# plocka ut ut de enskilda fälten
# explode skapar en array och
# list skapar enskilda variabler av arrayen
# ÄNDRAD ---------------------------------------------
list($url, $description, $rating, $title, $status ) = explode ( "\t", $raden );
# SLUT PÅ ÄNDRAD -------------------------------------
# NY -------------------------------------------------
if ( intval ( $status ) != 0 )
{
$status = "Senast ändrad : " . date("d.m.Y", trim( $status ) );
}
# SLUT PÅ NY ----------------------------------------
# plocka ihop såval tabellen men också "a href"
$result .= "<tr><td><a href=\"$url\">$url</a></td>";
$result .= "<td>$description</td>";
$result .= "<td>$rating</td>";
$result .= "<td>$title</td></tr>";
# NY -------------------------------------------------
$result .= "<tr><td colspan=\"4\">$status</td></tr>";
# SLUT PÅ NY ----------------------------------------
}
# avsluta tabellen
$result .= "</table>";
# returnera den genererade tabellen
return $result;
}
?>
<?php
# NY -------------------------------------------------
include_once( dirname ( __FILE__ ) . "/checklinks.php" );
# SLUT PÅ NY -----------------------------------------
# du skall fortfarande inkludera o1code.php
include_once( dirname ( __FILE__ ) . "/o2code1.php" );
$länkFilen = dirname ( __FILE__ ) . "/links.txt" ;
?>
<html>
<head>
<title>Mina länkar</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF">
<?php
# NY -------------------------------------------------
kollaLänkarna ($länkFilen );
# SLUT PÅ NY -----------------------------------------
echo visaLänkarna( $länkFilen );
?>
</body>
</html>
URL | Förklaring | Betyg | Titel |