mediatheek (2)

We beschikken ondertussen over een database, die we gepopuleerd hebben met items, auteurs, etc. Nu dienen we de gegevens uit de database te ontsluiten.

Personen, items, series, zijn allemaal gelijkaardig opgebouwd. Ze bestaan minstens uit een hoofbestand zonder extensie, waarvoor er in een .htaccess bestand een ForceType directive wordt meegegeven:

ForceType application/x-httpd-php

Deel 2: de personen

people
‘people’ is het hoofdbestand. Het gebruikt een aantal bestanden waarin functies gegroepeerd zitten, stelt de SQL queries op, en toont de gegevens.
inc.php
Bevat twee functies die op elke pagina worden gebruikt.
alphaNav ($link,$vet = '') dat het alfabetisch submenu (links) opstelt, en eventueel een letter ‘ontlinkt’ en vet maakt
function fncParams ($welke = 1) dat de parameters aan het einde van de URL inleest (bvb de ‘m’ op het einde van http://www.volume12.net/library/people/m)
people.php
Twee functies die worden aangewend om de gegevens te tonen.
getAuthors($skwel = '', $alphaid = ''): krijgt de SQL query mee die in het hoofdbestand wordt bepaald, en roept de tweede functie op, als er een letter werd gekozen (zoals de ‘m’ hierboven); is er geen letter gekozen, wordt er enkel een alfabetisch geordende lijst van ‘auteurs’ getoond.
getWorks($recid = 0,$wat='',$detail='short') is de functie die in de eerste functie wordt opgeroepen om de werken, geassocierd met een gegeven ‘auteur’ te tonen.
elders
Elders staat ook nog ergens de functie connection($query) verborgen, waarin de connectie naar de database wordt gedefinieerd.

Verder uitgediept en uitgeschreven (zonder de meeste HTML opmaak) geeft dat dan:

people
require_once ("inc.php");
require_once ("people.php");
» roept de twee bestanden met functies op
$alphaid = fncParams(1);
» haalt de eerste parameter aan het einde van de URL op
if ($alphaid == '0-9')
{
$skweltoo = 'FROM lib_author WHERE liba_lname RLIKE "^[' . $alphaid . ']"';
} else {
$alphaid = $alphaid{0};
$skweltoo = 'FROM lib_author WHERE liba_lname LIKE "' . $alphaid . '%"';
}
» hier sluiten we meteen uit dat er ‘gevaarlijke code’ kan worden meegegeven in de URL: er wordt enkel naar het eerste karakter ($alphaid{0}) gekeken, of de string ‘0-9’
$cntrecords = connection('SELECT * ' . $skweltoo);
$nrrecords = mysql_num_rows($cntrecords);
» telt het aantal records voor de query
$skwel = 'SELECT * ' . $skweltoo . ' ORDER BY liba_lname, liba_fname ASC';
» stelt de volledige query op
echo alphaNav ('people', $alphaid);
echo $nrrecords;

» toont het alfabet-menu links en het aantal records
if ($nrrecords > 0)
{
echo getAuthors ($skwel, $alphaid);
} else
{
echo ('Sorry. No records.');
}
» toont de data, of in het geval er geen gegevens zijn, de melding Sorry. No records.
inc.php
function alphaNav ($link,$vet = '')
{
$arr = array('0-9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
$aNav = '';
foreach ($arr as $value)
{
if ($value == $vet)
{
$aNav .= ' <strong>' . $value . '</strong>';
} else {
$aNav .= ' <a href="' . $link . '/' . $value . '">' . $value . '</a>';
}
}
$aNav .= ' - ';
if ($vet == '')
{
$aNav .= ' <strong>all</strong>';
} else {
$aNav .= ' <a href="' . $link . '/">all</a>';
}
return $aNav;
}
» geeft het alfabetisch menu weer, volgens de parameters die werden meegegeven in echo alphaNav ('people', $alphaid); people wordt toegevoegd via $link, en naar gelang de letter,gedefinieerd als/in $alphaid wordt één van de letters vet getoond
function fncParams ($welke = 1)
{
$var_array = explode("/",getenv("PATH_INFO"));
$num = count($var_array);
if ($num > $welke)
{
$param = $var_array[$welke];
} else {
$param = 'all';
}
return $param;
}
» geeft de eerste parameter aan het einde van de URL terug
people.php
De twee functies, zonder verdere commentaar (het is laat, ik ben moe; als er vragen over zijn, stel ze gerust in de comments bij deze entry)
function getAuthors($skwel = '', $alphaid = '')
{
$returnit = '';
// if there are any records, then please show them
if ($skwel != '')
{
$beginletter = '';
$start = 0;
$returnit .= '<ul>';
$returnit .= "n";
$result = connection($skwel);
while ($row = mysql_fetch_array($result))
{
extract($row);
$start += 1;
if ($beginletter != strtolower($liba_lname{0}))
{
if ($start > 1) { $returnit .= '<li> </li>'; }
$beginletter = strtolower($liba_lname{0});
}
$returnit .= '<li&gt,<a href="person/' . $liba_id . '">' . $liba_fname . ' ' . $liba_lname . '</a></li>';
$returnit .= "n";
if ($alphaid != '')
{
$returnit .= getWorks($liba_id,'');
}
}
$returnit .= '</ul>';
$returnit .= "n";
} else {
$returnit = 'Sorry. No records.';
}
return $returnit;
}
» bovenstaande functie toont de ‘auteurs’ en roept, indien nodig de volgend functie op
function getWorks($recid = 0,$wat='',$detail='short')
{
$retworks = '';
if (is_numeric($recid) && $recid > 0)
{
$listworks = 'FROM lib_work, lib_wauthor WHERE libwa_work=libw_id AND libwa_author = ' . $recid;
if ($wat != '')
{
$listworks .= ' AND FIND_IN_SET("' . $wat . '",libw_media)>0';
}
$listworks .= ' ORDER BY libw_title, libw_year';
$cntrecords = connection('SELECT COUNT(*) as bar ' . $listworks);
$nrrecords = mysql_num_rows($cntrecords);
if ($nrrecords > 0)
{
$retworks = '<ul class="' . $detail . '">';
$retworks .= "n";
$result = connection('SELECT * ' . $listworks);
while ($row = mysql_fetch_array($result))
{
extract($row);
$retworks .= '<li><a href="item/' . $libw_id . '">' . $libw_title . '</a> (' . $libw_year . ')';
if ($detail == 'long')
{
$retworks .= '<br />';
$br = 1;
$retworks .= $libw_format;
if (isset($libw_length) && $libw_length != '')
{
$br += 1;
$retworks .= ', ' . $libw_length;
if (substr_count($libw_media,'book')>0 || substr_count($libw_media,'comic')>0)
{
$retworks .= ' pages';
} else {
$retworks .= ' minutes';
}
}
if (isset($libw_code) && $libw_code != '')
{
$br += 1;
if (substr_count($libw_media,'book')>0 || substr_count($libw_media,'comic')>0)
{
$retworks .= ', ISBN ';
} else {
$retworks .= ', ';
}
$retworks .= $libw_code;
}
if ($br > 0)
{
$retworks .= "<br />n";
}
$br = 0;
if (isset($libw_where) && $libw_where !='')
{
$retworks .= 'from: ' . $libw_where;
$br += 1;
}
if (isset($libw_when) && $libw_when !='')
{
$retworks .= ' on ' . DateName($libw_when,'short');
$br += 1;
}
if ($br > 0)
{
$retworks .= "<br />n";
}
$retworks .= 'info & sales: ';
if (isset($libw_amazon) && $libw_amazon !='') { $retworks .= ' [<a href="http://www.amazon.co.uk/exec/obidos/ASIN/' . $libw_amazon . '/decemberorg00/" title="buy @ amazon uk">amazon uk</a> / <a href="http://www.amazon.fr/exec/obidos/ASIN/' . $libw_amazon . '/xi12-21/" title="achetez @ amazon fr">amazon fr</a>]';}
if (isset($libw_imdb) && $libw_imdb !='') { $retworks .= ' [<a href="http://us.imdb.com/title/' . $libw_imdb . '" title="info @ imdb">imdb</a>]';}
}
$retworks .= '</li>';
$retworks .= "n";
}
$retworks .= '</ul>';
$retworks .= "n";
}
}
return $retworks;
}
elders
De connectie naar de database
function connection($query)
{
$db = @mysql_connect("UW DATABASE HOST", "UW DATABASE USER", "UW DATABASE PASWOORD");
if (!$db) {
echo("Connection to database failed.");
}
if (!@mysql_select_db("UW DATABASE")) {
echo("Database connection failed.");
}
$result = mysql_query($query,$db);
if (!$result) {
echo("Error: " . mysql_error());
}
return $result;
}

In het menu bij de personen zal je zien dat je enkel de ‘auteurs’ van boeken, cds, strips, of films kan laten weergeven. Die links leiden naar bestanden waarin de SQL werd aangepast om enkel op boeken, cds, strips, of films te zoeken. In het geval van boeken bvb, door dit toe te voegen: WHERE FIND_IN_SET("book",libw_media)>0 aan de SQL statement. De lib_work tabel (cfr) had een SET, libw_media waarin kon worden gespecifieerd of het om audio, book, comic, movie ging, of een combinatie. Als je dan enkel zoekt op WHERE libw_media = 'book', dan mis je de items die bvb zowel een boek als een cd bevatten (zoals The Future Dictionary of America); daarom zoek je of een bepaald ‘iets’ voorkomt in de set (FIND_IN_SET).

Voila. Tot zover het inzicht in de code achter de mediatheek. Hopelijk heeft iemand er iets aan.