PHP do-while Schleife: prüfen ob wert in datenbank ist

Sarius87

Banned
Registriert
Mai 2016
Beiträge
888
PHP:
$Chars='12345';
do {
	$id.=strtoupper($Chars);
	$tmp=str_shuffle($id);
	$id=substr($tmp,0,1);
	$id=str_shuffle($id);

	$statement=$pdo->prepare("SELECT * FROM users WHERE id=:id");
	$result=$statement->execute(array('id' => $id));
	$ids=$statement->fetch();}
while($ids!==false);

habe diese do-while schleife, doch irgendwie geht das nicht richtig. ich will eine neue id erstellen in einer Datenbank aber vorher soll mit der schleife überprüft werden ob diese ID noch frei ist, so lange wird halt diese zufallsgenierung ausgeführt, so der plan, doch damit trägt er die IDs ein obwohl sie schon existieren. was ist da falsch ? wie muss das richtig sein ?
 
Zuletzt bearbeitet:
Unabhängig davon, dass der Code und auch das Vorgehen total Banane ist, soll die Abbruchbedingung natürlich erreicht sein, wenn deine Datenbankabfrage kein Ergebnis liefert. Du prüfst auf das genaue Gegenteil.
 
Der richtige Weg wäre ein UNIQUE index auf ID, und dann so lange INSERT machen, bis es klappt. (Der INSERT schlägt dann fehl, wenn die ID schon vergeben ist). Vorteil: Das ist atomar, also kann kein anderer Prozess zwischendurch genau die ID erstellen, die gerade als frei zurückkam.

​Warum dein Code nicht tut: Laut http://php.net/manual/de/pdo.prepare.php sollte der Index :id lauten, und nicht id (Z. 9).

​EDIT: Der richtige Weg wäre die ID-Erstellung mit GUIDs o.Ä., da ist eine Kollision nahezu ausgeschlossen, oder falls es old-school sein soll: INTEGER PRIMARY KEY AUTOINCREMENT (oder so), dann kannste mit lastInsertId die ID bekommen und du musst gar nicht mehr durchprobieren.
 
Zuletzt bearbeitet:
AUTOINCREMENT -> Lass die Datenbank eindeutige IDs vergeben!

Wenn es einen zwingenden Grund für eigene IDs gibt:
SELECT EXISTS(SELECT * FROM foo WHERE bar=baz)

Abfragen ob es Einträge schon gibt.
 
Außerdem wäre es schneller, wenn du das Statement, welches du "preparest" nur einmal vor Beginn der Schleife erzeugst und in jedem Durchlauf nur die Parameter von execute änderst.

Also davon abgesehen, dass du primär auf die Ratschläge der anderen hören solltest.
 
Man sollte generell vermeiden, eine Datenbank innerhalb einer Schleife abzufragen. In der Regel ist ist die Anbindung zur Datenbank ein Flaschenhals in Bezug auf die Performance einer Anwendung.

Falls man aus irgend einem Grund nicht die Möglichkeit hat, die Datenbank auf AUTOINCREMENT anzupassen, dann wäre es immer noch besser die höchste vorhandene ID abzufragen und die neue ID entsprechend zu setzen.
 
Zurück
Oben