Function - include - in for?
Rainer
- php
Hallo,
die Suche funktioniert leider nicht, daher hier mein Verständnisproblem, welches sicher schon mehrfach vorkam...
Versuch (auf das Problem reduziert):
<?php
for($x=0;$x < 5;$x++){
include("function/pass.php");
//hier folgt ein DB-Insert in welchem 5 Zeilen angelegt werden die alle unterschiedliche $Pass haben müssen.
}
?>
gibt aus: Fatal error: Cannot redeclare pwt() (previously declared in ...
Logisch, aber wie kann ich das umgehen? include_once generiert mir halt nur 1x.
Hier noch die pass.php, welche ich in dem Projekt oft verwende, allerdings immer nur einmal.
<?php
function pwt($pl)
{
srand(time());
$zeichen = "ABCDEFGHJKMNPQRSTUVWXY23456789";
$zeichen .= strtolower($zeichen);
for ($i = 0; $i < $pl; $i++)
{
$n = rand() % strlen($zeichen);
$pwt .= substr($zeichen, $n, 1);
}
return $pwt;
}
$Pass = pwt($pl);
?>
Gruß Rainer
Hellihello
deklariere die Funktion außerhalb der Schleife?
Dank und Gruß,
Hallo frankx,
wie geht dann sowas? Stehe völlig auf dem Schlauch.
Gruß Rainer
wie geht dann sowas? Stehe völlig auf dem Schlauch.
Du lagerstr dein include einfach aus der for-Schleife aus. Es gibt keinen Grund, eine Datei mehrfach einzubinden, zumindest nicht in diesem Fall.
Hallo,
Versuch2:
<?php
function pwt($pl)
{
srand(time());
$zeichen = "ABCDEFGHJKMNPQRSTUVWXY23456789";
$zeichen .= strtolower($zeichen);
for ($i = 0; $i < $pl; $i++)
{
$n = rand() % strlen($zeichen);
$pwt .= substr($zeichen, $n, 1);
}
return $pwt;
}
for($x=0;$x < 5;$x++){
$pl = 5;
$Pass = pwt($pl);
echo"$Pass<br />";
}
?>
... gibt mir aber 5 mal das gleiche aus. Warum denn dies nun?
Gruß Rainer
echo $begrüßung;
... gibt mir aber 5 mal das gleiche aus. Warum denn dies nun?
srand(time());
Das Ergebnis von time() ändert sich nur alle Sekunden. Dein Script dürfte wenger Zeit brauchen, also bekommst du immer die gleiche Initialisierung des Zufallsgenerators.
echo "$verabschiedung $name";
Hallo,
mit microtime() geht es auch nicht. Was kann man sont noch versuchen?
Gruß Rainer
echo $begrüßung;
mit microtime() geht es auch nicht. Was kann man sont noch versuchen?
Handbuchseiten lesen. Zum einen, was microtime() für ein Ergebnis liefert und dann überlegen, was daraus wird, wenn es nach integer konvertiert wird, denn das will srand() haben. Zum anderen das was als Hinweis auf der srand()-Seite steht.
echo "$verabschiedung $name";
Handbuchseiten lesen.
war ich gerade dabei ;-)
srand((double)microtime()*1000000); war die Lösung.
Danke
Gruß Rainer
echo $begrüßung;
Handbuchseiten lesen.
war ich gerade dabei ;-)
srand((double)microtime()*1000000); war die Lösung.
Ich meinte eher den Hinweis:
Note: As of PHP 4.2.0, there is no need to seed the random number generator with srand() or mt_srand() as this is now done automatically.
echo "$verabschiedung $name";
Hallo,
srand(time());
EXTREM schlechte Idee. Das gleiche gilt für Konstrukte mit microtime(). Stefan Esser hat in seinem Blog dargelegt, warum manuelles Initialisieren des Zufallszahlgenerators eine extrem schlechte Idee ist (englischer Link).
Wenn Du den Zufallszahlgenerator dann auch noch mit einer bekannten oder zumindest extrem leicht zu erratenden Größe initialisierst (der aktuellen Zeit), dann führt das dazu, dass die Zahlen vorhersagbar sind. Wenn man den Zufallszahlgenerator nur dazu nutzt, um zum Beispiel auf der Startseite "zufällig" andere Artikel hervorzuheben, dann ist das noch in Ordnung. Wenn Du damit allerdings etwas sicherheitskritisches Programmieren willst (Dein Code sieht nach einem Passwortgenerator aus, das ist sicherheitskritisch), dann solltest Du auf *jeden* Fall die Finger von so etwas lassen.
Rufe einfach rand() auf, um Dir Zufallszahlen liefern zu lassen und kümmere Dich nicht um die Initialisierung desselben.
Viele Grüße,
Christian
Moin!
EXTREM schlechte Idee. Das gleiche gilt für Konstrukte mit microtime(). Stefan Esser hat in seinem Blog dargelegt, warum manuelles Initialisieren des Zufallszahlgenerators eine extrem schlechte Idee ist (englischer Link).
Wenn Du den Zufallszahlgenerator dann auch noch mit einer bekannten oder zumindest extrem leicht zu erratenden Größe initialisierst (der aktuellen Zeit), dann führt das dazu, dass die Zahlen vorhersagbar sind. Wenn man den Zufallszahlgenerator nur dazu nutzt, um zum Beispiel auf der Startseite "zufällig" andere Artikel hervorzuheben, dann ist das noch in Ordnung. Wenn Du damit allerdings etwas sicherheitskritisches Programmieren willst (Dein Code sieht nach einem Passwortgenerator aus, das ist sicherheitskritisch), dann solltest Du auf *jeden* Fall die Finger von so etwas lassen.
Ich möchte hervorheben, dass insbesondere der Abschnitt "The Art of Cross-Application Attacks" lesenswert ist. Das Initialisieren des Zuffi-Generators hat Auswirkungen auf den gesamten Server, nicht nur auf das einzelne Skript: Weil phpBB2 den Generator unsachgemäß initialisiert und danach auch noch Informationen über die generierten Zufallszahlen nach außen gelangen läßt, wird plötzlich Wordpress angreifbar, welches für sich allein genommen keine Initialisierung vornimmt und vernünftig arbeiten würde, wenn es neue Passworte generiert.
Aus den Kommentaren (Nr. 624 und 625) ist zu entnehmen, dass PHP 5.3 eine neue Zufallszahlenfunktion zur Verfügung stellen soll, die den Generator von OpenSSL nutzt, um qualitativ hochwertige Zufallszahlen zu erzeugen.
Die Diskussion auf der php.internals-Liste hat über den Fortschritt dieses Vorhabens aber noch keine wirklich gute Auskunft gegeben. Schließlich würden alle alten Applikationen davon profitieren, wenn die bisherigen Funktionen einfach besseren Zufall ausliefern würden, und das unselige srand() einfach nichts weiter tun würde.
- Sven Rautenberg