Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme beim INSERT mit PDO Statements über PHP

Einklappen

Neue Werbung 2019

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

  • Probleme beim INSERT mit PDO Statements über PHP

    Hallo zusammen

    ich habe Probleme nach dem PHP Upgrade auf 7.3 mit den Funktionen zu MySQL.
    Ein Wechsel von mysqli_* zu PDO klappt soweit, jedoch habe ich Probleme mit dem Einlesen von Daten
    DB Connect ist okay, Selects ebenfalls
    Jedoch beim Insert bekomm ich nach einigen Hundert Zeilen einen Fehler bezogen auf eine INT Column
    Uncaught PDOException: SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value: '' for column


    PHP-Code:

    $querya 
    "INSERT INTO tm_nm_ansetzungen
            (saison, spieltag, status, liga, hometeam_id, awayteam_id,
                    erggesa, erggesb, qugesa, qugesb) VALUES "
    ;
    $queryb "INSERT INTO tm_nm_tabellen
            (saison, spieltag, liga, wo, status, team_id, siegeges, unentschiedenges,
                    niederlagenges, toreges, toregegenges, quoteges, quotegegenges) VALUES "
    ;





    ########
    ## abschlußtabellen ermitteln (querys aufstellen)
    ########

    $query "SELECT teams.old_names AS team, tab.team_id, liga,
                    (sum(siegeges)+sum(unentschiedenges)+sum(niederlagenges)), sum(siegeges),
                    sum(unentschiedenges), sum(niederlagenges), (3*sum(siegeges)+sum(unentschiedenges)),
                    sum(toreges), sum(toregegenges), (sum(toreges)-sum(toregegenges)),
                    sum(quoteges),sum(quotegegenges)
            FROM tm_nm_tabellen tab
            LEFT JOIN tm_nm_teams teams
                    USING (team_id)
            WHERE saison='
    $alte_saison'
                    AND teams.old_names<>''
            GROUP BY tab.team_id
            ORDER BY 3 ASC, 8 DESC, 11 DESC, 9 DESC"
    ;

    $result=$db_connection->prepare($query);
    $result->execute();

    $result2 $result->fetch();
    $num $result->rowCount();

    print_r($num);
    echo 
    '<br>';
    for (
    $i=1;$i<51;$i++)
    {
     
    $row=$result->fetch();
        
    $alt[$i]=$row['team']; //aenderung von team in team_id
    }

    ########
    ## neue ligenzusammensetzung ermitteln
    ########

    for ($i=1;$i<51;$i++)
    {
        
    $liga=bcdiv($i-1,10,0)+1;
        
    $nr=bcmod($i-1,10)+1;
            
    $neue_ligen[$liga][$nr]=$alt[$team[$i]]; // anderung: entfernt
            //$neue_ligen[$liga][$nr] = $alt[$i]; // aenderung hinzu
    }

    ########
    ## ansetzungen+++tabellendaten in datenbank schreiben
    ########

    for ($liga=1;$liga<6;$liga++)
    {
            for (
    $halbserie=1;$halbserie<3;$halbserie++)
            {
                    for (
    $spieltag=1;$spieltag<10;$spieltag++)
                    {
                            for (
    $spiel=1;$spiel<6;$spiel++)
                            {
                                    if (
    $halbserie==1)
                                    {
                                            
    $team1=$neue_ligen[$liga][$spielplan[$spieltag][$spiel][1]];
                                            
    $team2=$neue_ligen[$liga][$spielplan[$spieltag][$spiel][2]];
                                            
    $tag=$spieltag;
                                    } else {
                                            
    $team1=$neue_ligen[$liga][$spielplan[$spieltag][$spiel][2]];
                                            
    $team2=$neue_ligen[$liga][$spielplan[$spieltag][$spiel][1]];
                                            
    $tag=$spieltag+9;
                                    }
                            
    $query_db_ans_ins=$querya."('$neue_saison','$tag','0','$liga', '" $all_teams[$team1] . "','" $all_teams[$team2] . "','0','0','0','0')";
                            
    $query_db_tab_ins1=$queryb."('$neue_saison','$tag','$liga','h','0','" $all_teams[$team1] . "','0','0','0','0','0','0','0')";
          
    $query_db_tab_ins2=$queryb."('$neue_saison','$tag','$liga','a','0','" $all_teams[$team2] . "','0','0','0','0','0','0','0')";

          
    $db_connection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
          
    $result=$db_connection->prepare($query_db_ans_ins);
                            
    //$result->execute(array($query_db_ans_ins)) or exit (print_r($query_db_ans_ins->errorInfo()));
          
    $result->execute(array($query_db_ans_ins));
           
    print_r($query_db_ans_ins);
           echo 
    '<br>';
          
    $result1=$db_connection->prepare($query_db_tab_ins1);
                            
    //$result1->execute(array($query_db_tab_ins1)) or exit (print_r($query_db_tab_ins1->errorInfo()));
          
    $result1->execute(array($query_db_tab_ins1));
           
    print_r($query_db_tab_ins1);
           echo 
    '<br>';
          
    $result2=$db_connection->prepare($query_db_tab_ins2);
                            
    //$result2->execute(array($query_db_tab_ins2)) or exit (print_r($query_db_tab_ins2->errorInfo()));
          
    $result2->execute(array($query_db_tab_ins2));
           
    print_r($query_db_tab_ins2);
              echo 
    '<br>';
                            }
    #                        echo "<hr>";
                    
    }
            }
    #       echo "<hr>";
            
    for ($l=1;$l<11;$l++)
            {
                    
    $team=$neue_ligen[$liga][$l];
                    
    $query_db_tab_ins3=$queryb."('$neue_saison','0','$liga','h','2','" $all_teams[$team] . "','0','0','0','0','0','0','0')";
                    
    $query_db_tab_ins4=$queryb."('$neue_saison','0','$liga','a','2','" $all_teams[$team] . "','0','0','0','0','0','0','0')";
           
    $result=$db_connection->prepare($query_db_tab_ins3);
                    
    $result->execute(array($query_db_tab_ins3)) or die ("mist3-query_db_tab_ins3");
           
    $result=$db_connection->prepare($query_db_tab_ins4);
                    
    $result->execute(array($query_db_tab_ins4)) or die ("mist4-query_db_tab_ins4");
            }


    Ich weiss dass der Code nicht professionell und sauber aussieht, aber ich hoste das Game und es ist von mysql_* nach mysqli_* grad so zum Laufen gekommen - doch jetzt weiss ich nicht weiter
    Ich bekomme 90% der korrekt Zeilen geladen - dann kommt dieser Fehler.
    Wir haben 5 Ligen und je 18 Spieltage
    Bei Liga5 bekomm ich grad die ersten 4 Einträge in die Tabelle "tm:nm:tabellen" - müssten aber 18*5 Zeilen und 18*1 Zeile in tm_nm:ansetzungen"
    Danke vorab schon mal
    appi


  • #2
    Schau dir die Daten an die du einfügst.
    Datetime erwartetet ein Format nach dem Muster 'YYYY-MM-DD hh:mm:ss'
    Integer muss eine Ganzzahl sein, also kein Komma oder Punkt drin und darf auch kein String sein.

    '" . $all_teams[$team1] . "'

    macht aus einer id die ein integer sein sollte ein String.
    so wäre es besser
    Code:
    " . $all_teams[$team1] . "
    Dein Query mit SELECT und JOIN ist auch nicht richtig.
    Da hast du ein Group BY drin aber nicht alle Spalten aufgeführt die keine SUM als Aggregat verwenden, dass führt leider bei Mysql zu keinem Fehler sondern einfach zu Fantasieausgaben.

    Überprüfe deine Queries mal direkt in der DB
    Erst wenn sie das ausgeben was du erwartest solltest du diese verwenden.


    Diese Fehler sollten aber schon vorher in Erscheinung getreten sein, da sie unabhängig von der Verwendeten API auftreten.


    Kommentar


    • #3
      Hallo protestix

      was aber komisch ist, denn 90% der DB Einträge funktionieren und werden richtig inserted, nur bei der letzten Liga gibt es probleme nach dem 4. Datensatz.
      Die ersten 4 klappen auch, erst dann wird es zum "datetime" ...

      kann leider erst heut abend schauen ob es trotzdem hilft

      Wenn ich es erst einmal am Laufen hab werd ich Deinen rat beherzigen und die Joins durchtesten. hatte bei den vorherigen Versionen keine "Complains" gegeben dass falsche Ergebnisse da gewesen wären.

      Es kommen noch einige alte Scripte auf mich zu .... dieses ist eines von ca 10 die ich anpassen darf/muss

      Kommentar


      • #4
        Deine Fehlermeldung sagt doch schon, woher der Löwe brüllt "Uncaught PDOException: SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value: '' for column"
        wobei der Spaltenname natürlich mehr als hilfreich wäre ...

        DateTime hat protestix schon sehr gut erklärt - wäre natürlich interessant, was dein 1366 für eine Zeit und/oder Datum sein soll

        Mein Tipp ist daher : gib die SQL-Texte aus, bevor du sie an die Datenbank sendest - MIT eingesetzten werten. Mindestens einer der Werte, der in eine Integer-Spalte der Datenbank eingetragen werden soll ist "Leer" - das ist ein Problem, an dem teilweise PHP mit schuld ist, weil es eben keine klaren Typen für Variablen gibt. In jeder typisierten Programmiersprache wäre der Fehler wohl vorher aufgefallen, weil eine int-Variable / array-Element vom Typ int keine leere Zeichenkette aufnimmt. (und im Normalfall auch nicht NULL sein kann).

        Und warum benutzt du eigentlich PDO und nicht die Möglichkeit der prepared Statements, die dir eventuell nötiges Escaping abnehmen würde. Spätestens dabei würde auffallen, dass du einen INT-Parameter mit einer leeren Zeichenkette befüllen willst ...
        Zwingende Ausgabe aller PHP-Fehler sollte dich dann auf das Problem aufmerksam machen
        "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

        Kommentar


        • #5
          Hallo eagle

          ich versstehe die fehlermeldung auch - nur dann müsste sie beim 1. Insert und nicht erst beim 365. Eintrag auftreten, 364 klappen erfolgreich
          Das Feld ist deklariert iin der DB als int(4)
          Und es kommt eine ein oder zweistellige Zahl zwischen 1 und 50 hinein.
          Ich schaue heut abend ob ich mit dem print_r vor dem execute vielleicht die zeile sehen kann welche nicht klappt

          Sicher existiet auch ein angesprochenen "leeres" Feld, welches ein "AutoIncrement" Feld ist

          Ich habe mir alle Inserts ausgeben lassen und bekomme bis zu dem insert welches klappt alle angezeigt, aber das welches failed leider nicht

          Ich habe den Code vor einigen jahren übewrnommen noch mit mysql_* Routinen, Mittlerweile hatte ich es auf mysqli_* umstellen können. Doch die Installation auf meiner HP meinte dass es nicht mehr geht, daher habe versucht auf PDO umzubauen.
          Jedoch erst einmal nur um es zum laufen zu bringen ... danach kann man dann in Ruhe weiter arbeiten um es sauberer und moderner zu machen

          Kommentar


          • #6
            lass die auto_increment Spalte weg bei INSERT into Tabelle (spalte1,spalte2) Values (...) und natürlich den entsprechenden Eintrag im Values Bereich
            "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste

            Kommentar


            • #7
              Die Spalte ist weder im Feld-Aufruf noch im Feld-Values drin, sie wird automatisch versorgt .... habs aber auch mit probiert - aber dann kommen andere Fehler. Dafür ist de Spalte als auto_increment in der Db angelegt

              Kommentar


              • #8
                Problem ist identifiziert - aber nicht behoben.
                Es fehlen 2 Teams in der letzten Liga wodurch das einzutragende Feld tatsächlich leer ist
                Es ist die Verteilung, die irgendwo zwei Teams verliert, obwohl alle (1-50) verteilt werden.

                Kommentar


                • #9
                  Und weiter gehen die Findings ....
                  Es geht die Nummer 1 verloren - und somit ist 50 leer. Warum weiss ich noch nicht
                  selbst wenn ich das Array auf 0 -50 umsetze ist das Ergebnis versetzt aber gleich Immer fehlt das Team welches an erster Stelle steht.

                  Kommentar


                  • #10
                    Ist mir persönlich unverständlich, was warum wie wohin führen soll, vielleicht teilst du das mal in nachvollziehbare kleine Schritte mit definiertem Ergebnis auf.
                    You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.

                    Kommentar


                    • #11
                      Zitat von chorn Beitrag anzeigen
                      Ist mir persönlich unverständlich, was warum wie wohin führen soll...
                      Mir auch.
                      Damit man es nachvollziehen kann, solltest du dein Problem auf das Notwendigste reduzieren
                      Zeige zudem die Struktur der DB mit einigen(max. 10) Beispieldaten.

                      Dass es um Ligaspiele und neue Teamzusammensetzungen geht hat wohl jeder mitbekommen, das musst du nicht noch mal erläutern, Es wäre aber interessant zu wissen nach welchem Muster die sich zusammensetzen. Also beispielsweise Gewinner Liga 2 gegen letzten aus Liga 1 oder so.

                      Kommentar

                      Lädt...
                      X