Petja: Tausch der ID zweier Einträge

Ich möchte gern in PHP eine MYSQL anweisung aufrufen, die dann von den Datensatz von einer übergebenen ID mit dem Datensatz mit der nächsthöheren ID tauscht.

Dafür habe ich folgenden Query, welcher in phpmyadmin auch das bewirkt was er soll, aber in PHP ausgeführt Syntax error wirft:

SET @temp = (select max(ID) from " . $edit . ");
UPDATE " . $edit . " SET ID = @temp + 1 WHERE ID = " . $bID . ";
UPDATE " . $edit . " SET ID = " . $bID . " WHERE ID = " . $bID . "+1;
UPDATE " . $edit . " SET ID = " . $bID . "+1 WHERE ID = @temp + 1;

Dabei ist $edit die gewünschte Datenbank wo der Tausch ausgeführt wird und $bID ist die ID die mit der nächst höheren getauscht werden soll.

Weiss jemand warum das in PHP nicht will? Der Komplette PHP teil hier auch noch mal:

...
$try = "SET @temp = (SELECT max(SID) from WMSpiele);
 UPDATE WMSpiele SET SID = @temp + 1 WHERE SID = 1;
 UPDATE WMSpiele SET SID = 1 WHERE SID = 1 +1;
 UPDATE WMSpiele SET SID = 1+1 WHERE SID = @temp + 1";
 mysql_query($try) OR die(mysql_error());
