online 1
gast (50)

/ Forum / Skripte(PHP,ASP,Perl...)

Skripte(PHP,ASP,Perl...)Skripte(PHP,ASP,Perl...)

Fragevon IngridL. vom 18.11.2020, 09:22 Options

Lösung

Problem - UPDATE -String mit implode zusammenstellen

Hey,

wie die Überschrift schon sagt habe ich das Problem den UPDATE - String mit Hilfe mit implode zu erstellen.

Ich schreibe mittels PHP geänderte Daten in ein mehrdimensionales Array test[] und möchte diese Daten in meiner MySQL-Datenbank speichern.

Ich habe es so versucht:

$bTmp= array();
foreach ($_POST[test] as $1) {
foreach ($val1 as $k2 => $v2) {
$bTmp[$k2]= $v2;
if (count($bTmp)== 1) {
$query = 'UPDATE tabelle SET '. implode('\', \'', array_keys($bTmp)). ' = \''. implode('\', \'', $bTmp). '\' ';
$query .= 'WHERE id_spalte = \'3\'';
$bTmp= array();
}
}
}

Somit wird für jeden Werte ein UPDATE-String erstellt, aber leider funktioniert das Speichern in der DB nicht. Wenn ich mir einen dieser Strings manuell in der DB eingebe wird aber gespeichert.

Wo ist mein Denkfehler oder wie kann es besser machen?

MfG
Ingrid L.


Antwort schreiben

Antwort 1 von rabies vom 20.11.2020, 14:17 Options

Hallo!

