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 ### changer.php ### Wechselnde Ausgabe ### utf-8 ### ÄÖÜäöü
### only for testing
header('Content-Type: text/html; Charset=utf-8');
$filename = 'changer.dat'; ## Dateiname für die Datendatei
#------------------------------------------------------------------------------
## settings
#------------------------------------------------------------------------------
$MYERRORMSG = NULL; ## Globale Variable zur Fehlerauswertung
ini_set('track_errors',1); ## Für die Fehlerbehandlung notwendig
$abort = ignore_user_abort(true);## Damit das File fertig geschrieben wird
## wenn der User vorher schlapp macht.
#------------------------------------------------------------------------------
function get_error_msg($error_txt)
{
## ToDo:
## für alle verfügbaren $php_errormsg eindeutige Fehlernummern festlegen
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'];
## reserve-Array wieder leeren
$_data['reserve'] = array();
$shuffle_flag = true;
}
$shift = array_shift($_data['active']);
$_selection[] = $shift;
$_data['reserve'][] = $shift;
}
## erst hier mischen, weil sonst in $_selection Einträge mehrmals auftreten könnten
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); ## ich vertraue hier auf das OS. PHP ist zu doof dazu
## dass der Lock beim Schließen aufgehoben wird
## und voher die Buffers geschrieben wurden
return $_selection;
}
#==============================================================================
# php unit test
#==============================================================================
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
;### changer.dat ### 2014-05-09 16:21:00 ### utf-8 ### ÄÖÜäöü
[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