bei eintrag in mysql den index zurückgeben
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
baum
bekommen
bild
buchstabenfolge
code
dank
date
datenbank
datum
eigene identifikation
frage
meinung
nehmen
systemzeit
tabelle
tip
trick
unglaube
verbindung
verwenden
-
hallo!
also, ich bin gerade dabei, daten in eine datenbank via php packen zu lassen. das soll dann am ende so sein, daß mehrer nutzer sachen hochladen können und dann jedes hochgeladene element (bilder) genau identifiziert werden kann. das problem das sich mir dabei stellt ist vorerst ein fiktives - zwei nutzer laden im (unwahrscheinelichen) zeitgleichen moment ein bild hoch, das baum.jpg heißt. nun soll jedoch jeder nutzter nur von "seinem" baum irgendwelche sachen einstellen können.
damit das möglich ist, muß also jeder baum, sobald er in der datenbank eingetragen wird, mit seiner indexnummer wieder bei php ankommen.
damit scheidet die variante aus, daß ich erst die datei "baum" eintrage und dann die datenbank nach "baum" durchsuche um so an den index zu kommen.
was mir als einzige möglichkeit zur umgehung dieser verdoppelungs-gefahr einfällt wäre eine kombination aus "nutzername" + "systemzeit" statt des namens "baum" - aber bevor ich das umsetze wollte ich also fragen, ob ich mit php einen wert in die datenbank eintragen kann und als "return" sozusagen die indexnummer des gerade eingetragenen elementes bekommen kann. ich möchte jede zeitliche überschneidung von vornherein ausklammern, auch wenn das eventuell unnötig erscheint bzw ist
ja, also danke für einen tipp (nur ein link wo das steht würde mir auch reichen) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wieso arbeitest du nicht meinem "id"-Feld, dass sich automatisch hochzählt ?
Du trägst die Daten in die DB ein und holst dir mit mysql_insert_id() die id von den Daten die du eingetragen hast.
Dann kannst du als Namen sowas wie id.baum.jpg nehmen.
Grüße Christian -
also, so wie ich das jetzt nachgelesen habe verstehe ich das so, daß da der letzte eingetragene wert der datenbank genutzt wird. und eigentlich wollte ich das ja umgehen. also, wie gesagt, wenn A eine baum.jpg hochläd und B ebenfalls, dann kann es doch sein, das der baum von A eingetragen wird, dann der von B, dann liest mysql_insert_id() von A aus den letzten eingetragenen wert und plötzlich hat A den baum von B vorliegen.
wie gesagt, wenn dann ist das sicher sehr blöder zufall
hm, andererseits kann ich auch namen und zeit nehmen und so auf den index total verzichten *grübel*
Beitrag zuletzt geändert: 23.8.2009 0:58:44 von sonok -
Wenn das ganze aber "so gleichzeitig" stattfindet, dann hilft dir meiner Meinung nach die Systemzeit auch nichts.
Das wär noch eine Idee:
Wenn die Seite, auf der das Bild hochgeladen wird, erstellst du gleich, also noch bevor du das Bild "entgegennimmst" eine "neue Zeile" in der Datenbank und liest die ID aus.
Wenn der User dann die Datei hochläd übergibst du gleich die ID mit.
Jetzt könnte es natürlich wieder sein, dass 2 User zum gleichen Zeitpunkt die ID "beantragen" ... ;)
Wobei ich das für sehr unwarsch. halte.
------------
Komplett anderer Ansatz: Du generierst einfach eine zufällige Buchstabenfolge, die du dann als ID nimmst. (Bevor du die einträgst musst du nat. prüfen, ob sie schon existiert).
Notfalls hängst du die Systemzeit noch dran, an die Buchstabenfolge
So dürfte es zu keinen Überschneidungen kommen ;D -
dapizzafressa schrieb:
Wenn das ganze aber "so gleichzeitig" stattfindet, dann hilft dir meiner Meinung nach die Systemzeit auch nichts.
hm, dank login und einmaligen nutzernahmen ist die systemzeit wohl das sicherste, da kann sich ja gar nix überschneiden. naja, nehm ich erstmal das
aber wenn es doch sowas wie einen sofort-return gibt dann wäre ein kurzer verweis dahin hier recht nett, wenn jemand da noch was weiß ... -
Nimm mysql_insert_id, das liefert dir nämlich die letzte ID, die über diese Connection eingefügt wurde. Also auch wenn A und B annähernd gleichzeitig etwas eintragen, bekommen beide die richtige ID.
-
hm, weil eine connection auch ein einmlig vergebener wert ist? sowas wie eine eigene identifikation? (so fürs verständnis, nicht aus unglauben)
-
sonok schrieb:
hm, weil eine connection auch ein einmlig vergebener wert ist? sowas wie eine eigene identifikation? (so fürs verständnis, nicht aus unglauben)
Alle DBMS, die ich kenne (mysql, mssql, oracle, db2, ingres), liefern auf Anfrage ("select @@insertid", "select sys.lastid" oder wie auch immer) stets den letzten erzeugten Autowert der aktiven Verbindung zurück. Alles andere wäre ja Schwachsinn. Nimm als Beispiel eine ernst zu nehmende Datenbank, auf der Gleichzeitig 10000 Leute arbeiten und jede Sekund zig Statements auflaufen. Wäre die Rückgabe der Insert-ID nicht an die Verbindung gekoppelt, würde mal gar nichts mehr funktionieren.
Zu deiner Frage: Die php-Routine mysql_connect liefer dir eine Verbindung zurück, die man aber in der Regel ignoriert, weil man nur eine hat. An diese Verbindung ist nun mysql_insert_id gekoppelt. Du könntest sogar in einem php-Skript mehrere Verbindungen auf ein und dieselbe Datenbank haben und immer noch bekämst du die jeweils richtigen insert-ids zurück:
$con1 = mysql_connect (db, user, pw); $con2 = mysql_connect (db, user, pw); mysql_query ("insert into A (a) values (0);", $con1); mysql_query ("insert into B (b) values (1);", $con2); echo "Neue ID der Tabelle A ist " . mysql_insert_id ($con1); echo "Neue ID der Tabelle B ist " . mysql_insert_id ($con2);
EDIT: Komma vergessen
Beitrag zuletzt geändert: 23.8.2009 1:37:46 von census -
man kann auch einfach einen unix-timestamp verwenden. also z.b.
INSERT INTO `table` ( `id` , `timestamp` ) VALUES ('', NOW() );
NOW() ist der zeitpunk, auf die millisekunde genau, in dem der Datenbankzugriff erfolgt. das kann nicht bei 2 usern gleichzeitig passieren! und zusätzlich kannst du noch die id nehmen, die der primär-schlüssel sein muss und am besten automatisch eingefügt wird (deswegen ''). die kann auch nur einmal existieren.
edit:
Du kannst auch sowas machen:
<? $einmaliger_dateiname = md5(rand(0, 1000). (mktime(0, 0, 0, date("m") , date("d")+1, date("Y"))). $bildname. $username); ?>
ist auch zu hundert % einmalig und du hast immer eine zeichenlänge von 32
Da gibts viele tricks!
Beitrag zuletzt geändert: 23.8.2009 8:08:19 von dynamic-designs -
dynamic-designs schrieb:
Da gibts viele tricks!
Schon. Aber warum Tricks verwenden, wenn es mit Bordmitteln geht? Es bringt doch nichts wilde Workarounds zu nutzen, die unnötig sind, weil das DBMS selbst die gewünscht Funktion zur Verfügung stellt. Man steigt ja auch nicht durch's Fenster ins Auto ein, wenn die Tür funktioniert. -
ja, also ich werde die bilder nach der zeit benennen, da ich diese im weiteren programmverlauf sowieso verwenden möchte und eine solche identifizierung für mein vorhaben auch auf hinblick auf die filtermöglichkeiten klar von vorteil ist
also danke für die tipps, das thema kann eigentlich geschlossen werden -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage