Ankündigung

Einklappen
Keine Ankündigung bisher.

Hilfe bei Ansatz einer SQL-Abfrage

Einklappen

Neue Werbung 2019

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

  • Hilfe bei Ansatz einer SQL-Abfrage

    moinsen,

    ich bin noch n bissi grün hinter den ohren was php & mysql angeht. ich bräuchte mal nen ansatz, wie ich folgendes problem lösen könnte.
    ich wollte eine DB fragen, ob es in einer tabelle in der spalte 'username' bereits den gibt, der in der variable $testuser steht. wenn ja, dann soll dieser datensatz ein UPDATE bekommen, sonst eben INSERT des datensatzes.

    PHP-Code:
    /////
    $abfrage_username_exists "IF username FROM mie_1 LIKE $testuser";
    // dann
    UPDATE `mie_1SET `username`=[value-2],`vorname`=[value-3]
    //sonst
    INSERT INTO `mie_1`(`username`, `vorname`) VALUES ([value-2],[value-3])
    ///// 
    die frage wäre, wie kann ich $abfrage_username_exists auswerten, um dann mittels php und if/else darauf zu reagieren mit o.g. UPDATE bzw. INSERT?

  • #2
    Mit MySQL kannst du das verwenden, spart dir einges an Arbeit: http://dev.mysql.com/doc/refman/5.1/...duplicate.html


    Und das ist in die falsche Richtung gedacht, mit SELECT frag man in SQL ob es was gibt.

    PHP-Code:
    $abfrage_username_exists "IF username FROM mie_1 LIKE $testuser"
    LG
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      ahh, ok. deshalb habe ich ja nachgefragt

      also wäre die richtung die rihtige:

      INSERT INTO mie_1 (`username`, `vorname`) VALUES (testuser12, max)
      ON DUPLICATE KEY UPDATE 'username'; ?

      dann prüft also
      PHP-Code:
      ON DUPLICATE KEY UPDATE 'username'
      ob es in der spalte 'username' den wert 'testuser12' schon gibt? und wenn ja, dann wird n UPDATE ausgeführt und als 'vorname' der wert 'max' gesetzt, sonst ein INSERT?
      richtig verstanden?

      Kommentar


      • #4
        ob es in der spalte 'username' den wert 'testuser12' schon gibt?
        Jein, nicht ob ein Wert schon vorhanden ist, sondern:

        ... ein Datensatz eingefügt wird, der einen doppelten Wert in einem eindeutigen Index oder einem Primärschlüssel erzeugen würde, dann wird für den alten Datensatz UPDATE ausgeführt
        Das ist ein kleiner Unterschied.

        Probier es aus, spiel bisschen damit rum, dann wirst du schnell drauf kommen was da passiert.

        LG
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          jupp, wunderbar. das mit
          PHP-Code:
          ON DUPLICATE KEY UPDATE 
          passt wunderbar und funzt prima. ich gehe mal davon aus, dass es das bei mysqli auch gibt. werd ja sicher alles umschreiben müssen, da ja jeder sagt, mysql ist deprecated.
          aber danköööö

          Kommentar


          • #6
            mysql_* und mysqli_* (und PDO, wobei PDO noch andere Datenbanksysteme unterstützt) sind nur die Schnittstellen, die von PHP für den Datenbankzugriff auf MySQL bereitgestellt werden, an den Queries selbst musst du beim umstellen nichts ändern.
            [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
            [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

            Kommentar


            • #7
              soo, mal noch ne kleinigkeit. ich habe bei gefunden, dass man bei INSERT auch nen IGNORE nutzen kann. gibts bei ON DUPLICATE KEY UPDATE ne möglichkeit, dass bei nem leeren feld dieses nicht geupdatet wird? sonst werden ja bereits befüllte tabellen mit NULL gefüllt.

              man müsste also ein UPDATE für das jeweilige feld verbieten, da sonst ja NULL übermittelt wird zum jeweiligen feld

              Kommentar


              • #8
                Ich verstehe nicht ganz, was du willst, aber CASE könnte dein Problem lösen.
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  naja ich hab 2 textfelder. beiden werden ausgelesen und via sql in ne tabelle eingetragen. wenn ich jetzt ein
                  ON DUPLICATE KEY UPDATE mache für beide felder, und in einem feld steht nix drin, dann wird das ja trotzdem geupdatet und der leere string gesendet oder NULL. dass soll so nicht passieren

                  besser erklärt??

                  Kommentar


                  • #10
                    Ja, ein wenig besser. Das kannst du tatsächlich mit CASE bewerkstelligen.
                    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                    Kommentar


                    • #11
                      wenn ich jetzt ein ON DUPLICATE KEY UPDATE mache für beide felder, und in einem feld steht nix drin
                      Du kannst doch selbst steuern was im UPDATE Teil steht.
                      The string "()()" is not palindrom but the String "())(" is.

                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        kannst mir einer sagen, warum das so nicht funzt?
                        PHP-Code:
                        ON DUPLICATE KEY UPDATE vorname = IF('$vorname' IS NOT NULL'$vorname'vorname
                        jetzt sollte doch VORNAME nie nen leeren wert bekommen, oder?

                        EDIT: habs selbst rausbekommen. es lebe google
                        PHP-Code:
                        ON DUPLICATE KEY UPDATE vorname = IF('$vorname' ''vorname'$vorname'
                        so muss es lauten

                        Kommentar


                        • #13
                          Naja, das ist nicht ganz das Gleiche, was du hier prüfst. Wenn das so ist, würde ich auf jeden Fall die Spalte "vorname" auf NOT NULL stellen.
                          [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                          Kommentar


                          • #14
                            Code:
                            INSERT INTO
                                mie_1(username, vorname)
                            VALUES
                                (:username, :vorname)
                            ON DUPLICATE KEY UPDATE
                                username = COALESCE(VALUES(username), username),
                                vorname = COALESCE(VALUES(vorname), vorname);

                            Per VALUES() kann im ON DUPLICATE KEY UPDATE auf die Werte verwiesen werden, die über INSERT INTO hätten eingefügt werden sollen.

                            COALESCE holt den ersten Parameter der NOT NULL ist.

                            Kommentar


                            • #15
                              Da vielleicht die Werte nicht NULL sondern ein leerer String sind, kann noch per NULLIF() geprüft werden ob es ein leerer String ist.

                              Code:
                              INSERT INTO
                                  mie_1(username, vorname)
                              VALUES
                                  (:username, :vorname)
                              ON DUPLICATE KEY UPDATE
                                  username = COALESCE(NULLIF(VALUES(username), ''), username),
                                  vorname = COALESCE(NULLIF(VALUES(Vorname), ''), vorname);

                              Kommentar

                              Lädt...
                              X