In Deinem Code befinden sich mehrere fragwürdige Stellen:
  • $_POST['test'] wird mit hoher Wahrscheinlichkeit kein Array sein. Von daher macht es an dieser Stelle wenig Sinn, mit foreach darüber zu iterieren.
  • $1 kann zwar funktionieren. Muss aber nicht. Variablen sollten in PHP entweder mit einem Unterstrich oder einem Buchstaben anfangen. Nicht aber mit einer Zahl.
  • Was steht in $val1? Das wird in Deinem Code-Schnippsel leider nicht gezeigt.
  • Wieso count($bTmp) == 1? Es macht dann wenig Sinn, überhaupt zu iterieren. Dann könntest Du auch gleich auf das erste Element von $bTmp zugreifen und Dir Value sowie Schlüssel holen.
  • Dein zusammengebasteltes SQL-Statement würde in etwa folgendes ergeben:
    UPDATE tabelle SET 'a', 'b', 'c' = 1, 2, 3
    Richtig wäre aber:
    UPDATE tabelle SET 'a' = 1, 'b' = 2, 'c' = 3



    Du solltest eventuell näher erläutern, was genau Du vorhast, welche Werte übergeben werden, und welche wohin gespeichert werden sollen.

    Zudem fehlt komplett der mysql_*-Teil. Aber ich denke, den hast Du nur nicht mit kopiert, richtig?


    --rabies.
  • Antwort 2 von IngridL. vom 20.11.2020, 14:31 Options

    hallo rabies,

    hole Daten aus MySQL stelle sie auf HTML Seite dar so das sie geändert werden können. Tabelle hat 4 Spalten. Die Werte werden in $test[] gespeichert und an den Skript gesendet, welcher die Daten aus dem Array in der DB speichern soll.

    Zitat:
    In Deinem Code befinden sich mehrere fragwürdige Stellen:
    $_POST['test'] wird mit hoher Wahrscheinlichkeit kein Array sein. Von daher macht es an dieser Stelle wenig Sinn, mit foreach darüber zu iterieren.

    ist ein Array

    Zitat:
    $1 kann zwar funktionieren. Muss aber nicht. Variablen sollten in PHP entweder mit einem Unterstrich oder einem Buchstaben anfangen. Nicht aber mit einer Zahl.

    Was steht in $val1? Das wird in Deinem Code-Schnippsel leider nicht gezeigt.


    $!1 = $val1 mein Fehler :)

    Zitat:
    Wieso count($bTmp) == 1? Es macht dann wenig Sinn, überhaupt zu iterieren. Dann könntest Du auch gleich auf das erste Element von $bTmp zugreifen und Dir Value sowie Schlüssel holen.


    ja.... eigentlich count($bTmp) == 4 weil 4 Spalten in einer Zeile

    Zitat:

    Dein zusammengebasteltes SQL-Statement würde in etwa folgendes ergeben:
    UPDATE tabelle SET 'a', 'b', 'c' = 1, 2, 3


    genau das ist das problem, es sollte eigentlich wie du schon sagst UPDATE tabelle SET 'a' = 1, 'b' = 2, 'c' = 3 entstehen. Aber ich bekomme es nicht hin.

    Antwort 3 von son_quatsch vom 20.11.2020, 15:17 Options

    Nunja: Ein implode() verklebt alle Feldelemente zu einem String - logischerweise stehen in deinem zusammengesetzten Text auf der einen Seite alle Spalten und auf der anderen sämtliche Werte - statt ineinander verwoben. Zusätzlich ist die Schreibweise feld[element] falsch. Dieser Fall setzt voraus, dass element eine Konstante wäre (aber ich nehme an, die definierst du nirgends). Korrekt ist immer feld['element'] oder natürlich über einen Integer-Wert (feld[4711]) oder über eine Variable (feld[$element]). Das ist ein grundsätzlich fehlendes Verständnis bei vielen und es gibt Situationen, wo das mächtig in die Hose gehen kann.

    SQL ist eigentlich dasselbe: wie sind die einzelnen Spalten definiert? Ein String steht immer in einfachen Anführungszeichen (SELECT spalte FROM tab WHERE spalte= 'text';), wohingegen Zahlen nicht darin eingeschlossen werden sollten (SELECT spalte FROM tab WHERE spalte= 1;). Insofern hab ich deine WHERE-Klausel ohne Anführungsstriche ausgeführt.


    foreach ( $_POST['test'] as $val1 ) {
      if ( count( $val1 )== 4 ) {
        $query= 'UPDATE tabelle SET ';
        foreach ( $_POST['test'] as $key2=> $val2 ) {
          $query.= $key2. '= \''. $val2. '\', ';
        }
        $query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
    
        ...$query ausführen
      }
    }

    Antwort 4 von IngridL. vom 20.11.2020, 16:00 Options

    hallo son_quatsch,

    DANKE für Deine Hilfe.

    Leider funkioniert es nicht. mysql_affected_rows() liefert -1 zurück.

    Zitat:
    ...$query ausführen


    mysql_db_query("DB", "$query"); ?



    Zitat:
    $query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';


    diese zeile verstehe ich garnicht. Bitte erläutere sie mir kurz.

    Antwort 5 von rabies vom 20.11.2020, 16:07 Options

    $query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';


    Diese Zeile entfernt einfach nur die letzten beiden Zeichen, die an $query angehangen wurden. Also ", ". Komma und Leerzeichen.


    Zu mysql_affected_rows():

    Setz mal hinter mysql_db_query() ein or die(mysql_error());

    Eventuell erhälst Du dann nähere Informationen, warum und weshalb das Statement nicht funktioniert hat/nichts in die Datenbank eingefügt wurde.

    Zum späteren Einsatz, wenn das ganze produktiv läuft, solltest Du or die natürlich wieder entfernen, da nicht jedermann Fehlermeldungen direkt von der Datenbank sehen sollte.


    --rabies.

    Antwort 6 von IngridL. vom 20.11.2020, 16:15 Options

    Zitat:

    $query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';


    Diese Zeile entfernt einfach nur die letzten beiden Zeichen, die an $query angehangen wurden. Also ", ". Komma und Leerzeichen.


    DANKE

    Zitat:
    Zu mysql_affected_rows():

    Setz mal hinter mysql_db_query() ein or die(mysql_error());


    mysql_db_query("DB", "$query") or print "MySQL-Error: ".mysql_errno()." -&gt; ".mysql_error()."<br>\n";

    Bringt keine Fehlermeldung

    Antwort 7 von rabies vom 20.11.2020, 16:18 Options

    or print? Kann man das denn so schreiben?

    Folgende Schreibweise wäre kenne ich nur:

    mysql_db_query("DB", "$query") or die("MySQL-Error: ".mysql_errno()." -&gt; ".mysql_error());

    Antwort 8 von son_quatsch vom 20.11.2020, 16:23 Options

    Außerdem kannst du in der Dokumentation nachlesen, z.B. http://de.php.net/manual/de/function.substr.php (oben in das Suchfeld einfach den Funktionsnamen eintragen). Mit jeweils vielen Beispielen und dutzenden an Kommentaren.

    Und der Vorbeugung weiterer Fehler gleich mal ein kompletter Code mit Datenbankanbindung (natürlich musst du "user", "pass", "DB" und ggf. "localhost" anpassen):

    mysql_connect( 'localhost', 'user', 'pass' ) or die( 'Keine Verbindung: '. mysql_error() );
    
    mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
    
    foreach ( $_POST['test'] as $val1 ) {
      if ( count( $val1 )== 4 ) {
        $query= 'UPDATE tabelle SET ';
        foreach ( $_POST['test'] as $key2=> $val2 ) {
          $query.= $key2. '= \''. $val2. '\', ';
        }
        $query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
    
        mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
      }
    }

    Antwort 9 von son_quatsch vom 20.11.2020, 16:26 Options

    Die Konstruktion "or die()" ist einzig möglich.

    Wenn hier einer mit print() oder sonstwas experimentieren möchte, muss er mit der exakten Gleichheit prüfen, z.B.:

    Zitat:
    if ( mysql_query( $query )=== false ) print( 'SQL-Fehler: '. mysql_error() );

    Antwort 10 von IngridL. vom 20.11.2020, 16:40 Options

    Zitat:
    mysql_connect( 'localhost', 'user', 'pass' ) or die( 'Keine Verbindung: '. mysql_error() );

    mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );

    foreach ( $_POST['test'] as $val1 ) {
    if ( count( $val1 )== 4 ) {
    $query= 'UPDATE tabelle SET ';
    foreach ( $_POST['test'] as $key2=> $val2 ) {
    $query.= $key2. '= \''. $val2. '\', ';
    }
    $query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';

    mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
    }
    }


    habe es genauso mit angepasster ( 'localhost', 'user', 'pass' ) probiert, leider ohne Erfolg :(

    Antwort 11 von rabies vom 20.11.2020, 16:43 Options

    Keine Fehlermeldungen oder ähnliches?

    Antwort 12 von rabies vom 20.11.2020, 16:46 Options

    Hast Du Dir den Inhalt von $_POST['test'], wie er übergeben wird, schon einmal detailiert angeschaut?

    print_r($_POST['test']);

    Vielleicht sucht man einfach nur an der falschen Stelle & die Daten werden gar nicht richtig übertragen.

    Antwort 13 von IngridL. vom 20.11.2020, 16:52 Options

    Zitat:
    Keine Fehlermeldungen oder ähnliches?


    nein, das wundert mich ja auch!

    Das einzigste was angezeigt wird ist -1 Datensätze geändert!

    weil ich mit mysql_affected_rows(); abfrage wieviel Zeilen geändert wurden.

    error_reporting(E_ALL); habe ich auch aber es kommt keine Fehlermeldung !

    Antwort 14 von IngridL. vom 20.11.2020, 16:54 Options

    Zitat:
    Hast Du Dir den Inhalt von $_POST['test'], wie er übergeben wird, schon einmal detailiert angeschaut?

    print_r($_POST['test']);

    Vielleicht sucht man einfach nur an der falschen Stelle & die Daten werden gar nicht richtig übertragen.


    Ja Daten werden richtig übertragen

    Antwort 15 von IngridL. vom 21.11.2020, 08:22 Options

    Guten Morgen,

    habe gestern Abend nochmals getestet, es geht leider immernoch nicht. Aber was mir aufgefallen ist, ist das ich
    Zitat:
    echo"query:$query";
    nicht ausgeben kann. Noch nicht einmal das Wort query: erscheint.

    Antwort 16 von son_quatsch vom 21.11.2020, 08:36 Options

    Dann machen wir etwas grundsätzliches:

    <?php echo "hallo"; ?>
    Exakt als eine Datei abspeichern und aufrufen. Kommt ein Text? Wenn ja, dann poste hier mal bitte deine komplette PHP-Datei (und in [ code ]...[ /code ]-Blöcke bitte einschließen)

    Antwort 17 von IngridL. vom 21.11.2020, 09:03 Options

    error_reporting(E_ALL);
    
    print_r($_POST['test']);
    
    // 
    mysql_connect( 'localhost', 'user', 'pw' ) or die( 'Keine Verbindung: '. mysql_error() );
    
    mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
    
    foreach ( $_POST['test'] as $val1 ) {
      if ( count( $val1 )== 4 ) {
        $query= 'UPDATE Tabelle SET ';
        foreach ( $_POST['test'] as $key2=> $val2 ) {
          $query.= $key2. '= \''. $val2. '\', ';
        }
        $query= substr( $query, 0, -2 ). ' WHERE id_spalte= 3';
        echo"<br>query:$query";
        mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
      }
    }
      $GMA = mysql_affected_rows(); 
      if ($GMA < 0)
    {  
    echo mysql_affected_rows() . ' Datens&auml;tze ge&auml;ndert!';
    }
      else
      {
      echo mysql_affected_rows() . ' Datens&auml;tze nicht ge&auml;ndert!';
      }
    

    Antwort 18 von son_quatsch vom 21.11.2020, 09:20 Options

    Also zwei grundlegende Sachen:
    • Wenn das wirklich der gesamte Inhalt der Datei ist, dann fehlen die <?php ... ?>-Tags.
    • Ich bin mir nicht sicher, ob man mysql_affected_rows() mehrfach aufrufen kann. Deren Anzeige gilt auch nicht kumulativ - du musst sie nach jedem Query bereits aufrufen. Und unlogisch ist deine IF-Verzweigung auch, denn die Funktion kann keine Aussage darüber treffen, wieviele Datensätze nicht geändert wurden.

    Ersetze die beiden bestehenden Zeilen bitte mit folgenden drei und achte genau auf die Schreibweise - am besten kopieren:

        echo '<br />query: '. $query;
        mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
        echo '<br />'. mysql_affected_rows(). ' Datensätze betroffen';

    Antwort 19 von IngridL. vom 21.11.2020, 09:47 Options

    Zitat:
    Also zwei grundlegende Sachen:
    Wenn das wirklich der gesamte Inhalt der Datei ist, dann fehlen die <?php ... ?>-Tags.
    Ich bin mir nicht sicher, ob man mysql_affected_rows() mehrfach aufrufen kann. Deren Anzeige gilt auch nicht kumulativ - du musst sie nach jedem Query bereits aufrufen. Und unlogisch ist deine IF-Verzweigung auch, denn die Funktion kann keine Aussage darüber treffen, wieviele Datensätze nicht geändert wurden.


    1.) ok, die sind natürlich auch dabei
    2.) nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
    3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die

    if ( count( $val1 )== '4' ) { } 

    rausnehme.

    Hier nochmal die ganze Datei:

    <?php
    
    error_reporting(E_ALL);
    
    print_r($_POST['test']);
    
    // 
    mysql_connect( 'localhost', 'user', 'pw' ) or die( 'Keine Verbindung: '. mysql_error() );
    
    mysql_select_db( 'DB' ) or die ( 'Keine Datenbank: '. mysql_error() );
    
    foreach ( $_POST['test'] as $val1 ) {
    //   if ( count( $val1 )== '4' ) {
        $query= 'UPDATE Tabelle SET ';
        
        foreach ( $val1 as $key2=> $val2 ) {
          $query.= $key2. '= \''. $val2. '\', ';
        }
        $query= substr( $query, 0, -2 ). ' WHERE id_spalte = 3';
        echo '<br />query: '. $query;
        mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
        echo '<br />'. mysql_affected_rows(). ' Datensätze betroffen';
    //   }
    }
    
    ?>  

    Antwort 20 von son_quatsch vom 21.11.2020, 10:16 Options

    Zitat:
    3.) Das mit den 10 betroffenen zeilen wird nur angezeigt wenn die

    if ( count( $val1 )== '4' ) { }

    rausnehme.
    Diese IF-Verzweigung war von Anfang an deine Idee - dann prüf bitte selbst, wann (und warum) du ein SQL-Kommando ausführst.

    Zitat:
    nun wird angezeigt das 10 Zeilen betroffen sind, was auch stimmt. geändert wird noch nichts
    Doch. Nur sind alle neuen Werte exakt dieselben wie die alten. Auch das zählt als Änderung und die Funktion gibt korrekterweise wieder, welche Datensätze betroffen waren - das ist eine rein effektive Auskunft. Die kann nicht zwangsweise logisch prüfen, ob nun die neuen Werte exakt den alten gleichen.


    Also funktionierend das ganze einwandfrei. Ich denke, du hast vielmehr mit der Logik dahinter noch ein Problem, bzw. fehlt eine Erklärung von dir, wie etwas sein sollte... versuchs nochmal in Worte zu fassen :-)

    Ähnliche Themen

    [JavaScript] Teil aus einem String löschen
    rabies  28.06.2007 - 126 Hits - 14 Antworten

    Leerzeichen in String erkennen
    Uesch  03.05.2008 - 43 Hits - 7 Antworten

    foreach und implode
    der_verzweifelte  28.08.2008 - 4 Hits - 10 Antworten

    Problem mit Bluetooth und Windows SP2
    Jouli  06.11.2008 - 2654 Hits -

    Hinweis

    Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

    Neue Einträge

    Version: supportware 1.9.150 / 10.06.2022, Startzeit:Mon Jan 26 01:23:17 2026