Ankündigung

Einklappen
Keine Ankündigung bisher.

prepared statement:kann fehler nicht finden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • prepared statement:kann fehler nicht finden

    hallo,ich versuche gerade verzweifelt eine abfrage mit mysqli und php hinzubekommen.mein aktueller stand ist dieser:
    PHP-Code:
    $sql_pre="IF NOT EXISTS"
                          
    ." ( "
                          
    " SELECT 1 FROM account "
                          
    " WHERE 'profilname' = ? "
                          
    " OR    'email' = ? "
                          
    " ) "
                          
    " BEGIN "
                          
    " INSERT account (user_typ, "
                          
    " profilname, email, password, ip_adress, aktiv) "
                          
    " VALUES (?,?,?,?,?,?)"
                          
    " END";
                  
                  
    $sql_statement->prepare($sql_pre);
                  
    $sql_statement->bind_param('ssssssss',$profilname,$email,$typ,$profilname,$email,$pwd,$client_ip,$aktiv); 
    Es wird folgender Fehler von php ausgegeben:
    mysqli_stmt::bind_param(): invalid object or resource mysqli_stmt
    und außerdem sagt mysql ,dass ich einen syntaxfehler habe
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS ( SELECT 1 FROM account WHERE 'profilname' = ? OR 'email' = ' at line 1

    eine einfache abfrage mit select * from account where x=y funktioniert,deshalb muss der fehler in der syntax liegen.
    ich habe aber jetzt schon stundenlang rumprobiert und kann einfach keinen fehler finden


  • #2
    OT: Tu dir einen gefallen und hör auf mit diesem ein-string-pro-zeile-Zeug. Packe alles in einen großen mehrzeiligen String.

    Benutze PDO und die NamedParameters
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      Mysql != Mssql. Den Query versteht Mysql nicht...

      Kommentar


      • #4
        was kann dieses s***** mysql überhaupt???? arrrgggggggggggggg

        Kommentar


        • #5
          On duplicate key update
          Standards - Best Practices - AwesomePHP - Guideline für WebApps

          Kommentar


          • #6
            was kann dieses s***** mysql überhaupt???? arrrgggggggggggggg
            Mehr als Du. Arrrrrrrghhh!
            --

            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


            --

            Kommentar


            • #7
              Zitat von easyAnfaenger26 Beitrag anzeigen
              was kann dieses s***** mysql überhaupt????
              Das findest du da http://dev.mysql.com/doc/

              Kommentar


              • #8
                mysql ist webscale. Aber nicht so sehr wie mongodb
                Standards - Best Practices - AwesomePHP - Guideline für WebApps

                Kommentar


                • #9
                  tut mir leid,aber sowas bringt einen schon zur verzweiflung,die abfrage ist ja echt keine raketenwissenschaft...
                  ich versteh eh nicht warum mysql den auto_increment wert automatisch erhöht auch wenn die abfrage fehl schlägt, was ist wenn ich das nicht will und ich es nur woanders speichern oder ignorieren will?
                  mysql funktioniert einfach nicht wie es soll

                  Kommentar


                  • #10
                    vielleicht fängst du wirklich erstmal damit an, die groben Syntax-Fehler zu bekämpfen....

                    Code:
                    SELECT 1 FROM account WHERE 'profilname' = ?  OR 'email' = ?
                    Wörter in Single_Quotes deutet der SQL-Parser als Daten - ein prepared Statement packt dann in die ? -Parameter auch noch Daten .. das ist bestimmt nicht, was du wolltest

                    Spaltennamen brauchen keine Single-Quotes

                    Wie oben geschrieben brauchst du für MySQL nur den Teil nach "BEGIN" - Wenn du sicher gehen willst, dass Profilname und Email-Adresse einmalig vorkommen, solltest du den Select getrennt abschicken und auswerten, bevor du den Insert machst. Der weiter oben empfohlene "on duplicate key" -Weg benötigt zum Beispiel dass der Profilname der primäre Schlüssel dieser Tabelle wird.

                    PS das der auto-increment erhöht wird, sollte dich nicht kümmern, der sorgt ja nur dafür , dass sich 2 Einträge mindestens in diesem Wert unterscheiden. Das Problem liegt darin, dass der Insert zuerst "angeschoben" wird - damit wird auch der auto_increment erhöht, und dann in einem zweiten Schritt festgestellt wird, dass der Datensatz gar nicht erzeugt werden darf - aber in diesem Schritt wird der auto_increment nicht verringert, um die referentielle Integrität der Daten nicht zu gefährden
                    "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                    Kommentar


                    • #11
                      Eagle, nein.

                      Der eingangs gepostete Code sieht an sich ja einfach und nachvollziehbar aus. Ist er aber auch wirklich concurrency sicher? Ist in 99% der Fälle sicher ein rein theoretisches Problem, aber man sollte das zumindest mal erwähnt haben...
                      Das Beispiel oben erfordert, dass profilname und email jeweils ein non-nullable unique-key bekommen (keinen primary key).
                      Danach kann man geschmeidig mit ON DUPLICATE KEY UPDATE r-byten.
                      Bevor ich es vergesse: Auch ein ON DUPLICATE KEY UPDATE kann immer den PK des betreffenden Datensatz zurückgeben. Muss man aber explizit angeben. Das geht aber nur mit einem Datensatz.
                      Standards - Best Practices - AwesomePHP - Guideline für WebApps

                      Kommentar


                      • #12
                        hat mit on duplicate key update id=id nicht funktioniert,weil sich auto_increment trotzdem erhöht hat.(profilname und email waren von anfang an unique)
                        Ich habe jetzt doch zwei abfragen verwendet und die erste mit PHP ausgewertet,sodass das INSERT nicht mehr ausgeführt wird wenn es doppelte Einträge gibt.
                        scheint wohl so immer besser zu sein:

                        MYSQL ABFRAGE -> PHP -> MYSQL ABFRAGE -> PHP -> MYSQL ABFRAGE....-> fertig

                        statt:

                        RIESEN MYSQL ABFRAGE -> PHP -> fertig

                        Kommentar


                        • #13
                          PHP-Code:
                          INSERT INTO
                              table
                              
                          (idabcdefghij)
                              
                          SELECT
                                  id
                          abcdefghij
                              FROM
                                  sometable st
                          ON DUPLICATE KEY UPDATE
                              id 
                          LAST_INSERT_ID(id),
                              
                          VALUES(a),
                              
                          NOW(),
                              
                          1,
                              
                          CONCAT(e'-'f); 
                          AUTOINC-Key wird dabei nicht inkrementiert
                          Standards - Best Practices - AwesomePHP - Guideline für WebApps

                          Kommentar


                          • #14
                            scheint wohl so immer besser zu sein:
                            Nö. Zwischen Select und Insert passt immer noch eine Konkurrenzsituation.
                            hat mit on duplicate key update id=id nicht funktioniert,weil sich auto_increment trotzdem erhöht hat.
                            Wie schon oben gesagt: Who cares?
                            --

                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                            --

                            Kommentar


                            • #15
                              woher stammt eigentlich diese geradezu paranoide Angst vor dem auto_increment bzw dass sich dieser erhöht ?
                              Der Auto-increment ist kein Ordnungskriterium, er soll nur dafür sorgen, dass sich 2 ansonsten gleiche Datensätze in mindestens einem Punkt unterscheiden, sonst wären die beiden Datensätze ja redundant
                              "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

                              Kommentar

                              Lädt...
                              X