...

  1. Sorry der PHP Text oben ist aus nem Beispiel zum Testen gewesen in dem die ID=1 getauscht werden sollte, ich hoff das führt nicht zu verwirrung :-)

    1. Hello,

      ich hoff das führt nicht zu verwirrung :-)

      ne, tut es nicht. Du hast kein PHP Problem, du hast ein MySQL Problem und vmtl. ein Verständnisproblem, aber das nur am Rande: Man tauscht keine IDs, IDs sind dem Namen nach zur Identifizierung da, nicht zur Reihenfolgebildung...
      Dein SQL sieht mir sehr nach dem Inhalt einer Stored Procedure aus, du versuchst hier mehrere Befehle in einem zu verwenden, das geht AFAIK nicht in einem Statement.

      MfG
      Rouven

      --
      -------------------
      Inter Arma Enim Silent Leges  --  Cicero
  2. Hello,

    Weiss jemand warum das in PHP nicht will? Der Komplette PHP teil hier auch noch mal:

    ...
    $try = "SET @temp = (SELECT max(SID) from WMSpiele);
    UPDATE WMSpiele SET SID = @temp + 1 WHERE SID = 1;
    UPDATE WMSpiele SET SID = 1 WHERE SID = 1 +1;
    UPDATE WMSpiele SET SID = 1+1 WHERE SID = @temp + 1";
    mysql_query($try) OR die(mysql_error());

    Ja, mehrere Statements gebündelt in einem Query sind ohne besondere Konfiguration von MySQL nicht zulässig.

    Dein Bedientool (phpMyAdnim) führt die auch nacheinander aus und, soweit ich weiß, sogar jedes mit einer eigenen Connection.

    Außerdem  müsstest Du für eine solche Aktion die Tabelle oder wenigstens die beiden betroffenen Datensätze sperren. Sowas versucht manaber möglichst zu vermeiden.

    Es gibt eine "Formel" zum Tausch von laufenden Nummern in einem Statement. Die findest Du hier im Archiv. Müsste 2004/2005 sein.

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Hello,

      ich habe Dir den Threas mal rausgesucht.

      http://forum.de.selfhtml.org/archiv/2004/9/t90776/#m545111

      Durch Subselect kann man auch noch den Aufsetzpunkt vorher bestimmen. Das gint bei MySQL 4 noch nicht,  aber bei MySQL 5.x ist es möglich.

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

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

      1. Hallo Tom,

        http://forum.de.selfhtml.org/archiv/2004/9/t90776/#m545111

        Durch Subselect kann man auch noch den Aufsetzpunkt vorher bestimmen. Das gint bei MySQL 4 noch nicht,

        selbstverständlich gibt es bei MySQL 4.1.x Subselects.

        Freundliche Grüße

        Vinzenz

        1. Hello,

          http://forum.de.selfhtml.org/archiv/2004/9/t90776/#m545111

          Durch Subselect kann man auch noch den Aufsetzpunkt vorher bestimmen. Das gint bei MySQL 4 noch nicht,

          selbstverständlich gibt es bei MySQL 4.1.x Subselects.

          Dann wäre es sehr nett, wenn Du das vollständige Statement dafür nochmal publizieren könntest. Wenn ich es jetzt tun würde, müsstest Du dich hinterher wahrscheinlich sowieso wieder einschalten *gg*

          (und außerdem habe ich momentan KEINE lauffähige Version größer 4.0 zur Verfügung *wetter*#+*!*)

          Also zweio Fälle:

          1. bekannt ist die ID des Vorgängers,
             der mit seinem Nachfolger tauschen soll

          2. bekannt ist die ID des Nachfolgers,
             der mit seinem Vorgänger tauschen will

          Ich wäre Dir sehr verbunden, denn wie Du siehst, merke ich mir die Lösungen...

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

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    2. echo $begrüßung;

      Dein Bedientool (phpMyAdnim) führt die auch nacheinander aus und, soweit ich weiß, sogar jedes mit einer eigenen Connection.

      Der erste Teil ist richtig, der zweite nicht. Denn dann könnte man benutzerdefinierte Variablen nicht verwenden, was aber sowohl laut OP als auch nach Ausprobieren problemlos verwendet werden kann.

      echo "$verabschiedung $name";

      1. Hello,

        Dein Bedientool (phpMyAdnim) führt die auch nacheinander aus und, soweit ich weiß, sogar jedes mit einer eigenen Connection.

        Der erste Teil ist richtig, der zweite nicht. Denn dann könnte man benutzerdefinierte Variablen nicht verwenden, was aber sowohl laut OP als auch nach Ausprobieren problemlos verwendet werden kann.

        Kommt auch auf die Version an. Es gab da durchaus welche, die mysql_insertid() nicht konnten.

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    3. Hallo Tom,

      $try = "SET @temp = (SELECT max(SID) from WMSpiele);
      UPDATE WMSpiele SET SID = @temp + 1 WHERE SID = 1;
      UPDATE WMSpiele SET SID = 1 WHERE SID = 1 +1;
      UPDATE WMSpiele SET SID = 1+1 WHERE SID = @temp + 1";
      mysql_query($try) OR die(mysql_error());

      Ja, mehrere Statements gebündelt in einem Query sind ohne besondere Konfiguration von MySQL nicht zulässig.

      Selbstverständlich werden mehrere durch Semikolon getrennte, gebündelte
      Anweisungen von MySQL ohne besondere Konfiguration ausgeführt. Das stellt
      überhaupt gar kein Problem dar.

      Nur mysql_query ist dazu nicht (mehr) in der Lage. Das ist ein PHP-spezifisches
      Problem, kein MySQL-Problem. Will man von PHP aus so etwas nutzen, so kann
      man die mysqli-Funktionen verwenden: mysqli_multi_query().

      Freundliche Grüße

      Vinzenz

      1. echo $begrüßung;

        Achtung, liebe Leser! Bitte nachfolgend nicht durcheinanderkommen mit den Funktionen der MySQL-API und denen von PHP, die teilweise gleiche oder fast gleiche Namen haben.

        Selbstverständlich werden mehrere durch Semikolon getrennte, gebündelte
        Anweisungen von MySQL ohne besondere Konfiguration ausgeführt. Das stellt
        überhaupt gar kein Problem dar.

        Ganz so selbstverständlich ist es nicht. Man muss dazu die MySQL-API-Funktion mysql_real_connect() mit dem Client-Flag CLIENT_MULTI_STATEMENTS aufrufen. PHP verwendet zwar in der mysql-Extension intern auch teilweise mysql_real_connect(), lässt aber dieses Flag aus. Selbst unter der mysqli-Extension, in der es ein mysqli_real_connect() extra zum mysqli_connect() gibt, lässt sich dieses Flag nicht setzen. Nur hier geht PHP einen eigenen Weg mit mysqli_multi_query(), es schaltet bei Verwendung dieser Funktion nachträglich über die MySQL-API-Funktion mysql_set_server_option() mit MYSQL_OPTION_MULTI_STATEMENTS_ON die Ausführung von mehreren Statements ein und danach wieder aus. Extra noch setzt es vor jeder Verwendung von mysqli_query() und mysqli_real_query() explizit MYSQL_OPTION_MULTI_STATEMENTS_OFF. Man ist also auf mysqli_multi_query() angewiesen, wenn man denn unbedingt Multi-Statements verwenden möchte.

        Nur mysql_query ist dazu nicht (mehr) in der Lage. Das ist ein PHP-spezifisches
        Problem, kein MySQL-Problem. Will man von PHP aus so etwas nutzen, so kann
        man die mysqli-Funktionen verwenden: mysqli_multi_query().

        Das Flag, um multiple Statemens ausführen zu können, ist erst in MySQL Version 4.1 eingeführt worden. Daraus schlussfolgere ich, dass auch MySQL sich selbst schon früher gegen Multi-Statements gesperrt hat. Leider gibt es keine älteren Versionen mehr im MySQL-Archiv zum Download, so dass ich das nicht mehr in früheren Ausgaben vergleichen kann.

        echo "$verabschiedung $name";

        1. Hello,

          Das Flag, um multiple Statemens ausführen zu können, ist erst in MySQL Version 4.1 eingeführt worden. Daraus schlussfolgere ich, dass auch MySQL sich selbst schon früher gegen Multi-Statements gesperrt hat. Leider gibt es keine älteren Versionen mehr im MySQL-Archiv zum Download, so dass ich das nicht mehr in früheren Ausgaben vergleichen kann.

          Wenn Du eine Installation meinst, ich habe noch eine funktionstüchtige 3.23.55 hier neben mir liegen.
          Nur mit dem Handbuch werde ich nicht mehr dienen können. Da gibt es bestimmt noch eines auf einem alten NOVELL-Server, der eingemottet auf dem Boden steht, aber ob _der_ noch läuft ???

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

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

          1. echo $begrüßung;

            Wenn Du eine Installation meinst, ich habe noch eine funktionstüchtige 3.23.55 hier neben mir liegen.
            Nur mit dem Handbuch werde ich nicht mehr dienen können. Da gibt es bestimmt noch eines auf einem alten NOVELL-Server, der eingemottet auf dem Boden steht, aber ob _der_ noch läuft ???

            Genau auf das Handbuch wäre es mir angekommen. Allerdings kann man da auch nicht das aus den neueren zz der jeweiligen Versionen gemäß Schema x.yy.zz verwenden, da diese oft schon die Handbücher der nachfolgenden Version sind. Aber im Grunde genommen ist es auch egal, da weiterzuforschen. Das Betrachten dieser alten Versionen bringt auch keine wesentlichen Erkenntnisse für die Verwendung der aktuellen Gegebenheiten.

            echo "$verabschiedung $name";

            1. Hello,

              Genau auf das Handbuch wäre es mir angekommen. Allerdings kann man da auch nicht das aus den neueren zz der jeweiligen Versionen gemäß Schema x.yy.zz verwenden, da diese oft schon die Handbücher der nachfolgenden Version sind. Aber im Grunde genommen ist es auch egal, da weiterzuforschen. Das Betrachten dieser alten Versionen bringt auch keine wesentlichen Erkenntnisse für die Verwendung der aktuellen Gegebenheiten.

              Das mag stimmen.
              Es ist auch machmal ganzn amusant, mit welcher Begründung in äöteren Versionen dies und das nicht implementiert war und wie vehement das vertreten wurde...

              Ich bin gespannt, wann man zu einer verlässlichen Increment-Lösung für verlorene Autoschlüssel findet bei MySQL...

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

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)