Crueli: Variablenübergabe funktioniert nicht (PHP + mysql)

Hallo,
habe das Problem, dass POST-Variablen an die DB nicht mehr übergeben werden. Ich schätze, dass es durch ein Update der mysql oder PHP-Version kam.

if (isset($\_GET['save']))  
{  
	for ($i=1;$i<=18;$i++)  
	{  
			$sql = "UPDATE kartei SET name ='".($\_POST['name'.$i])."', name\_kurz ='".($\_POST['kurzname'.$i])."', chef = '".($\_POST['chef'.$i])."', link\_url = '".($\_POST['link\_url'.$i])."' WHERE id = '".$i."' AND jahr = '".$GLOBALS['edit\_jahr']."';";  
		$result = mysql\_query($sql,$db) or die ("Ungueltige Eingabe beim DB-Zugriff 1 bitte info an <a href=\"mailto:".$mailadmin."\">Webmaster</a>");  
		echo $sql;  
	}		  
	echo "Daten gespeichert.";  
}  

Lasse ich mir das Statement über die Oberfläche ausgeben, dann wird mir das Statement richtig mit allen Werten angezeigt und ich kann es über die DB direkt (phpmyadmin) eingeben und es funktioniert (wird also gespeichert). Über die Oberfläche wird nichts gespeichert, da wohl überall Leerzeichen als Werte gesetzt werden. Dies ist meine Schlussfolgerung. Gebe ich nämlich einen festen Wert ein, wird dieser gespeichert. Irgendwas stimmt also wohl mit der Übergabe der Wert an die DB nicht.

Hat jemand eine Ahnung was ich da falsch mache bzw. was durch ein Update der PHP bzw. Mysql Version veraltet ist?

