hans: mySQL: nach editieren kein effekt.

Hallo,

irgendwie stell ich mich doof an, ein altes script funktioniert auf einer anderen mySQL-Tabelle nicht mehr: Ich lese eine Tabelle mit vielen Zeilen und 19 Feldern aus und gebe sie zeilenweise in einer HTML-Tabelle aus. Jede Zeile kann per checkbox angehakt werden, um dann Feldweise edeitiert zu werden. Inahlt sind Benutzerwerte, ID ,Vorname, Nachname, usw.

zunächste lese ich alle Werte aus und gebe sie zweilenweise aus.

========eins.php=============
<form action="zwei.php" method="post">

$lesen = mysql_query( "SELECT * FROM table ORDER BY id DESC;", $link );
if ( ! $lesen){ die ( "Auslesen macht fatal error: ".mysql_error() ); }
while($alles = mysql_fetch_array($lesen, MYSQL_NUM)){
 foreach($alles as $k => $v){
  $id=$alles[0];
            $vorname=alles[1];
             ...
       }//Ende foreach
echo "
  <td><input type="checkbox" name="changedata[]" value="$id">
  </td><td>$id</td><td>$vorname</td>...usw...
"
}
...submit...Form schliessen
========/ende eins.php=============

die "Übergabe" an zwei.php klappt auch, die angehakte(n) Zeile(n) werden (mit Ausnahme der ID, die nicht editierbar ist) in Textfeldern zum editieren ausgegeben:

========zwei.php=============
<form action="drei.php" method="post">

$changedata = $_REQUEST['changedata'];

foreach($changedata as $k => $v){
  $userdaten2 = mysql_query("SELECT * FROM table WHERE id='$v';")or die ("konnte Datensatz mit ID='$v' nicht aus Tabelle auslesen ").mysql_error();

$userdaten = mysql_fetch_array($userdaten2,  MYSQL_BOTH);

echo "
 <input type="hidden" name="thisuser[]" value="$userdaten">
 <tr>
 <td>
   $userdaten[id] <!-- ID darstellen, aber nicht editierbar -->
   <input type="hidden" name="id[$k]" value="$userdaten[id]">
 </td>
      <td valign="top">
   <input type="text" name="vorname[$k]" value="$userdaten[vorname]">
 </td>
      ....usw.
";
}//Ende foreach
...Tabelle schliessen, Form submitten und schliessen usw.
========/Ende zwei.php=============

Das geht auch alles, für jede "angehakte" Zeile werden die Werte in Textfeldern ausgegeben. Wenn man nun was verändertr, sollen die neuen Werte in die TAbelle zurückgeschrieben werden.

Aber in drei.php wird nichts mehr dargestellt, eine Fehlermeldung findet auch nicht statt.

========drei.php=============

$thisuser = $_REQUEST['thisuser'];

echo "<table>";
foreach ($thisuser as $k => $v){
   //test-echo:
   echo "K:$k, v: $v<br>";
    $eintrag = mysql_query("UPDATE table SET vorname="$vorname[$k]",  nachname="$nachname", ...usw... WHERE id="$id[$k]";")
   or die("konnte Datensatz für Benutzer mit $vorname[$k] $nachname[$k] nicht aendern ".mysql_error());

//Ausgeben der neuen Werte
 echo "
   <tr>
        <td colspan="19">NEUE WERTE:</td></tr>
   <tr class="red">
  <td> $id[$k] </td>
            <td> $vorname[$k] </td>
          ...usw.
       ";
}//Ende foreach
</table>
========/Ende drei.php=============

$v wird als "Array" in der test-echo Zeile ausgegeben, ($v[0] als "A") aber nicht als Wert zum schlüssel $k im array $thisuser. Alle <td> werden generiert, sind aber leer.
Das foreach wird auch akzeptiert. Es gibt keinen Fehler.

Dasselbe, recht einfache, script hab ich vor zwei Jahren auf eine andere Tabelle angewendet. Jetzt erkenne ich aber nicht warum sowohl das UPDATE durchlaufen wird, aber nichts passiert, egal was ich vorher an den Werten in den Eingabefeldern auf zwei.php verändert habe.
Irgendwie muss ich Tomaten auf den Augen haben, ich bin für jede Hilfe dankbar.

