Hello Sinje,
nachdem Tamni so fleißig war und ich ihm Kommentare in seine Lösung geschrieben habe, kommt von mir jetzt auch noch eine, um Kommentare oder Fragen reinschreiben zu lassen.
Ich habe gleich mal ausprobiert, wie man eine aussagefähige Fehlerbehandlung aufbauen könnte.
<?php
header('Content-Type: text/html; Charset=utf-8');
$filename = 'changer.dat';
$MYERRORMSG = NULL;
ini_set('track_errors',1);
$abort = ignore_user_abort(true);
function get_error_msg($error_txt)
{
return $error_txt;
}
function changer($filename, $number=1)
{
GLOBAL $MYERRORMSG;
$fp = @fopen($filename, 'rb+');
if (!$fp)
{
$MYERRORMSG = get_error_msg($php_errormsg);
return false;
}
if (!@flock($fp, LOCK_EX))
{
$MYERRORMSG = get_error_msg($php_errormsg);
return false;
}
$filesize = filesize($filename);
$cont = fread($fp, $filesize);
$_data = @parse_ini_string($cont, true);
if ($_data === false)
{
$MYERRORMSG = "1000 - Fehler beim Parsen der Datenquelle $filename: $php_errormsg";
return false;
}
if (!isset($_data['active'], $_data['reserve']))
{
$MYERRORMSG = '1010 - allg. Fehler in der Datenquelle';
return false;
}
if (count($_data['active']) === 0 && count($_data['reserve']) === 0)
{
$MYERRORMSG = '1011 - Datenquelle ist leer';
return false;
}
if (count($_data['active']) + count($_data['reserve']) < $number)
{
$MYERRORMSG = '1012 - Datenquelle enthält zuwenig Daten';
return false;
}
$_selection = array();
$shuffle_flag = false;
for ($i = 0; $i < $number; $i++)
{
if (count($_data['active']) === 0)
{
$_data['active'] = $_data['reserve'];
$_data['reserve'] = array();
$shuffle_flag = true;
}
$shift = array_shift($_data['active']);
$_selection[] = $shift;
$_data['reserve'][] = $shift;
}
if ($shuffle_flag)
{
shuffle($_data['active']);
shuffle($_data['reserve']);
}
ftruncate ($fp, 0);
fseek($fp, 0, SEEK_SET);
fwrite ($fp, ';### ' . basename($filename) . ' ### ' . date('Y-m-d H:i:s') . ' ### utf-8 ### ÄÖÜäöü' . PHP_EOL);
fwrite ($fp, '[active]' . PHP_EOL);
foreach($_data['active'] as $key => $value)
{
fwrite ($fp, "$key = $value" . PHP_EOL);
}
fwrite ($fp, PHP_EOL . '[reserve]' . PHP_EOL);
foreach($_data['reserve'] as $key => $value)
{
fwrite ($fp, "$key = $value" . PHP_EOL);
}
fclose($fp);
return $_selection;
}
echo "<pre>\r\n";
echo htmlspecialchars(print_r(changer($filename,3),1)) . "\r\n";
echo $MYERRORMSG . "\r\n";
echo "</pre>\r\n";
?>
Und zum Testen ein Datenfile, damit Ihr das nicht selber eintippen müsst :-P
;
[active]
0 = 'schwarz'
1 = 'braun'
2 = 'rot'
3 = 'orange'
4 = 'gelb'
5 = 'grün'
6 = 'blau'
7 = 'violett'
8 = 'grau'
9 = 'weiß'
10 = 'gold'
11 = 'silber'
[reserve]
Ob man damit nun Werbebanner durchtickert oder Farben oder News-Dateien, ist der Ini-Datei egal. Ich habe extra keine serialized Arrays benutzt, weil man so ganz einfach die Datei mit einem Editor füttern kann.
Wenn wir die letzten Fehler noch gefunden haben, machen wir einen kleinen Artikel fürs Wiki daraus, mit ordentlich viel Kommentaren und Fragen und Antworten versehen bitte.
Wenn Tami noch Lust dazu hat, können wir ja die überarbeitete Klasse daneben stellen. Dann haben alle 'was davon.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg