Kris: SELECT MAX MySQL Abfrage hackt :/

Abend allerseits ...

Ich weiß nicht warum aber ich habe scheinbar einen kleinen Denkfehler. Ob es an der Syntax liegt oder einfach nur an einem dummen Schreibfehler hab ich immer noch nicht rausgefunden.

Ich will aus einer Reihe die NICHT AutoIncrement den aktuell höchsten holen und dann in einer Variable als nächst möglich hohen speichern.
Sprich Reihe A hat als höchste Zahl 12 - somit soll meine Variable 13 entsprechen. Mit NUM_ROWS wird das nicht funktionieren, da evtl. auch mal eine Reihe gelöscht (das im vorraus)

bisher sieht es so aus :

$query = "SELECT MAX(zahl) AS zahl FROM table\_xyz";
$result = mysql_query($query);
$row = mysql_fetch_row($result);
$neuezahl = $row[0] + 1;

--- ODER ---

$query = "SELECT MAX(zahl) AS zahl FROM table\_xyz";
$result = mysql_query($query);
$row = mysql_result($result_post, 0);
$neuezahl = $row + 1;

beides funktioniert nicht und bleibt genau bei der Variable $row kleben :/
Das erste Query verläuft reibungslos ...

wer kann mir helfen ? :/

mfg

