php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.01.2012, 19:40  
Benutzer
 
Registriert seit: 07.05.2010
Beiträge: 62
PHP-Kenntnisse:
Anfänger
Verino ist zur Zeit noch ein unbeschriebenes Blatt
Standard id vor insert auslesen

Hey leute,

kurze frage, habe eine vor etwas in 2 Datenbanken zu schreiben, wobei nach dem eintrag in die erste bereits etwas ausglesen werden muss, dass ich in die 2te übernehmen.

PHP-Code:
$sql '
    INSERT INTO 
                `login`
                (`username`, `email`, `passwort`, `confirmcode`, `ip`)
    VALUES
                (?, ?, ?, ?, ?)'
;
                                    
                                    
                                    
mysql_query($sql);
                                    
$in_id mysql_insert_id();
$stmt $db->prepare($sql);
$stmt->bind_param('ssssi'$username$email$passwort$confirm_code$user_ip);                                
                            
    if(!
$stmt->execute()) {
        if(
strpos($db->error$username) !== false) {
            
$error_msg "Der Username ".htmlspecialchars($username)." ist bereits Regestriert!";
        }
        
        if(
strpos($db->error$email) !== false) {
            
$error_msg "Die Emailadresse  ".htmlspecialchars($email)." ist bereits Regestriert!";
        }

        return;                                
                }
    
$stmt->close(); 
So das Problem ist das $in_id = mysql_insert_id(); immer den Wert 0 erhält was eigentlich die Id des letzten eintrags sein sollte.

lg
Verino ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.01.2012, 19:44  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Was wohl daran liegt, dass der MySQL-Query gar nicht erst ausgeführt wird. Du versuchst da ein Prepared-Statement mit mysql_query() auszuführen, was natürlich nicht klappt (btw. welche Glaskugel sollte diese Funktion eigentlich nehmen, um zu wissen, welche Daten du anstelle der Fragezeichen einfügen willst?).
mysql_errror() hätte dir hier auch weitergeholfen.

Die Verwendung von mysql_insert_id() ist übrigens nicht transaktionssicher. Es kann also zu falschen Ergebnissen im Falle einer Race-Condition kommen.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 24.01.2012, 19:52  
Benutzer
 
Registriert seit: 07.05.2010
Beiträge: 62
PHP-Kenntnisse:
Anfänger
Verino ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Die Verwendung von mysql_insert_id() ist übrigens nicht transaktionssicher. Es kann also zu falschen Ergebnissen im Falle einer Race-Condition kommen
Ist mir generell bewusst wird jedoch hier zu keinem Problem führen. Grund ist das ich die id auslese und sie an andererstelle als nutzer id verwende was dann unabhängig von der eintrag ID sein wird und kann von daher in kauf genommen werden zudem wird sie im selben zug eingetragen.

Zitat:
welche Glaskugel sollte diese Funktion eigentlich nehmen, um zu wissen, welche Daten du anstelle der Fragezeichen einfügen willst?
Interessanter ansatz, jedenfalls werden die Daten gespeichert und auch an richtiger stelle.

Einziger Fehler ist das auslesen der letzten insert_id.
Verino ist offline   Mit Zitat antworten
Alt 24.01.2012, 19:54  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

eine IP ist auch kein INT "127.0.0.1" achso, wieso machst du da ein mix aus mysql_* funktionen und PDO?
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen

Geändert von BlackScorp (24.01.2012 um 19:58 Uhr).
BlackScorp ist offline   Mit Zitat antworten
Alt 24.01.2012, 19:55  
Benutzer
 
Registriert seit: 07.05.2010
Beiträge: 62
PHP-Kenntnisse:
Anfänger
Verino ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von BlackScorp Beitrag anzeigen
eine IP ist auch kein INT "127.0.0.1"
stimmt, schon danke für den hinweis.

Problem besteht denoch weiterhin.

lg

änderung, die ip wird umgewandelt an anderer stelle in $user_ip = ip2long($_SERVER['REMOTE_ADDR']); demnach ist sie wieder ein INT

Geändert von Verino (24.01.2012 um 19:56 Uhr). Grund: ab änderung
Verino ist offline   Mit Zitat antworten
Alt 24.01.2012, 19:56  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Zitat:
Interessanter ansatz, jedenfalls werden die Daten gespeichert und auch an richtiger stelle.
Aber nicht von mysql_query(), sondern von $stmt->execute() und mysql_insert_id() hängt nun einmal von mysql_query() ab. Wenn du die zuletzt eingefügte ID wissen willst, dann musst du die last_insert_id-Methode bzw. -Eigenschaft der jeweils verwendeten MySQL-Schnittstelle (mysqli, PDO etc.) verwenden oder manuell einen Query mit der MySQL-Funktion LAST_INSERT_ID() absenden.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 24.01.2012, 20:08  
hts
Erfahrener Benutzer
 
Registriert seit: 07.09.2010
Beiträge: 722
PHP-Kenntnisse:
Fortgeschritten
hts befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Manko10 Beitrag anzeigen
Die Verwendung von mysql_insert_id() ist übrigens nicht transaktionssicher. Es kann also zu falschen Ergebnissen im Falle einer Race-Condition kommen.
Wo hast du denn das her?
hts ist offline   Mit Zitat antworten
Alt 24.01.2012, 20:14  
Benutzer
 