bis dann,
Hans

  1. Hallo Hans,

    also zunächstmal solltest Du in mysql-tags immer einfache Anführungszeichen (') anstelle von " verwenden. Dann werden in mysql-tags keine Arrays ausgelesen. Das heißt, das Update müsste dann so aussehen:

    $id = $id[$k];
    $vorname = $vorname[$k];
    $nachname = $nachname[$k];
    $eintrag = mysql_query("UPDATE table SET vorname='$vorname',  nachname='$nachname', ...usw... WHERE id='$id'");

    Ausserdem gehört das Simikolon, welches nach id="$id[$k]";" steht, dort nicht hin.

    Gruß,
    Stephan

    1. Hallo Stephan,

      also zunächstmal solltest Du in mysql-tags immer einfache Anführungszeichen (') anstelle von " verwenden.

      vielen Dank. Das macht es schon mal übersichtlicher.

      Dann werden in mysql-tags keine Arrays ausgelesen. Das heißt, das Update müsste dann so aussehen:

      $id = $id[$k];
      $vorname = $vorname[$k];
      $nachname = $nachname[$k];
      $eintrag = mysql_query("UPDATE table SET vorname='$vorname',  nachname='$nachname', ...usw... WHERE id='$id'");

      Ausserdem gehört das Simikolon, welches nach id="$id[$k]";" steht, dort nicht hin.

      Danke. ich hab jetzt auf der UPDATE-Seite

      ================
      thisuser = $_REQUEST['thisuser'];

      foreach ($thisuser as $k => $v){

      $id = $id[$k];
        $vorname = $vorname[$k];
        $nachname = $nachname[$k];

      $eintrag = mysql_query("UPDATE table SET vorname='$vorname', nachname='$nachname', ... WHERE WHERE id='$id'") or die ("meldung".mysql_error());
      }

      //und dann die Ausgabe
      echo "$id, $vorname"; usw.

      aber die Anzeige bleibt leer, (der Quelltext auch).

      Habe ich das richtig gemacht?

      Danke und viele Grüße,
      hans

      1. $eintrag = mysql_query("UPDATE table SET vorname='$vorname', nachname='$nachname', ... WHERE WHERE id='$id'")

        Sorry, das "WHERE WHERE" ist natürlich nur falsch ins Forum übertragen. Im Script steht es nur einmal.

        1. Hallo Hans,

          $eintrag brauchst Du nicht, da der Befehlt direkt ausgeführt werden soll. Ansonsten müsstest Du ihn explizit aufrufen.

          Die ausgabe muss mit in der foreach-Schleife stehen, da sonst (wenn denn dann was steht) nur der letzte Wert ausgegeben wird.
          Also
          foreach(...) {
            mysql...
            echo $id.", ".$name.", "usw.<br>";
          }

          Gruß,
          Stephan...

          1. Hallo Stephan,

            $eintrag brauchst Du nicht, da der Befehlt direkt ausgeführt werden soll. Ansonsten müsstest Du ihn explizit aufrufen.

            wie passiert das UPDATE denn ohne Befehl?

            Die ausgabe muss mit in der foreach-Schleife stehen, da sonst (wenn denn dann was steht) nur der letzte Wert ausgegeben wird.
            Also
            foreach(...) {
              mysql...
              echo $id.", ".$name.", "usw.<br>";
            }

            aber die Ausgabe steht in der foreach. Genau das ist ja mein Problem. (also nicht, dass es dort steht ;) sondern dass dort nichts ausgegeben wird obwohl syntaktisch nichts angemeckert wird).

            viele GRüße,
            Hans

            1. Hallo Eugen,

              mysql_query ist der Befehl. Wenn Du $eintrag verwendest, wird der Befehl in einer Variablen gespeichert und muss explizit aufgerufen werden. Schau doch mal, ob sich in der DB direkt etwas geändert hat. Wenn nicht, wird der Befehl nicht ausgeführt.

              Und Du hast recht, die Ausgabe steht bereits in der Schleife.

              Gruß,
              Stephan

              1. Moin!

                mysql_query ist der Befehl. Wenn Du $eintrag verwendest, wird der Befehl in einer Variablen gespeichert und muss explizit aufgerufen werden. Schau doch mal, ob sich in der DB direkt etwas geändert hat. Wenn nicht, wird der Befehl nicht ausgeführt.

                Blödsinn. mysql_query() ist der Funktionsaufruf, welcher die Aktion ausführt und einen Ergebniswert (in diesem Fall false, wenn was schiefgeht, oder einen Zeiger auf eine MySQL-Ergebnisressource) zurückgibt - diesen Wert in einer Variablen zu speichern ist absolut korrekt und in Ordnung.

                - Sven Rautenberg

  2. Moin!

    $userdaten = mysql_fetch_array($userdaten2,  MYSQL_BOTH);

    Hier packst du ein Array in $userdaten.

    echo "
    <input type="hidden" name="thisuser[]" value="$userdaten">

    Und hier versuchst du, das komplette Array dann auszugeben, was natürlich scheitert und nur zum Text "Array" führt. Dieser Wert kann später dann nicht korrekt weiterverarbeitet werden:

    $thisuser = $_REQUEST['thisuser'];

    $thisuser[0]="Array";
    $thisuser[1]="Array";
    ...

    sowas dürfte an dieser Stelle ankommen in deinem dritten Skript für jede angehakte Zeile.

    - Sven Rautenberg