Ankündigung

Einklappen
Keine Ankündigung bisher.

Mysql 7.4.18 -> Mysql 8.0

Einklappen

Neue Werbung 2019

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

  • Mysql 7.4.18 -> Mysql 8.0

    Moin Forum,
    ich habe gerade versucht, eine meiner Seiten auf Mysql 8 zu migrieren. Dabei trat ein Problem mit folgendem Script auf:
    PHP-Code:
    $SQL "SELECT * FROM `aktivitaeten` WHERE KATEGORIE='dsab' AND DATE_FORMAT(DATUM, '%y-%m-%d') BETWEEN DATE_FORMAT(CURDATE(),'%y-%m-%d') AND DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 8 Week), '%y-%m-%d') ORDER BY DATUM ASC"
    Dieses Scirpt läuft in der 7er Version einwandfrei, in der 8er bekomme ich folgende Fehlermeldung:

    PHP-Code:
    Fatal errorUncaught ValueErrormysqli_result::data_seek(): Argument #1 ($offset) must be greater than or equal to 0 in C:\xampp80\phpMyAdmin\libraries\classes\Dbi\DbiMysqli.php:270 Stack trace: #0 C:\xampp80\phpMyAdmin\libraries\classes\Dbi\DbiMysqli.php(270): mysqli_result->data_seek(-1) #1 C:\xampp80\phpMyAdmin\libraries\classes\DatabaseInterface.php(2726): PhpMyAdmin\Dbi\DbiMysqli->dataSeek(Object(mysqli_result), -1) #2 C:\xampp80\phpMyAdmin\libraries\classes\Display\Results.php(4464): PhpMyAdmin\DatabaseInterface->dataSeek(Object(mysqli_result), -1) #3 C:\xampp80\phpMyAdmin\libraries\classes\Display\Results.php(4203): PhpMyAdmin\Display\Results->_getSortedColumnMessage(Object(mysqli_result), 'DATUM') #4 C:\xampp80\phpMyAdmin\libraries\classes\Sql.php(1669): PhpMyAdmin\Display\Results->getTable(Object(mysqli_result), Array, Array, true) #5 C:\xampp80\phpMyAdmin\libraries\classes\Sql.php(1470): PhpMyAdmin\Sql->getHtmlForSqlQueryResultsTable(Object(PhpMyAdmin\Display\Results), './themes/pmahom...', NULL, Array, false, 0, 0, true, Object(mysqli_result), Array, true) #6 C:\xampp80\phpMyAdmin\libraries\classes\Sql.php(2255): PhpMyAdmin\Sql->getQueryResponseForNoResultsReturned(Array, 'cu-knostmichael...', 'aktivitaeten', NULL, 0, Object(PhpMyAdmin\Display\Results), NULL, './themes/pmahom...', NULL, Object(mysqli_result), 'SELECT * FROM `...', NULL) #7 C:\xampp80\phpMyAdmin\import.php(758): PhpMyAdmin\Sql->executeQueryAndGetQueryResponse(Array, false, 'cu-knostmichael...', 'aktivitaeten', NULL, NULL, NULL, NULL, NULL, NULL, 'tbl_sql.php', './themes/pmahom...', NULL, NULL, NULL, 'SELECT * FROM `...', NULL, NULL) #8 {main} thrown in C:\xampp80\phpMyAdmin\libraries\classes\Dbi\DbiMysqli.php on line 270 
    Ich weiss nicht, wo ich dort den Fehler suchen soll... ich hab die 8er Version als xampp zu testzwecken auf meinem Rechner..
    Hat da vielleicht jemand einen Tipp für mich?
    Danke schonmal....

  • #2
    Naja, bei einem unbekannten Code kann man höchstens herumraten. Ob das zielführend ist?

    Außerdem ist davon abzuraten SELECT * zu verwenden. In einem SELECT sollten immer die gewünschten Spalten aufgeführt werden (ja, auch wenn es alle sind).

    Kommentar


    • #3
      Vorweg: MySQL 7.x gibt es nicht, die letzte Version vor der 8.0 war die 5.7. Meinst du vielleicht PHP 7.4 bzw. 8.0?

      Zitat von doofi Beitrag anzeigen
      Dieses Scirpt läuft in der 7er Version einwandfrei, in der 8er bekomme ich folgende Fehlermeldung:
      Du postest einen SQL-Query und eine PHP-Fehlermeldung - da passt was nicht zusammen. Zudem ist die Fehlermeldung (da ohne Zeilenumbrüche) unlesbar.

      Warum data_seek() mit -1 als Parameter aufgerufen wird können wir mangels Code nicht sagen, falls die Datenbank vorher schon einen Fehler wirft musst du sie ggf. fragen was falsch ist. Wobei mir gerade auffällt: da scheint auch irgendwo phpMyAdmin im Spiel zu sein, oder? Das sollte eine anständige Fehlermeldung ausspucken wenn etwas falsch ist …

      Kommentar


      • #4
        Screenshot 2021-07-17 130112.png Ok, hier der Quellcode der Datei, die in der Vorgängerversion ohne Fehlermeldungen läuft.
        PHP-Code:
        ?>
                    <h2>Verfügbare Turniere</h2>
                    <p>
        <?php
                        $SQL 
        "SELECT * FROM `aktivitaeten` WHERE KATEGORIE='dsab' AND DATE_FORMAT(DATUM, '%y-%m-%d') BETWEEN DATE_FORMAT(CURDATE(),'%y-%m-%d') AND DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 8 Week), '%y-%m-%d') ORDER BY DATUM ASC";
        #echo $SQL;exit;                
                        
        if(!$result $db->query($SQL))
                        { die(
        'Es ist ein Fehler aufgetreten!/n[' $db->error ' ]'); }
                        else
                        {
                            if (
        $result->num_rows 0)
                            {
                                while (
        $row mysqli_fetch_array($result,MYSQLI_ASSOC))
                                {
                                    
        $SQL2 "SELECT * FROM `turnierkonfig` WHERE DATE_FORMAT(DATUM, '%d.%m.%y') = DATE_FORMAT('".$row['DATUM']."', '%d.%m.%y')";

                                    if(!
        $vorhanden $db->query($SQL2))
                                    { die(
        'Es ist ein Fehler aufgetreten!/n[' $db->error ' ]'); }
                                    else
                                    {
                                        if (
        $vorhanden->num_rows <= 0)
                                        {
                                            
        ?>
                                            <form action="turnierkonfig.php" method="post">
                                            <div style="float:left;margin:1em;">
                                                <label for="datum">Datum</label>
                                                <input type="text" readonly="readonly" style="text-align: center;" name="datum" size="12" value="<?php echo DATESQL2GE($row['DATUM']); ?>">
                                            </div>
                                            <div style="float:left;margin:1em;">
                                                <label for="tname">Turnier-Name</label>
                                                <input type="text" readonly="readonly" name="tname" size="30%" value="<?php echo $row['TITEL']; ?>" placeholder="Turniername...">
                                            </div>
                                            <div style="float:left;margin:1em;">
                                                <label for="teiln">max. Teilnehmer</label>
                                        <input type="text" name="maxteiln" size="4" value="<?php echo $maxteiln?>" placeholder="0">
                                            </div>
                                            <div style="float:left;margin:1em;">
                                                <select name="modus"><option value="ausw">Modus...</option><option value="E">Einzel</option><option value="D">Doppel</option><option value="T">Team</option></select></label>
                                            </div>
                                            <div style="float:left;margin:1em;">
                                                <input type="submit" class="button" name="open" value="freischalten">
                                            </div>
                                            <br style="clear:both;">
                                            </form>
                                            <?php    
                                        
        }
                                    }
                                    
        mysqli_free_result($vorhanden);
                                }
                            }
                            else
                            {
                                echo 
        "<div class="error">- keine Turniere vorhanden -</div>";
                            }
                        }
                        
        mysqli_free_result($result);
        ?>
                    </p>
        Die Fehlermeldung kommt als Rückmeldung auf den abgesetzten SQL-Befehl direkt im phpmyadmin


        Ich hoffe das sind genug Informationen. Die Fehlerquellen werden bearbeitet, sobald das Script lauffähig ist. Danke!
        Angehängte Dateien

        Kommentar


        • #5
          Hier nochmal die Versionen, die verwendet werden (vorher=geht, nachher=geht nicht)
          vorher.pngnachher.png

          Kommentar


          • #6
            Hast du null werte in der Datums Spalte? Mysql 5 hat daraus automatisch 0000-00-00 gemacht während man das ab mysql8 explizit in der config erlauben muss
            Pre-Coffee-Posts sind mit Vorsicht zu geniessen!

            Kommentar


            • #7
              Bilder bitte nur in absoluten Ausnahmefällen posten, in 99,9% der Fälle ist es sinnvoller das ganze als Text zu posten.

              Zitat von doofi Beitrag anzeigen
              Ok, hier der Quellcode der Datei, die in der Vorgängerversion ohne Fehlermeldungen läuft.
              Bahnhof. Was liefert einen Fehler? Ein Datenbank-Query oder der PHP-Code? Wenn die Datenbank einen Fehler wirft: bitte Inhalt der Tabelle (CREATE-TABLE- und INSERT-Querys, kein Bild!) posten damit wir das nachvollziehen können (natürlich nicht alle Daten, v.a. keine sensiblen, nur ein paar Testdaten). Wenn der PHP-Code eine Fehlermeldung wirf: welche Fehlermeldung (nein, die in #1 ist nicht lesbar und passt auch nicht zum Code)?

              zum Code:
              PHP-Code:
              // […]
              $SQL "SELECT * FROM `aktivitaeten` WHERE KATEGORIE='dsab' AND DATE_FORMAT(DATUM, '%y-%m-%d') BETWEEN DATE_FORMAT(CURDATE(),'%y-%m-%d') AND DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 8 Week), '%y-%m-%d') ORDER BY DATUM ASC";
              // […]
              if(!$result $db->query($SQL))
              // […]
              while ($row mysqli_fetch_array($result,MYSQLI_ASSOC))
              {
              $SQL2 "SELECT * FROM `turnierkonfig` WHERE DATE_FORMAT(DATUM, '%d.%m.%y') = DATE_FORMAT('".$row['DATUM']."', '%d.%m.%y')"
              Verschachtelte Datenbankabfragen solltest du unbedingt vermeiden - beschäftige dich mit JOINs um alle Daten auf einmal abzufragen. Und wie schon geschrieben: verwende niemals »SELECT *«.
              Auch musst du dich entscheiden ob du objektorientiert oder prozedural arbeiten willst - aber mischen ist nicht.

              zum restlichen Code noch ein paar Hinweise am Rande (ist für das eigentliche Problem nicht relevant, solltest du aber langfristig beachten):
              - das p nach h2 ist falsch, das kannst du nicht als Container für die ganzen Formulare nehmen
              - vergiss float zum Formatieren, beschäftige dich mit grid bzw. flex
              - die Formularelemente brauchen eine id, sonst kann der Browser sie den label-Elementen nicht zuordnen
              - für Felder die ein Datum erwarten gibt es type=date
              - die input-Elemente mit readonly möchten gerne keine input-Elemente sein
              - der submit-Button wäre gerne ein richtiger <button>
              - Spaltennamen schreibt man im SQL üblicherweise klein, das verbessert die Lesbarkeit da sie dann von SQL-Elementen (die groß geschrieben werden) besser zu unterscheiden sind.

              Zitat von doofi Beitrag anzeigen
              Hier nochmal die Versionen, die verwendet werden (vorher=geht, nachher=geht nicht)
              Du verwendest also überhaupt kein MySQL sondern MariaDB und die Umstellung ist von PHP 7.4 auf 8.0 bzw. MariaDB 10.1 auf 10.4 wobei ich bei letzterem nicht weiß wie groß da die Unterschiede sind.

              Kommentar


              • #8
                Ok, danke für die vielen hilfreichen Tipps.. Das Problem waren wohl einige Null-Werte in der Tabelle, da werde ich mich mal mit beschäftigen und dann daran gehen, die anderen kinken noch zu entfernen. Danke Euch!!!

                Kommentar

                Lädt...
                X