Registriert seit: 07.05.2010
Beiträge: 62
PHP-Kenntnisse:
Anfänger
Verino ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Manko10 Beitrag anzeigen
Aber nicht von mysql_query(), sondern von $stmt->execute() und mysql_insert_id() hängt nun einmal von mysql_query() ab. Wenn du die zuletzt eingefügte ID wissen willst, dann musst du die last_insert_id-Methode bzw. -Eigenschaft der jeweils verwendeten MySQL-Schnittstelle (mysqli, PDO etc.) verwenden oder manuell einen Query mit der MySQL-Funktion LAST_INSERT_ID() absenden.
Ok habe denke ich verstanden was du meinst, habe nun folgenden Lösungsansatz:

PHP-Code:
$stmt $db->prepare($sql);
$stmt->bind_param('ssssiss'$username$email$passwort$confirm_code$user_ip$sicherheitsfrage$antwort);                                
$last_id mysql_fetch_rowmysql_query"SELECT LAST_INSERT_ID()"));    
echo 
$last_id
ist nur der Ausschnitt vom script. Liefert mir jedoch den Wert array zurück, könntest du mir evt auf die sprünge helfen wie ich es schreiben muss?

lg
Verino ist offline   Mit Zitat antworten
Alt 24.01.2012, 20:14  
Supermoderator HD
 
Benutzerbild von Manko10
 
Registriert seit: 16.03.2008
Beiträge: 8.706
PHP-Kenntnisse:
Fortgeschritten
Manko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende ZukunftManko10 hat eine strahlende Zukunft
Standard

Okay, im Falle von mysql_insert_id() scheint es wirklich keine Probleme mit Race-Conditions zu geben. Aus den Kommentaren der Doku:
Zitat:
"The last ID that was generated is maintained in the server on a per-connection basis. This means the value the function returns to a given client is the most recent AUTO_INCREMENT value generated by that client. The value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that you can retrieve your own ID without concern for the activity of other clients, and without the need for locks or transactions."
Bin mir jetzt aber nicht sicher, ob das für das manuelle Ausführen der MySQL-Funktion LAST_INSERT_ID() auch gilt.

Zitat:
ist nur der Ausschnitt vom script. Liefert mir jedoch den Wert array zurück, könntest du mir evt auf die sprünge helfen wie ich es schreiben muss?
Dein Code-Schnipsel ist ehrlich gesagt ziemlich blödsinnig. Warum mischst du dauernd zwei verschiedene MySQL-Schnittstellen?

EDIT:
Das Zitat scheint aus dem MySQL-Manual zu kommen. Von daher ist LAST_INSERT_ID() auch in dieser Hinsicht transaktionssicher (wäre sonst ohne die Nutzung von Transaktionen ziemlich sinnlos).
So, wie der TE das hier versucht (mit zwei verschiedenen Verbindungen über zwei verschiedene Schnittstellen) kann das aber auch so nichts werden.
__________________
Refining Linux Advent Calendar series “24 Outstanding ZSH Gems
Manko10 ist offline   Mit Zitat antworten
Alt 24.01.2012, 20:24  
Benutzer
 
Registriert seit: 07.05.2010
Beiträge: 62
PHP-Kenntnisse:
Anfänger
Verino ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Weil ich eigentlich von PDO absehe jedoch es nicht auf die Reihe bekomme die db fehler sonst richtig auszuwerten wie zB der bereitsvorhandene eintrag.

Bin noch nicht so erfahren das ich alles hinbekomme lerne erst seid kurzem, so kommt dies zu stande.

lg
Verino ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Cookie setzen und auslesen Rutor PHP Einsteiger 8 28.01.2011 08:55
[Erledigt] preparedStatement auslesen funktioniert nicht ?! Raidri PHP Tipps 2009 11 02.11.2009 09:21
[Erledigt] Anzahl der Zeilen auslesen ( MySQL ) errox Datenbanken 13 18.02.2009 16:07
Ordner auslesen und während des auslesen sortieren Dooki PHP Tipps 2008 6 14.05.2008 17:50
Vom Browser verschickte Daten auslesen und anzeigen? andy32 PHP Tipps 2008 3 22.08.2007 18:33
[Erledigt] Datenbank auslesen mit register_globals off PHP Tipps 2007 14 03.01.2007 17:12
[Erledigt] gelöst: Tabelle auslesen -> Gleiche Einträge nur 1 Mal Datenbanken 3 31.03.2006 01:44
[Erledigt] bestimmte ID's auslesen als array PHP Tipps 2007 2 31.10.2005 20:23
Daten eintragen und auslesen Rettungsdackel Datenbanken 0 14.09.2005 16:29
[Erledigt] Daten aus einer Datenbank auslesen Datenbanken 2 04.09.2005 19:13
Daten aus Pw-Geschütztem bereich auslesen PHP-Fortgeschrittene 2 26.08.2005 15:27
auslesen und nochmals auslesen?! $$$ ThiKool $$$ PHP Tipps 2005 23 10.03.2005 19:43
[Erledigt] Auslesen von Text incl. " aus Textfeld PHP Tipps 2007 4 04.01.2005 13:30
[Erledigt] Daten von anderer Homepage auslesen PHP Tipps 2004-2 5 02.12.2004 18:49


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:37 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum