Wenn ID in Datenbank vorhanden ist, neue generieren
Klausi
- php
0 minicrispie0 Klausi
0 Tom0 Encoder0 Tom
0 indischer code
bleicher
Hallo,
ich habe folgenden Code:
function test(){
$zahl=1;
while(mysql_num_rows(mysql_query("SELECT ID FROM tabelle WHERE ID='".$zahl++."' LIMIT 1"))==1){
return true;
}
return $zahl;
}
Nach meinen begrenzten PHP-Kenntnissen müsste die Zahl solange erhöht werden, bis sie nicht mehr in der Datenbank gefunden wird. Wird sie allerdings nicht.
Sieht jemand einen Fehler?
Hallo,
Nach meinen begrenzten PHP-Kenntnissen müsste die Zahl solange erhöht werden, bis sie nicht mehr in der Datenbank gefunden wird. Wird sie allerdings nicht.
Sieht jemand einen Fehler?
Ich denke schon. Dient die ID dazu, Datensätze eindeutig zu kennzeichnen?
Dann schlägst du den falschen Weg ein.
Dazu musst du ein Integerfeld in der Tabelle einrichten, Primärschlüssel und auto_increment aktivieren. Dann erhöht sich die ID automatisch und du musst sie nicht mehr berücksichtigen.
MfG. Christoph Ludwig
Hallo,
nein, das ist eine zusätzliche ID. Diese muss vom Script erstellt werden.
Hello,
ich habe folgenden Code:
Ja, das ist schlimm!
function test(){
$zahl=1;
while(mysql_num_rows(mysql_query("SELECT ID FROM tabelle WHERE ID='".$zahl++."' LIMIT 1"))==1){
return true;
}
return $zahl;
}
>
> Nach meinen begrenzten PHP-Kenntnissen müsste die Zahl solange erhöht werden, bis sie nicht mehr in der Datenbank gefunden wird. Wird sie allerdings nicht.
> Sieht jemand einen Fehler?
mehrere!
Aber nur zu Deiner Kernfrage meine Antwort:
mysql\_query() ist eine Funktion.
Du übergibst dieser Funktion einen Wert (den String) als "Call by Value"-Argument. Dieser Wert wird als Kopie übergeben, kann daher innerhalb der Funktion beliebig verändert werden. Die Veränderungen an diesem Wert \_müssen\_ aber außerhalb der Funktion ohne Wirkung bleiben!
Abhilfe:
Wähle die expliite und ausführliche Schreibweise.
Verzichte auf das Schachteln von Funktionen!
Das mag vielleicht Deinem Ego schaden, da Du von den Lesern Deines Codes für simpel gehalten wirst (passiert mir hier regelmäßig), nützt aber der Kontrollierbarkeit und damit der Funktionstüchtigkeit deines Codes!
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Hallo,
ich habe den Code jetzt mehrfach umgestellt, immer bleibt die ID bei 1 stehen.
Ich komme nicht wirklich weiter :-(
Hello,
ich habe den Code jetzt mehrfach umgestellt, immer bleibt die ID bei 1 stehen.
Ich komme nicht wirklich weiter :-(
Z E I G E N !
Zeig bitte mal deinen Code in expliziter Schreibweise.
function test($zahl)
{
do
{
# und hier den Rest einbauen
}
while($found == 1);
return $zahl;
}
http://www.php.net/manual/en/control-structures.do.while.php
Dass ein Arbeiten mit der Datenbank in einer Schleife nicht sinnvoll ist, hat Du ja schon gehört. Insbesondere Dein Anliegen ist nicht ohne weitere Maßnahmen umzusetzen. Du baust Dir einen TOCTOU-Fehler. Also darfst Du mit dem Ergebnis der Funktion später sowieso nichts mehr anfangen, außer es zu uninformativen Zwecken auszugeben oder im /dev/null zu entsorgen.
http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Ok, es geht um folgendes:
Es werden Benutzerkonten mit Zufallspasswörtern erstellt.
Es darf allerdings jedes Passwort nur einmal geben.
Die Sache mit dem $zahl++ habe ich nur geschrieben, da ich wissen wollte wie man generell mit sowas umgeht und ihr euch nicht stundenlang in den Code reinfressen solltet.
Der eigentliche Code steht hier.
Hi,
Es darf allerdings jedes Passwort nur einmal geben.
PHP ist von sich aus in der Lage, Unique-IDs zu erstellen. Nutze dies.
Cheatah
Hello,
PHP ist von sich aus in der Lage, Unique-IDs zu erstellen. Nutze dies.
Hast Du aktuell untersucht, wie leicht so ein Passwort dann zu erraten ist?
MMn lässt sich über die Erstellungszeit des Passwortes eine Beschränkung auf eine wesentlich kleinere zu untersuchende Teilmenge durchführen?
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
PHP ist von sich aus in der Lage, Unique-IDs zu erstellen. Nutze dies.
Hast Du aktuell untersucht, wie leicht so ein Passwort dann zu erraten ist?
nein, denn das ist unmöglich, weil ich nicht vorhersagen kann, auf welche Weise der OP die Unique-ID nutzen wird, um daraus ein Passwort zu generieren.
Cheatah
Hello,
PHP ist von sich aus in der Lage, Unique-IDs zu erstellen. Nutze dies.
Hast Du aktuell untersucht, wie leicht so ein Passwort dann zu erraten ist?
nein, denn das ist unmöglich, weil ich nicht vorhersagen kann, auf welche Weise der OP die Unique-ID nutzen wird, um daraus ein Passwort zu generieren.
Und wie soll er sie dMn nutzen, um daraus ein Passwort zu generieren?
Muss man Dir wieder jeder Wkisky einzeln aus der Flasche leiern? :-)
Bis zum jetztigen Stand ist Dein Rat eher kontraproduktiv!
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hello,
Es werden Benutzerkonten mit Zufallspasswörtern erstellt.
Es darf allerdings jedes Passwort nur einmal geben.Die Sache mit dem $zahl++ habe ich nur geschrieben, da ich wissen wollte wie man generell mit sowas umgeht und ihr euch nicht stundenlang in den Code reinfressen solltet.
Der eigentliche Code steht hier.
Der Code ist nur ansatzweise gut.
Wie man Zufallspasswörter erzeugen kann und dafür sorgt, dass diese dann auch nur einmal vorkommen (was ich jetzt nicht weiter diskutieren will), ist hier im Forum besprochen worden.
Auch, welche Fehler bei unterschiedlichen Systemen da noch auftreten können.
http://forum.de.selfhtml.org/archiv/2009/6/t187722/#m1248234
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
Es werden Benutzerkonten mit Zufallspasswörtern erstellt.
Es darf allerdings jedes Passwort nur einmal geben.
Die Sache mit dem $zahl++ habe ich nur geschrieben, da ich wissen wollte wie man generell mit sowas umgeht und ihr euch nicht stundenlang in den Code reinfressen solltet.
generell geht es mit einem UNIQUE INDEX für die entsprechende Spalte an, wenn man gewährleisten will, dass Werte in dieser Spalte eindeutig sein sollen.
Meiner Meinung nach ist es *keine* gute Idee, dass ein Passwort nur einmal vorkommen soll. Warum? Es reduzierte die Sicherheit, wenn Passwörter eindeutig sein müssten.
Freundliche Grüße
Vinzenz
Hi!
generell geht es mit einem UNIQUE INDEX für die entsprechende Spalte an, wenn man gewährleisten will, dass Werte in dieser Spalte eindeutig sein sollen.
Ergänzend dazu sollte die Spalte für das Passwort einen passenden Typ aufweisen. Wenn das Passwort mit einer eine Bytefolge erzeugenden Funktion erzeugt/verschlüsselt wird - beispielsweise mit den AES-Funktionen - dann ist ein reiner Binärtyp notwendig. MySQL kennt dafür VARBINARY. Wird das Passwort im Klartext (Betonung auf Text) abgelegt, dann ist eine VARCHAR-Spalte mit einer auf _bin endenden Kollation angebracht. Der vordere Teil, die Kodierung, ist je nach generell verwendeter Kodierung zu wählen. Das ergibt dann utf8_bin oder latin1_bin. Der Grund für eine _bin-Kollation ist, dass bei Passwörtern Groß- und Kleinschreibung sowie Umlaute und ähnliche Sonderbuchstaben getrennt berücksichtigt werden müssen, was in den anderen Kollationen ja nicht der Fall ist.
Lo!
Moin!
Ok, es geht um folgendes:
Es werden Benutzerkonten mit Zufallspasswörtern erstellt.
Es darf allerdings jedes Passwort nur einmal geben.Die Sache mit dem $zahl++ habe ich nur geschrieben, da ich wissen wollte wie man generell mit sowas umgeht und ihr euch nicht stundenlang in den Code reinfressen solltet.
Der eigentliche Code steht hier.
Das Tutorial ist schlecht, weil wichtige Aspekte der Zufallszahlengenerierung nicht beachtet werden.
Siehe dazu Stefan Essers Blog: http://www.suspekt.org/2008/08/17/mt_srand-and-not-so-random-numbers/
- Sven Rautenberg
Hi!
Du übergibst dieser Funktion einen Wert (den String) als "Call by Value"-Argument. Dieser Wert wird als Kopie übergeben, kann daher innerhalb der Funktion beliebig verändert werden. Die Veränderungen an diesem Wert _müssen_ aber außerhalb der Funktion ohne Wirkung bleiben!
Und was hat das nun konkret mit dem Problem zu tun? Die von dir aufgestellte "Forderung" wird ja durch die Kopie erfüllt.
Abhilfe:
Wähle die expliite und ausführliche Schreibweise.
Verzichte auf das Schachteln von Funktionen!
Das ist keine Abhilfe, weil diesbezügliches gar kein Problem vorliegt.
Unabhängig davon ist die explizite Schreibweise aber schon deshalb empfehlenswert, weil nur so auf die unterschiedlichen Rückgabewerte im Fehler- und in Gutfall reagiert werden kann und sollte.
Lo!
Dass noch keinem sowas auffällt...
Du schreibst, solange eine ID gefunden wird, soll true zurückgegeben werden. Was soll das bewirken?
Es wird genau einmal true zurückgegeben, danach ist nämlich die Funktion beendet und es gibt kein while mehr.
Außerdem ists keine gute Idee, einmal einen bool und dann wieder eine Zahl zurückzugeben.
Und eine Schleife über alle Datensätze ist an sich auch keine gute Idee. Such dir doch die höchste ID mit MAX und erhöhe das dann nochmal um eins und gut.
Hello,
Und eine Schleife über alle Datensätze ist an sich auch keine gute Idee.
Stimmt.
Such dir doch die höchste ID mit MAX und erhöhe das dann nochmal um eins und gut.
Stimmt nur bedingt. Kommt also darauf an, wie man das Ergebnis ermittelt und wann und wie man es weiterverarbeitet.
siehe auch Du unter TOCTOU: http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Grüße,
function test(){
$zahl=1;
while(mysql_num_rows(mysql_query("SELECT ID FROM tabelle WHERE ID='".$zahl++."' LIMIT 1"))==1){
return true;
}
return $zahl;
}
das ist wahrlich "indischer code" - es scheint den zweck siener verwendung mit allen mitteln verhemlichen zu wollen.
was genau willst du denn erreichen? anzahl der ersten einträge mit id's ohne unterbrechungen oder was?
MFG
bleicher
--
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_-
![](http://img296.imageshack.us/img296/9641/minibannerso7.jpg)
[FirefoxMyth](http://www.firefoxmyths.com)