Ankündigung

Einklappen
Keine Ankündigung bisher.

delete, insert, update in foreach

Einklappen

Neue Werbung 2019

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

  • delete, insert, update in foreach

    Es sollen mehrere Datensätze gelöscht, eingefügt oder geändert werden. Es handeln sich dabei um etwa 30 Datensätze in einem Durchlauf.

    Die Querys werden in einer Schleife erzeugt und dann ausgeführt.

    Query delete funktioniert einzeln korrekt. Query insert, update funktioniert einzeln auch korrekt.

    Wenn die Querys aber in dieser foreach Scheliefe abgearbeitet werden, werden die Datensätze gelöscht und insert, update wird nicht ausgeführt!

    MySQL meldet keinen Fehler, PHP auch nicht.

    Wenn ich ALLE Querys als String ausgebe und dann in MySQL Worbench kopiere und ausführen lasse funktioniert alles perfekt.

    Hat jemand eine Idee? Ich nicht mehr!


    Tabelle: MyISAM
    Primary Key: dealer_id, category_id

    PHP-Code:
    foreach ($CATEGORYS as $CATEGORY_ID) {

        if (
    $CATEGORY_ID 0) {
        
            
    /** query insert, update */
            
    $QUERY = <<<QUERY_END
                    INSERT INTO
                    dealer_category
                    SET
                    category_range = '
    $CATEGORY_RANGE',
                    dealer_id = '
    $DEALER_ID',
                    category_id = '
    $CATEGORY_ID',
                    dealer_name = '
    $DEALER_NAME'
                    
                    ON DUPLICATE KEY UPDATE category_range = '
    $CATEGORY_RANGE'
                    ;
    QUERY_END;
        
        } else {
        
            
    /** query delete */
            
    $QUERY = <<<QUERY_END
                    DELETE 
                    FROM
                    dealer_category
                    WHERE
                    dealer_id = '
    $DEALER_ID'
                    AND
                    category_id = '
    $CATEGORY_ID'
                    ;
    QUERY_END;

        }

        
    /** database */
        
    $CONNECTION mysql_connect(__DATABASE_HOST,__DATABASE_USERNAME,__DATABASE_PWD);    
        
        
    mysql_select_db (__DATABASE_DATABASE,$CONNECTION);

        
    mysql_query($QUERY,$CONNECTION);



  • #2
    urgs...
    schon queries in einer schleife abzuschicken ist murks. aber den verbindungsaufbau auch noch in die schleife zu packen ist wirklich obermurks.

    sortier erst was du einfügen oder entfernen möchtest und dann reichen 2 queries dafür.

    die funktionen mysql_* sind veraltet. nutze mysqli_* oder pdo um dich mit der MySQL zu verbinden.
    liebe Grüße
    Fräulein Dingsda

    Kommentar


    • #3
      Warum sollen Queries in Schleifen murks sein? Erschließt sich mir nicht.

      "aber den verbindungsaufbau auch noch in die schleife zu packen ist wirklich obermurks". Das dient nur zur INFO. Ist natürlich nicht in der Schleife und dann kein obermurks mehr.

      "sortier erst was du einfügen oder entfernen möchtest und dann reichen 2 queries dafür." Das geht nicht, da etwa 30 Datensätze gelöscht hinzugefügt oder geändert werden müssen.

      "die funktionen mysql_* sind veraltet. nutze mysqli_* oder pdo um dich mit der MySQL zu verbinden." sollte aber trotzdem funktionieren.

      Kommentar


      • #4
        1. nutze bitte die quote-tags um jemanden zu zitieren.

        Zitat von peter1000 Beitrag anzeigen
        Warum sollen Queries in Schleifen murks sein? Erschließt sich mir nicht.
        weil bei jedem query die daten zum sql-server geschickt werden müssen und das nicht sehr performant ist.
        Zitat von peter1000 Beitrag anzeigen
        "aber den verbindungsaufbau auch noch in die schleife zu packen ist wirklich obermurks". Das dient nur zur INFO. Ist natürlich nicht in der Schleife und dann kein obermurks mehr.
        ok. dann nehme ich es zurück. zur info hätte es aber auch geholfen wirklich den code zu zeigen, der auch benutzt wird.
        Zitat von peter1000 Beitrag anzeigen
        "sortier erst was du einfügen oder entfernen möchtest und dann reichen 2 queries dafür." Das geht nicht, da etwa 30 Datensätze gelöscht hinzugefügt oder geändert werden müssen.
        und warum soll das nicht gehen?
        Code:
        DELETE FROM `foo` WHERE id IN (kommaseparierte liste von den ids) ;
        
        INSERT INTO `foo` VALUES (reihe1),(reihe2),(reihe3) 
            ON DUPLICATE KEY UPDATE `spalte1`=VALUES(`spalte1`),`spalte2`=VALUES(`spalte2`) usw...
        Zitat von peter1000 Beitrag anzeigen
        "die funktionen mysql_* sind veraltet. nutze mysqli_* oder pdo um dich mit der MySQL zu verbinden." sollte aber trotzdem funktionieren.
        betreibe debugging. lass dir fehler von mysql_* ausgeben, lass dir die querystring vor mysql_query ausgeben, schalt error-reporting an usw
        liebe Grüße
        Fräulein Dingsda

        Kommentar


        • #5
          Hallöchen,

          Zitat von peter1000 Beitrag anzeigen
          Warum sollen Queries in Schleifen murks sein? Erschließt sich mir nicht.
          Weil du damit pro Schleifendurchgang ein Query an den SQL-Server sendest (in deinem Beispiel sind das exakt 30), was nicht sonderlich effizient ist. Die bessere Alternative ist die Verwendung von mysqli::multi_query.

          Zitat von peter1000 Beitrag anzeigen
          Das dient nur zur INFO. Ist natürlich nicht in der Schleife und dann kein obermurks mehr.
          Die "Info" hättest du auch über die Schleife packen können.

          Zitat von peter1000 Beitrag anzeigen
          Das geht nicht, da etwa 30 Datensätze gelöscht hinzugefügt oder geändert werden müssen.
          Doch, genau das geht.

          Zitat von peter1000 Beitrag anzeigen
          sollte aber trotzdem funktionieren.


          Ach ja: wenn du schon zitierst, dann nutze bitte quote-Tags.

          Viele Grüße,
          lotti
          [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

          Kommentar


          • #6
            Danke für die Antworten.

            Weder PHP noch MySQL geben Fehler aus!

            Jedes Query einzeln funktioniert. Alle 'Delete...' und alle 'Inserate, Update ...' werden einzeln fehlerfrei ausgeführt.

            Wenn ich alle erzeugten Querys in MySQL Workbench kopiere und ausführen lasse gibt es keine Fehlermeldung und alles funktioniert so wie es soll.

            Das heißt, wenn ich in der Schleife das Query 'Delete...' nicht ausführen lassen dann funktioniert das Query 'Inserate, Update ...'!

            Ich jetzt festgestellt, das 'Inserate, Update ...' ausgeführt wird. Ich habe mir die Tabelle während der Scriptlaufzeit mit Sequel mal angesehn. Die mit 'Inserate, Update ..' erzeugten und geänderten Datensätze erscheinen nur kurzeitig. Dann werden sie alle gelöscht!

            Merkwürdig!

            Kommentar


            • #7
              Diese Querys werden zum Beispiel erzeugt.

              PHP-Code:
              INSERT INTO dealer_category SET category_range '100'dealer_id '3'category_id '1'dealer_name 'xxx-gmbh' ON DUPLICATE KEY UPDATE category_range '100' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '2' 
              INSERT INTO dealer_category SET category_range '25'dealer_id '3'category_id '3'dealer_name 'xxx-gmbh' ON DUPLICATE KEY UPDATE category_range '25' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '4' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '5' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '10' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '11' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '12' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '13' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '16' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '17' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '18' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '19' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '20' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '21' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '22' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '23' 
              DELETE FROM dealer_category WHERE dealer_id '3' AND category_id '24' 
              INSERT INTO dealer_category SET category_range '50'dealer_id '3'category_id '25'dealer_name 'xxx-gmbh' ON DUPLICATE KEY UPDATE category_range '50' 
              Alles kopiert und in Sequel (ä. phpAdmin) eingefügt. Funktioniert alles wie es soll. Keine Fehlermeldung.

              Im Script nicht. Habe alles auf MySqLi umgestellt und mit muliti_query ausgeführt.

              Das GLEICHE Ergebnis. Daten werden gelöscht aber nicht geändert und hinzugefügt. Keine Fehlermeldung 'mysqli_connect_errno()' = 0.

              Ratlos!

              Kommentar


              • #8
                irgendwie bin ich von dem script etwas verwirrt.
                alle $CATEGORY_ID sind doch größer als 0.
                wie kommt dein script überhaupt in den else teil rein bei der prüfung
                PHP-Code:
                 if ($CATEGORY_ID 0
                und die variable $CATEGORY_RANGE muss doch eigentlich auch innerhalb der schleife geändert werden, sonst wäre sie in allen querys gleich.

                also entweder bin ich grad zu blöd, oder der hier gezeigte code ist doch stark anders als der wirklich verwendete.
                liebe Grüße
                Fräulein Dingsda

                Kommentar


                • #9
                  Wenn $CATEGORY_ID == 0 dann löschen, wenn nicht dann insert oder update.

                  Richtig es fehlt noch

                  '$CATEGORY_RANGE = intval($_POST[$CATEGORY_ID]);'

                  nach

                  /** query insert, update */.

                  Habe ich vergessen zu kopieren. Sorry.

                  Die Querys werden alle korrekt erzeugt. Aber eben unter PHP nicht korrekt ausgeführt. Das ist mein Problem!

                  Falls einer wegen $_POST in Datenbank ... wieder murks meldet - die Daten sind vorher bereits bereinigt usw.

                  Kommentar


                  • #10
                    Zitat von peter1000 Beitrag anzeigen
                    Wenn $CATEGORY_ID == 0 dann löschen, wenn nicht dann insert oder update.
                    und wie wird dann bitte aus

                    PHP-Code:
                            $QUERY = <<<QUERY_END
                                    DELETE 
                                    FROM
                                    dealer_category
                                    WHERE
                                    dealer_id = '
                    $DEALER_ID'
                                    AND
                                    category_id = '
                    $CATEGORY_ID'
                                    ;
                    QUERY_END; 
                    sowas:
                    ;
                    DELETE FROM dealer_category WHERE dealer_id = '3' AND category_id = '12'

                    Zitat von peter1000 Beitrag anzeigen
                    Richtig es fehlt noch

                    '$CATEGORY_RANGE = intval($_POST[$CATEGORY_ID]);'

                    nach

                    /** query insert, update */.

                    Habe ich vergessen zu kopieren. Sorry.
                    stell doch einfach mal den vollständigen relevanten teil deines code rein.

                    vorgehen dafür:
                    1) lösch alles was nicht dazu gehört
                    2) ersetze z.b. das $_POST-array durch ein selbst erstelltes, dass einige beispiel-werte enthält.
                    3) teste ob, dein code so immer noch funktioniert
                    4) ALLES kopieren und hier einfügen.
                    liebe Grüße
                    Fräulein Dingsda

                    Kommentar


                    • #11
                      Hallo, es geht darum:

                      die Querys werden wie unter #7 dargestellt erzeugt.

                      Diese Querys werden mit einer Anwendung, ähnlich phpAdmin, korrekt und ohne Fehler ausgeführt. Die Datensätze die gelöscht werden sollen werden gelöscht. Die Daten die hinzugefügt oder editiert werden sollen werden korrekt abgearbeitet.

                      NUR PHP macht das nicht! Warum weiß ich nicht.

                      Ich hatte erst jedes Query einzeln ausgeführt.

                      Dann auf MySQLi umgestellt und mit 'multi_query' alle Querys auf einmal zur Datenbank geschickt. Keine Fehlermeldung. Weder durch PHP noch durch MySQL.

                      Es hat aber wieder nur Delete funktioniert. Insert und Update funktioniert nicht.

                      Insert und Update funktioniert aber von PHP aus, wenn die DELETE Querys aus testgründen nicht mit übergeben werden.

                      Wie die Querys zustande kommen ist ja erst einmal nicht so wichtig. Denn unter phpAdmin werden diese ja korrekt ausgefüht.

                      Kommentar


                      • #12
                        wie wärs mal mit querys posten ?
                        error reporting zudem aufdrehen.

                        Fortgeschritten?
                        No Sacrifice , no Glory--

                        Kommentar

                        Lädt...
                        X