Ankündigung

Einklappen
Keine Ankündigung bisher.

MySql Concat, prepared statements und Anführungszeichen

Einklappen

Neue Werbung 2019

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

  • MySql Concat, prepared statements und Anführungszeichen

    Hallo zusammen,

    habe folgendes Problem.
    Ich möchte, wenn der User sich ein neues Paket kauft, den alten Wert in einer anderen Spalte speichern.
    Wenn ich folgenden Befehl per phpmyadmin ausführe funktioniert es einwandfrei
    Code:
    UPDATE user SET expiredate_old = CONCAT(expiredate_old,', ',expiredate), expiredate = DATE_ADD(expiredate, INTERVAL 5 MINUTE) WHERE username="username"
    , wenn ich es jedoch per PHP MySqlI mit prepared statements ausführen lasse
    PHP-Code:
    UPDATE user SET expiredate_old CONCAT(expiredate_old,', ',expiredate), expiredate DATE_ADD(expiredateINTERVAL " . $minutes . " MINUTEWHERE username=?, array("username"
    kommt folgende Fehlermeldung
    Code:
    "PHP message: PHP Fatal error:  Problem preparing query (UPDATE user SET expiredate_old = CONCAT(expiredate_old,\', \',,expiredate), expiredate = DATE_ADD(expiredate, INTERVAL 13306 MINUTE) WHERE username=?) 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 '\', \',expiredate), expiredate = DATE_ADD(expiredate, INTERVAL 5 MIN' at line 1 in .....
    Dank der Prepared Statements und mysqli_real_escape_string, sind datenbankattacken ja sogut wie nicht möglich, da unter anderem alles escaped wird.
    Nun möchte ich aber das die Werte in expiredate_old durch ein ", " oder sonst irgendein Zeichen voneinander getrennt bleiben.

    Wieso funktioniert der Befehl per PHP mysqli nicht? Bin da grad echt ratlos und finde dazu auch nichts mit google oder sonst wo. Ich bin mir sicher das es was mit den Anführungsstrichen zu tun hat, aber weiß nicht was ich dagegen machen kann...

    Gruß
    prophet


  • #2
    Zitat von prophet Beitrag anzeigen
    Dank der Prepared Statements und mysqli_real_escape_string, sind datenbankattacken ja sogut wie nicht möglich, da unter anderem alles escaped wird.
    Du solltest vieleicht die Query nicht escapen...
    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      Daran hab ich auch schon gedacht, nur da ich eine Klasse geschrieben habe, die alles automatisch macht, hatte ich gehofft, dass es evt. noch eine andere Möglichkeit gibt

      Kommentar


      • #4
        Zitat von prophet Beitrag anzeigen
        Daran hab ich auch schon gedacht, nur da ich eine Klasse geschrieben habe, die alles automatisch macht, hatte ich gehofft, dass es evt. noch eine andere Möglichkeit gibt
        Jo, escape einfach alles, hau es lieber noch durch htmlentites und ne handvoll andere Funktionen damit es 100% sicher ist, und dann speicher das ganze in ner CSV damit man erst garnicht die DB durch SQLi beeinflussen kann.
        Zitat von nikosch
        Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

        Kommentar


        • #5
          Sag mir bitte wenn ich mich irre, aber ist sqli mit prepared statements nicht unmöglich?

          Kommentar


          • #6
            UPDATE user SET expiredate_old = CONCAT(expiredate_old,', ',expiredate), expiredate = DATE_ADD(expiredate, INTERVAL " . $minutes . " MINUTE) WHERE username=?, array("username")
            Wenn du nur Fragmente zeigst, ist Hilfe kaum zu erwarten... DAS da oben ist jedenfalls weder Fisch noch Fleisch
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              Wieso überhaupt die Minuten direkt in den Query eingeben? Die kannst du auch als Parameter an das Prepared Statement übergeben.
              GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

              Kommentar


              • #8
                Das ist eine Gute frage, habs mir iwie angewöhnt, sachen die im script selbst berechnet werden (Nur Zahlen!) und kein Userinput ist, direkt in die query zu schreiben, ka warum ich das tu

                Wenn du nur Fragmente zeigst, ist Hilfe kaum zu erwarten... DAS da oben ist jedenfalls weder Fisch noch Fleisch
                Was genau meinst du mit, weder Fisch noch Fleisch?

                Kommentar


                • #9
                  Meiner Meinung nach gleich alles als Parameter, ermöglicht auch ein optimaleres Cachen des Queries [wenn sich der Wert ändert].

                  Er meint, dass dein Post weder Hand noch Fuss hat. Zeig uns den Code (+-5 Zeilen), der den Fehler erzeugt. Nicht nur 1 Stückchen davon.
                  GitHub.com - ChrisAndChris - RowMapper und QueryBuilder für MySQL-Datenbanken

                  Kommentar


                  • #10
                    davor wird nur der Wert berechnet und ne neue Instanz erzeugt. Das ist die ganze funktion.

                    PHP-Code:
                    function update($percent$days$username){
                       require_once 
                    'class/mysqlidb.php'
                       
                    $mysqli = new MySqliDB();
                       
                    $minutes calculatePercent($percent$days);
                       
                    $success $mysqli->ExecuteSQL("UPDATE user SET expiredate_old = CONCAT(expiredate_old,', ',expiredate), expiredate = DATE_ADD(expiredate, INTERVAL " $minutes " MINUTE) WHERE username=?", array("username"));
                       
                    $mysqli->CloseConnection();
                       return 
                    $success;
                    }

                    function 
                    calculatePercent($percent$days){
                        return 
                    round(($days 100 $percent) * 24 60);

                    Kommentar


                    • #11
                      Wäre vielleicht noch interessant, zu sehen was denn deine Datenbankklasse und die Methode macht.
                      Relax, you're doing fine.
                      RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

                      Kommentar


                      • #12
                        require_once 'class/mysqlidb.php'
                        $mysqli = new MySqliDB();
                        Eigentlich hat man hier schon genug gesehen…
                        --

                        „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


                        • #13
                          Zitat von nikosch Beitrag anzeigen
                          Eigentlich hat man hier schon genug gesehen…
                          Erklärung bitte! Was ist daran falsch?

                          Kommentar

                          Lädt...
                          X