Danke u Gruß,
crueli

  1. Hi,

    Lasse ich mir das Statement über die Oberfläche ausgeben,

    "Über die Oberfläche" heisst - Kontrollausgabe aus dem Script heraus, im Browser?

    dann wird mir das Statement richtig mit allen Werten angezeigt und ich kann es über die DB direkt (phpmyadmin) eingeben und es funktioniert (wird also gespeichert). Über die Oberfläche wird nichts gespeichert, da wohl überall Leerzeichen als Werte gesetzt werden.

    Du hast doch gerade eben behauptet, über "die Oberfläche" wäre das Statement bei einer Kontrollausgabe korrekt mit den gewünschten Werten befüllt?

    Irgendwas stimmt also wohl mit der Übergabe der Wert an die DB nicht.

    Mit deiner Problembeschreibung stimmt was nicht, weil sie in sich widersprüchlich ist.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Mit deiner Problembeschreibung stimmt was nicht, weil sie in sich widersprüchlich ist.

      MfG ChrisB

      Laß Dich nicht beirren. Diee Problembeschreibung war verständlich. Nur in einem Punkt nicht. Sind die Werte in der Query drin oder setzt Du sie in phpmyadmin manuell nach?

      Eine Query ist immer ganz hilfreich bei solchen Problemen. Und da Du sie schon ausgibst, gib sie mal ins Forum weiter.

      Grüße

      1. Sind die Werte in der Query drin oder setzt Du sie in phpmyadmin manuell nach?

        Doch, verstanden.
        In der Query stehen sie, aber in der db nicht.

        Keine Fehlermeldung? Nur einfach ein Eintrag in der db mit lauter NULL-Werten, außer den Standart und auto_increment Werten??

        1. Sind die Werte in der Query drin oder setzt Du sie in phpmyadmin manuell nach?

          Doch, verstanden.
          In der Query stehen sie, aber in der db nicht.

          Keine Fehlermeldung? Nur einfach ein Eintrag in der db mit lauter NULL-Werten, außer den Standart und auto_increment Werten??

          Hi,
          ja, genau so ist es. Es werden nur Leerzeichen eingesetzt, außer beim Auto-Inkrement. Das was ich über echo $sql über die Oberfläche ausgegeben bekomme (die POST-Variablen werden richtig eingesetzt) funktioniert einwandfrei, wenn ich es über PHPmyadmin direkt in die DB hämmere.

          Dieses Skript lief lange einwandfrei. Ich benötige es meist 1,2 mal jährlich und dieses Mal klappts nicht mehr. Von daher hat sich wohl durch ein Versionsupdate etwas verändert. Irgendeine Form der Verarbeitung ist wohl veraltet.

          Gruß,
          crueli

  2. Hi!

    habe das Problem, dass POST-Variablen an die DB nicht mehr übergeben werden. Ich schätze, dass es durch ein Update der mysql oder PHP-Version kam.

    Schätzen allein reicht nicht, um die Ursache zu finden. Kontrolliere deine Annahme mit Kontrollausgaben. Sind die gewünschten Werte in den vorgesehenen Variablen enthalten? var_dump() erzeugt die genauesten Ausgaben (inklusive Typ und Stringlängenangabe).

      		$sql = [...]  
      	$result = mysql\_query($sql,$db) or die ([...]);  
      	echo $sql;  
    

    Gut, hier machst du eine Kontrollausgabe des fertigen Statements und sagst, es sei richtig. Die Query wird vermutlich auch richtig ausgeführt, sonst hättest du von einem Ausführungsfehler berichtet, die dir von der rudimentären Fehlerbehandlung mit die() angezeigt worden wäre.

    Lasse ich mir das Statement über die Oberfläche ausgeben, dann wird mir das Statement richtig mit allen Werten angezeigt und ich kann es über die DB direkt (phpmyadmin) eingeben und es funktioniert (wird also gespeichert). Über die Oberfläche wird nichts gespeichert, da wohl überall Leerzeichen als Werte gesetzt werden.

    Das ist widersprüchlich. Mit Oberfläche meinst du wohl beim ersten Mal die Ausgabe deines Script an den Browser und beim zweiten Mal dein Script selbst. Wenn die Kontrollausgabe richtig war, und trotzdem Leerzeichen (Leerzeichen oder Leerstrings?) im DBMS landen, sind irgendwo noch Verarbeitungsschritte dazwischen, oder es passiert etwas komplett anderes, mit dem du nicht gerechnet hast.

    Gebe ich nämlich einen festen Wert ein, wird dieser gespeichert. Irgendwas stimmt also wohl mit der Übergabe der Wert an die DB nicht.

    Dem DBMS ist es komplett egal, ob die Query zusammengebaut oder als fester String notiert wurde. Es zählt das, was sie zu Gesicht bekommt. Nimmst du für den "Fest"-Versuch die gleichen Werte wie sie über das Formular eingegeben werden?

    Hat jemand eine Ahnung was ich da falsch mache bzw. was durch ein Update der PHP bzw. Mysql Version veraltet ist?

    Um für die hintere Teilfrage konkrete Vermutungen anstellen zu können, wären die bisherigen und derzeitigen Versionen interessant.

    Wenn die Query angeblich richtig zusammengabaut wird und sie beim händischen Kopieren gegen das selbe DBMS klaglos ausgeführt wird, kann es kaum an Fehlern bezüglich Versionsimkompatibilität liegen.

    Du bist sicher, dass du keine Fehlermeldungen übersehen oder unterdrückt hast? error_reporting steht (zumindest für den Test) auf E_ALL und display_errors auf on? Die Ergebnisse aller MySQL-Funktionen (inklusive Logon) werden auf Fehlerwerte untersucht? (Zur Not mit einem die(), obwohl ich das in den meisten Fällen als dem Anwender gegenüber unangemessene Fehlerbehandlung ansehe.)

    Das was du im DBMS kontrollierst ist auch das, was das Script in diesem Durchlauf reinschreibt? Oder wird das Script - aus welchem Grunde auch immer - vielleicht ein zweites Mal ohn Werte aufgerufen und du betrachtest nur diese letzte Einfügung und nicht auch die vorhergehenden?

    Lo!

    1. Hi!

      habe das Problem, dass POST-Variablen an die DB nicht mehr übergeben werden. Ich schätze, dass es durch ein Update der mysql oder PHP-Version kam.

      Schätzen allein reicht nicht, um die Ursache zu finden. Kontrolliere deine Annahme mit Kontrollausgaben. Sind die gewünschten Werte in den vorgesehenen Variablen enthalten? var_dump() erzeugt die genauesten Ausgaben (inklusive Typ und Stringlängenangabe).

      Habe ein var_dump($_POST) unter echo $sql; eingefügt und die Variablen sind befüllt, wie auch bei der Ausgabe des sql-statements.

        		$sql = [...]  
        	$result = mysql\_query($sql,$db) or die ([...]);  
        	echo $sql;  
      

      Gut, hier machst du eine Kontrollausgabe des fertigen Statements und sagst, es sei richtig. Die Query wird vermutlich auch richtig ausgeführt, sonst hättest du von einem Ausführungsfehler berichtet, die dir von der rudimentären Fehlerbehandlung mit die() angezeigt worden wäre.

      Lasse ich mir das Statement über die Oberfläche ausgeben, dann wird mir das Statement richtig mit allen Werten angezeigt und ich kann es über die DB direkt (phpmyadmin) eingeben und es funktioniert (wird also gespeichert). Über die Oberfläche wird nichts gespeichert, da wohl überall Leerzeichen als Werte gesetzt werden.

      Das ist widersprüchlich. Mit Oberfläche meinst du wohl beim ersten Mal die Ausgabe deines Script an den Browser und beim zweiten Mal dein Script selbst. Wenn die Kontrollausgabe richtig war, und trotzdem Leerzeichen (Leerzeichen oder Leerstrings?) im DBMS landen, sind irgendwo noch Verarbeitungsschritte dazwischen, oder es passiert etwas komplett anderes, mit dem du nicht gerechnet hast.

      Leerstrings. Ich habe keine Verarbeitungsschritte ausgelassen (also Code), falls Du das hiermit meinst. Beim ersten Mal meine ich mit Oberfläche die Web-Oberfläche, also Script an den Browsers. Und beim zweiten Mal meine ich das Gleiche. Man kann über das Script nichts speichern...mit dem Einsetzen des SQL-Statements das mir das Skript ausgibt, in PHPmyadmin, gehts aber.

      Gebe ich nämlich einen festen Wert ein, wird dieser gespeichert. Irgendwas stimmt also wohl mit der Übergabe der Wert an die DB nicht.

      Dem DBMS ist es komplett egal, ob die Query zusammengebaut oder als fester String notiert wurde. Es zählt das, was sie zu Gesicht bekommt. Nimmst du für den "Fest"-Versuch die gleichen Werte wie sie über das Formular eingegeben werden?

      Ja, ich nehme den gleichen Wert. Wenn ich den Wert ins Skript einbinde (ohne Übergabe durch POST), funktionierts. Anders nicht.

      Hat jemand eine Ahnung was ich da falsch mache bzw. was durch ein Update der PHP bzw. Mysql Version veraltet ist?

      Um für die hintere Teilfrage konkrete Vermutungen anstellen zu können, wären die bisherigen und derzeitigen Versionen interessant.

      PHPmyadmin ist 2.11.5 und PHP 4.4.9

      Wenn die Query angeblich richtig zusammengabaut wird und sie beim händischen Kopieren gegen das selbe DBMS klaglos ausgeführt wird, kann es kaum an Fehlern bezüglich Versionsimkompatibilität liegen.

      Du bist sicher, dass du keine Fehlermeldungen übersehen oder unterdrückt hast? error_reporting steht (zumindest für den Test) auf E_ALL und display_errors auf on? Die Ergebnisse aller MySQL-Funktionen (inklusive Logon) werden auf Fehlerwerte untersucht? (Zur Not mit einem die(), obwohl ich das in den meisten Fällen als dem Anwender gegenüber unangemessene Fehlerbehandlung ansehe.)

      Nein, Fehler werden mir 'leider' auch keine ausgegeben.

      Das was du im DBMS kontrollierst ist auch das, was das Script in diesem Durchlauf reinschreibt? Oder wird das Script - aus welchem Grunde auch immer - vielleicht ein zweites Mal ohn Werte aufgerufen und du betrachtest nur diese letzte Einfügung und nicht auch die vorhergehenden?

      Das Skript wird noch mal aufgerufen und gibt dann einfach die Werte aus die eingegeben wurde. Kurioserweise gibt er sogar das aus (select-abfrage an die db) was ich eingegeben habe, aber in der DB steht gar nichts drin (Kontrolle über phpmyadmin). Lade ich die Seite dann aber neu, steht auch nix mehr drin.

      Lo!

      Danke schon mal für Hilfe! Das ist wirklich kurios und ich weiß nicht mehr so recht wo ich ansetzen soll.

      1. Hallo,

        Habe ein var_dump($_POST) unter echo $sql; eingefügt und die Variablen sind befüllt, wie auch bei der Ausgabe des sql-statements.

        und genau diesen Query-String kannst du mit Copy&Paste (nicht zu verwechseln mit Smith&Wesson) direkt im PMA eingeben, und er führt zum gewünschten Ergebnis? - Sehr eigenartig.

        (Leerzeichen oder Leerstrings?)
        Leerstrings.

        Aha. Achte bitte auf solche Kleinigkeitne bei den Bezeichnungen, das sind mitunter entscheidende Unterschiede, so wie hier. By the way: Leerstrings oder NULL-Werte?

        Ja, ich nehme den gleichen Wert. Wenn ich den Wert ins Skript einbinde (ohne Übergabe durch POST), funktionierts. Anders nicht.

        Das deutet eher darauf hin, dass bei der Übergabe der POST-Parameter ans Script schon etwas schiefgeht. Aber was, wenn du sagst, der zusammengebaute Query-String ist okay ...

        PHPmyadmin ist 2.11.5 und PHP 4.4.9

        Beim PMA bin ich nicht auf dem Laufenden; die PHP-Version ist dagegen hoffnungslos veraltet. Aktuell ist derzeit 5.3-irgendwas, eine 5 sollte aber zumindest vorne stehen.

        Nein, Fehler werden mir 'leider' auch keine ausgegeben.

        Und du sorgst auch wirklich dafür, dass du sie sehen könntest - indem du z.B. das Error_Reporting von PHP auf E_ALL stehen hast?

        Das Skript wird noch mal aufgerufen und gibt dann einfach die Werte aus die eingegeben wurde. Kurioserweise gibt er sogar das aus (select-abfrage an die db) was ich eingegeben habe, aber in der DB steht gar nichts drin (Kontrolle über phpmyadmin).

        Vermutlich irgendein Caching-Mechanismus von PHP: Hab ich eben reingeschrieben, muss also drin sein. Es bleibt aber mysteriös.

        Ciao,
         Martin

        --
        Noch Fragen? - Ich weiß es auch nicht.
        1. Hi,

          ja, genau den query-string kann ich in pma eingeben und zack es funktioniert. Fehlermeldungen haben ich aktiviert und es wurden mir zwei kleinere angezeigt die ich beheben konnte. Die hatten aber nichts mit dem Teil des Skripts zu tun.

          Ich bin ratlos... :(

          crueli

      2. Hi!

        Bitte etwas genauer und nachvollziehbar beschreiben. Es ist nicht nur in deinem Interesse, dass die Antwortenden alles Wesentliche so genau wie möglich erfahren sondern das dafür notwendige genaue Beobachten hilft auch dir, deine Fehlersuchfähigkeiten auszubauen.

        Das Skript wird noch mal aufgerufen und gibt dann einfach die Werte aus die eingegeben wurde. Kurioserweise gibt er sogar das aus (select-abfrage an die db) was ich eingegeben habe, aber in der DB steht gar nichts drin (Kontrolle über phpmyadmin).

        Meinst du hier, dass nach dem Eintragen und im selben Script eine Select-Abfrage auf den soeben eingegebenen Datensatz stattfindet und diese Werte dann ausgegeben werden? Oder sind das nur die Werte aus dem $_POST-Array, die ausgegeben werden? Wenn das erstere der Fall ist, so vermute ich mal, wird ein Programmteil aufgerufen, der ein Update vornimmt und dabei Leerstrings einträgt. Wenn diese Idee aus deiner Sicht wahrscheinlich genug ist, so prüfe den Ablauf in deinem Script. Welche Verzweigungen werden genommen? Setzt in die if- und die else-Zweige Kontrollausgaben und prüfe, welche davon ausgegeben werden.

        Danke schon mal für Hilfe! Das ist wirklich kurios und ich weiß nicht mehr so recht wo ich ansetzen soll.

        Kontrollausgaben und Ablaufverfolgung sind sind die zwei wichtigsten Handlungen beim Fehlersuchen. Ideen und Vermutungen haben kommt erst danach und sie sollten sofort durch Kontrollausgaben und Ablaufverfolgung geprüft werden.

        Lo!