[php+mysql] Kurzer String max. 1x in der DB ?

Shamane

DB-Crasher
ID: 86026
L
24 Juli 2006
909
50
Hallo,
ich möchte gern ein Script bzw teil davon schreiben was mir einen String von maximal 10 Zeichen oder weniger ausgibt und diesen in der DB auf vorhandensein überprüft und falls der schon existiert soll er das script bzw. teil davon nochmal durchgehen um einen neuen String zu Generieren, solange das dieser String auf jedenfall nur einmal Existent in der Datenbank ist.

Kann mir einer einen Denkanstoß verpassen wie ich dies am besten Realisieren kann.
Ausgabe z.B: kjd9h7
oder
98j7d

Danke schonmal :)
 
Du definierst dir eine Zufallsfunktion die die Länge und die Vorkommenden Zeichen definiert.

Lässt diese laufen und prüfst dann per Abfrage ob exakt diese Kette schon in der entsprechenden Tabelle vorkommt.

Über die ganze Datenbank zu iterieren ist bei größeren Projekten nicht zu empfehlen (bei kleinen eigentlich auch nicht).

mysql_num_rows() gibt die bei SELECT die Anzahl der gefundenen Datensätze an, daraus kannst du locker eine while schleife bauen, die sich deiner Probleme annimmt.
 
Also mit einer normalen Schleife okay..

Nun sag mir bitte noch warum dies über die DB nicht empfehlenswert wäre?!?

Angenommen ich lasse einen Link eintragen zur seite xyz-domain.com
nun ist es derzeit so das eine fortlaufende ID eingetragen wird (auto)
dies soll auch weiterhin so sein, nur möchte ich mit der oben genannten methode verhindern, das irgendwer da die ID abwandelt und dann auf die seite XXX-domain.net kommt.

Das ist zwar auch mit der o.g. Methode möglich, jedoch muss man da schon Xmal rum probieren bis man irgendwann zum ergebnis kommt.

Ja und wie gesagt, soll nen zusatz eintrag in die Datenbank geschrieben werden "jhd773n" und statt die ID zu nehmen, nimmt er den string bei der ausgabe des links.
Ausgabe des links z.b.: domain.de/?target=jhd773n
 
Ich hab das so verstanden, dass du die komplette Datenbank nach dem String durchsuchen willst, davon wollte ich abraten.

Wenn du ne Tabelle "codes" hast mit
id | string

ist es natürlich kein Problem nach string=$string zu suchen ;)
 
Hihi, ja genau so ist es ..

Soll erst in einer Tabelle Checken obs vorhanden ist, und falls true dann soll er neuen string erstellen und erneut prüfen, und falls dann irgendwann false ist, wird der String eingetragen mit der zb. zugehörigen Domain oder was auch immer man drin haben will.
 
Einfacher:
UNIQUE-Index auf den String und einfach ohne Rücksicht eintragen. Scheitert die Operation auf der Datenbank, nochmal probieren.
PHP:
do {
  $code = generate_code();
  // $db->queryf("INSERT INTO ... $code;");
  $db->queryf("INSERT IGNORE INTO ... $code;");
} while(!$db->affected_rows());
Diese Variante ist allerdings nur in diesem Fall zu bevorzugen, weil der String kurz is. Bei längeren Strings würd ich auch den Index weglassen und von Hand selber gucken, ob es das Datum schon gibt.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Xot
Yep. Ein UNIQUE Index über die Spalte und INSERT versuchen ist die effektivste Methode.

Allerdings einfach so wiederholen wenn die Aktion scheitert kann gefährlich werden. Wenn der Grund des Scheiterns nämlich nicht "Wert schon vorhanden" ist, sondern z.B. "Verbindung zur Datenbank verloren" oder ähnliches, dann hat man sehr schnell eine Endlosschleife programmiert.
 
Wenn der Grund des Scheiterns nämlich nicht "Wert schon vorhanden" ist, sondern z.B. "Verbindung zur Datenbank verloren" oder ähnliches, dann hat man sehr schnell eine Endlosschleife programmiert.
Dann schmeißt die Datenbank-Klasse in MySQL::queryf() das Handtuch - zumindest bei mir.

Wer die normalen mysql_*-Funktionen nimmt, der läuft in die Endlosschleife. Zwar nicht gut programmiert, aber nicht wirklich tragisch, weil ohne DB geht eh nix mehr. Der Besucher wartet dann, weil der Server nicht mehr reagiert - das denkt er zumindest. Dann drückt er ESC+F5 und dann bricht das Script beim erstmaligen Verbinden mit einer Fehlermeldung ab - so der Programmierer das gemacht hat.

Nach einem mysql_query()-Aufruf sollte mal den Rückgabewert schon prüfen, ob es einen Fehler gab.
Is mir grade eingefallen, wenn man das so schreibt, wie ich oben, geht das eh schief. Das Schlüsselwort IGNORE muss rein, dass die Operation trotz doppeltem Index erfolgreich bleibt und man mit mysql_affected_rows() auf die Kollision prüfen kann.
 
Danke erstmal bishier...

Also derzeit hab ich noch nicht begonnen irgendwas zu Testen, da alles noch im meinem Kopf rum schwirt und da gibt es noch ungereimtheiten.

Weil... naja es werden Variablen und Dateien dabei Hochgeladen und irgendwie schnall ich noch nicht wie ich es anstellen kann diese Daten nicht noch X mal hochgeladen werden müssen, wenn der Eintrag fehl schlägt.

Also derzeit kusiert in meinem Kopf irgendwas mit Location() falls es fehlt schlägt, damit er die operation neu ausführt. Aber das würde ja zum einen den Verlust der Variablen bedeuten und dann nichts werden.

Also müsste ich Theroretisch eine function() schreiben welche die Prüfung des Strings macht und diese dann in die While() Schleife einbauen, oder seh ich das falsch?
 
Weil... naja es werden Variablen und Dateien dabei Hochgeladen und irgendwie schnall ich noch nicht wie ich es anstellen kann diese Daten nicht noch X mal hochgeladen werden müssen, wenn der Eintrag fehl schlägt.
Und? Doch wurscht. Der Upload ist bereits fertig, wenn du zum Zug kommst. Du musst nur die upgeloadeten Dateien entsprechend verarbeiten.
Also derzeit kusiert in meinem Kopf irgendwas mit Location() falls es fehlt schlägt, damit er die operation neu ausführt. Aber das würde ja zum einen den Verlust der Variablen bedeuten und dann nichts werden.
Bau kein' Scheiß ;) Location impliziert eine Weiterleitung. Du musst den Benutzer nicht weiterleiten, nur weil du zu dumm bist und einen doppelten String generierst. Der darf das alles nicht mitkriegen, also ist HTTP für dich an dieser Stelle tabu.
Also müsste ich Theroretisch eine function() schreiben welche die Prüfung des Strings macht und diese dann in die While() Schleife einbauen, oder seh ich das falsch?
Wenn du die zwei Zeilen in ne extra Funktion auslagern willst, dein Ding. Eine Funktion erleichtert dir nur das Programmieren. Theoretisch kannst du alles auch komplett ohne ein function-Konstrukt machen.

Was wie in welcher Funktion und mit welchen Parametern und Rückgabewerten in Funktionen liegt, musst du dir überlegen und - eigentlich bevor du die erste Scriptzeile schreibst - planen und wissen.