KRIS !

  1. echo $begrüßung;

    beides funktioniert nicht und bleibt genau bei der Variable $row kleben :/

    "bleibt kleben" ist leider nicht nachvollziehbar. Beschreibe bitte genau, was passiert oder auch was nicht passiert.

    Das erste Query verläuft reibungslos ...

    Da du nur zwei Querys gegeben hast, die beide "kleben bleiben", ist diese Aussage widersprüchlich.

    $query = "SELECT MAX(zahl) AS zahl FROM table\_xyz";
    $result = mysql_query($query);
    $row = mysql_result($result_post, 0);

    Was passiert denn, wenn du mal die MySQL-Fehlermeldungen nicht unter den Tisch fallen ließest und auf beide unterschiedliche Rückgabewerte (Resource und false) von mysql_query() angemessen reagiertest? Ein Beispiel für eine Abfrage inklusive Fehlerauswertung findest du im Kapitel zu MySQL im PHP-Handbuch

    Fällt dir was auf, wenn du mal dein Script laufen lässt, wenn das error_reporting auf E_ALL steht?

    echo "$verabschiedung $name";

    1. "bleibt kleben" ist leider nicht nachvollziehbar. Beschreibe bitte genau, was passiert oder auch was nicht passiert.

      er kann nicht weiterrechnen mit den Variablen da er Fehler ausgibt und die Variablen folglich als leer definiert werden.

      Da du nur zwei Querys gegeben hast, die beide "kleben bleiben", ist diese Aussage widersprüchlich.

      evtl. falsch ausgedrückt. Die Querys funktionieren beide jeweils ... lediglich die $result Variable wird nicht berechnet !
      dank folgender Fehler :

      Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource

      Warning: mysql_result(): supplied argument is not a valid MySQL result resource

      Die Querys liefer auf alle fälle einen WiedegabeWert, das habe ich über PHPmyAdmin geklärt ...

      1. echo $begrüßung;

        Die Querys funktionieren beide jeweils ... lediglich die $result Variable wird nicht berechnet !
        dank folgender Fehler :

        Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource

        Dieser Fehler ist ein sicheres Zeichen dafür, dass die Query nicht gelaufen ist. mysql_query() gibt im Fehlerfall false statt einer Resource, die die mysl_fetch-Funktionen als Parameter erwarten, zurück. Ich wiederhole mich: Ignoriere die MySQL-Fehlermeldungen nicht (mysql_error() abfragen!) und baue deine Abfrage gemäß dem Beispiel im Handbuch um.

        echo "$verabschiedung $name";

        1. omg viel dank Dedlix ... da sucht man den Fehler wie blöd und merkt ... der error will mir eigentlich sagen das ich nicht in falschen Datenbank suchen sollte -.-

          gruß

          KRIS

          P.S. mysql_error() hab ich bisher nie wirklich genutzt ... sehr fatal und nun weiß ich warum es so wichtig sein kann ;)

          1. Hello,

            omg viel dank Dedlix ... da sucht man den Fehler wie blöd und merkt ... der error will mir eigentlich sagen das ich nicht in falschen Datenbank suchen sollte -.-

            ... deshalb solltest Du nicht nur alle Statusmeldungen (Fehlercodes) auswerten, sondern auch immer über ein qualifiziertes Handle (Connection) zugreifen.

            Außerdem hat Deine Überlegung noch eine dicke Macke, die im aktiven Betrieb zu Fehlern führen wird.

            Deine Vorgehensweise müsste auf jeden Fall so aussehen:

            sperre Tabelle
              hole größten Wert
              zähle ih eins rauf
              speichere neuen Satz
              entsperre Tabelle

            Das gilt auch für MySQL, nicht nur für Zähler auf Flatfilebasis.

            Wenn Du aber das Select und das Insert Statement in einem gemeinsamen zusammenbauen kannst, dann kannst Du Dir das Sperren sparen, da einzelne Queries DBMS-weit serialisiert und atomar ausgeführt werden. Das gilt aber eben nicht, wenn Du zwei Queries benötigst. Da passen dann beliebig viele andere Queries anderer Connections dazwischen.

            Ich weiß leider nicht, ob man mit MySQL inzwischen ein Subselect auf Max() in ein Insert einbauen kann. Wer kann helfen?

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Hallo Freunde des gehobenen Forumsgenusses,

              Ich weiß leider nicht, ob man mit MySQL inzwischen ein Subselect auf Max() in ein Insert einbauen kann. Wer kann helfen?

              Eine Methode wäre z.B. folgende:
              update table_xyz set zahl = zahl + 1 order by zahl desc limit 1;
              Frag mich nicht, ob das langsamer als max() ist, keine Ahnung.

              Gruß
              Alexander Brock

              1. Hello,

                Eine Methode wäre z.B. folgende:
                update table_xyz set zahl = zahl + 1 order by zahl desc limit 1;

                Hast Du das mal ausprobiert?
                Update und Order passen nicht in ein Statement...

                Harzliche Grüße vom Berg
                http://www.annerschbarrich.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                Nur selber lernen macht schlau

                1. Hallo Freunde des gehobenen Forumsgenusses,

                  Hast Du das mal ausprobiert?

                  Ja. Es funktioniert unter W2K mit Mysql 4.fragmichnich

                  Update und Order passen nicht in ein Statement...

                  Irgendwie doch.

                  Gruß
                  Alexander Brock

                  1. Hello,

                    Hast Du das mal ausprobiert?

                    Ja. Es funktioniert unter W2K mit Mysql 4.fragmichnich

                    Update und Order passen nicht in ein Statement...

                    Irgendwie doch.

                    Ist ja heiß. Ich war der Meinung, dass Order nur die Ausgabemenge sortiert.
                    Und Update hat gar keine.

                    Steht da tatsächlich, dass das geht
                    http://dev.mysql.com/doc/refman/4.0/de/update.html

                    Bei meiner ollen Version geht es noch nicht.

                    Update test set X=X+1 order by X limit 4;
                    liefert
                       Fehler in der Syntax bei 'order by X limit 4' in Zeile 1.

                    Harzliche Grüße vom Berg
                    http://www.annerschbarrich.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    Nur selber lernen macht schlau

                    1. Moin!

                      Steht da tatsächlich, dass das geht
                      http://dev.mysql.com/doc/refman/4.0/de/update.html

                      Nein, im Handbuch der Version 4.0 steht nicht, dass es geht. Das Syntaxdiagramm schreibt nichts von "ORDER BY". Dass im Text davon gesprochen wird, halte ich für einen Übersetzungsfehler. Die englische Version steht aber schon nicht mehr zur Verfügung.

                      Im Handbuch der Version 4.1 steht, dass es geht:
                      http://dev.mysql.com/doc/refman/4.1/en/update.html

                      - Sven Rautenberg

                      --
                      My sssignature, my preciousssss!
                      1. echo $begrüßung;

                        Die englische Version [des 4.0er Handbuchs] steht aber schon nicht mehr zur Verfügung.

                        Wenn ältere Versionen nicht mehr online lesbar sind, dann sollten sie aber noch in den Download-Paketen zu den jeweiligen Versionen enthalten sein. Wobei manchmal schon in Paketen, zu dessen Veröffentlichungszeitpunkt schon eine neuere Version bekannt war, das neuere Handbuch enthalten ist. "Richtige" x.y-er Handbücher sind also meist in den frühen x.y-er Versionen zu finden.

                        echo "$verabschiedung $name";

              2. Hallo Alexander,

                Ich weiß leider nicht, ob man mit MySQL inzwischen ein Subselect auf Max() in ein Insert einbauen kann. Wer kann helfen?

                Eine Methode wäre z.B. folgende:
                update table_xyz set zahl = zahl + 1 order by zahl desc limit 1;

                statt einen neuen Datensatz mit einem bestimmten Wert einzufügen, veränderst Du die Werte _aller_ Datensätze.

                Frag mich nicht, ob das langsamer als max() ist, keine Ahnung.

                Es ist etwas völlig anderes, also spielt die Geschwindigkeit keine Rolle :-)

                Freundliche Grüße

                Vinzenz

                1. Hallo Freunde des gehobenen Forumsgenusses,

                  Eine Methode wäre z.B. folgende:
                  update table_xyz set zahl = zahl + 1 order by zahl desc limit 1;

                  statt einen neuen Datensatz mit einem bestimmten Wert einzufügen, veränderst Du die Werte _aller_ Datensätze.

                  Nein, ich sortiere absteigend nach Größe und ändere nur den obersten (limit 1).

                  Gruß
                  Alexander Brock