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 21 von IngridL. vom 21.11.2020, 10:36 Options

Zitat:
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.


Ja, das stimmt!

Zitat:
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.


Das tuen sie eben nicht. Im Array stehen andere Werte drin.

Zitat:
versuchs nochmal in Worte zu fassen :-)


Vielleich habe ich die Sache auch ganz falsch angfangen. :(

Also ich lese Daten aus der DB diese werden in ein PHP-Formular geschrieben:

    <tr><td><input name="test[][Spalte1]" type="text" value="'.$row['id'].'" ></td>
    <td><input name="test[][Spalte2]" type="text"value="'.$row['g'].'" ></td>
    <td><select name="test[][Spalte3]" size="1" class="searchField">
    <option value="Ja" '. ($row['hg']== Ja? 'selected="selected" ': ''). '/>ja</option>
    <option value="Nein" '. ($row['hg']== Nein? 'selected="selected" ': ''). '/>nein</option></select></td>
    <td><input name="test[][Spalte4]" type="text" value="'.$row['k'].'" ></td>
    <td><select name="test[][Spalte5]" size="1" class="searchField">
    <option value="1" '. ($row['m']== 1? 'selected="selected" ': ''). '/>Option1</option>
    <option value="2" '. ($row['m']== 2? 'selected="selected" ': ''). '/>Option2</option></select></td></tr>


Es sind mehere Zeilen die entstehen.

1.) Die Daten werde in das Array test geschrieben, oder?
2.) und genau diese daten sollen dann die Daten in der DB ersetzen
3.) Die Daten jeder Zeile müssen ein UPDATE String ergeben, deswegen die IF Abfrage oben. und dieser String endet , WHERE id = id ( Werte aus der Tabelle, Spalte 1).

Antwort 22 von IngridL. vom 21.11.2020, 10:47 Options

Zitat:
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.


Ja, das Stimmt.

Zitat:
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.


Die neuen daten gleichen nicht den alten.


Zitat:
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 :-)


Vielleicht war meine Herangehensweise falsch.

1.) ich hole Daten aus der DB und füge diese in folgendes Formular ein:

<tr><td><input name="test[Spalte1]" type="text" value="'.$row['Spalte1'].'" ></td>
    <td><input name="test[][Spalte2]" type="text" value="'.$row['Spalte2'].'" ></td>
    <td><select name="test[][Spalte3]" size="1" class="searchField">
    <option value="Ja" '. ($row['Spalte3']== Ja? 'selected="selected" ': ''). '/>Ja</option>
    <option value="Nein" '. ($row['Spalte3']== Nein? 'selected="selected" ': ''). '/>Nein</option></select></td>
    <td><input name="test[][Spalte4]" type="text" value="'.$row['Spalte4'].'" ></td>
    <td><select name="test[][Spalte5]" size="1" class="searchField">
    <option value="1" '. ($row['Spalte5']== 1? 'selected="selected" ': ''). '/>1</option>
    <option value="2" '. ($row['Spalte5']== 2? 'selected="selected" ': ''). '/>2</option></select></td></tr>

Es sind immer mehrer Zeilen verhanden! Spalte ist die ID !
Nun können die Daten geändert werden und werden im Array test gespeichert, oder?

und diese Daten im Array , sollen die Daten in der DB ersetzen.

nun meine Frage: wie macht man das am besten?

Antwort 23 von IngridL. vom 21.11.2020, 10:48 Options

Zitat:
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.


Ja, das Stimmt.

Zitat:
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.


Die neuen daten gleichen nicht den alten.


Zitat:
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 :-)


Vielleicht war meine Herangehensweise falsch.

1.) ich hole Daten aus der DB und füge diese in folgendes Formular ein:

<tr><td><input name="test[Spalte1]" type="text" value="'.$row['Spalte1'].'" ></td>
    <td><input name="test[][Spalte2]" type="text" value="'.$row['Spalte2'].'" ></td>
    <td><select name="test[][Spalte3]" size="1" class="searchField">
    <option value="Ja" '. ($row['Spalte3']== Ja? 'selected="selected" ': ''). '/>Ja</option>
    <option value="Nein" '. ($row['Spalte3']== Nein? 'selected="selected" ': ''). '/>Nein</option></select></td>
    <td><input name="test[][Spalte4]" type="text" value="'.$row['Spalte4'].'" ></td>
    <td><select name="test[][Spalte5]" size="1" class="searchField">
    <option value="1" '. ($row['Spalte5']== 1? 'selected="selected" ': ''). '/>1</option>
    <option value="2" '. ($row['Spalte5']== 2? 'selected="selected" ': ''). '/>2</option></select></td></tr>

Es sind immer mehrer Zeilen verhanden! Spalte ist die ID !
Nun können die Daten geändert werden und werden im Array test gespeichert, oder?

und diese Daten im Array , sollen die Daten in der DB ersetzen.

ja nun meine Frage wie macht man das am besten?

Antwort 24 von son_quatsch vom 21.11.2020, 11:07 Options

Oje, dazu brauche ich mindestens die exakte Ausgabe von
print_r($_POST['test']);

...möglichst aber auch zusätzlich noch ein Beispiel des fertig ausgegebenen HTML-Quellcodes (also mit Beispielwerten drin, so wie es im Browser aussieht).

Zitat:
Die neuen daten gleichen nicht den alten.
Ja, deine Erkenntnis ist schön. Aber ich steh weiterhin im Regen - gib mal Beispiele. Und irgendetwas wird ja an den Daten in der Datenbank aktualisiert...

Antwort 25 von IngridL. vom 21.11.2020, 11:26 Options

Hier mal die Ausagbe von print_r($_POST['test']);

Array ( 
[0] => Array ( [Spalte1] => 12 ) 
[1] => Array ( [Spalte2] => M ) 
[2] => Array ( [Spalte3] => Nein ) 
[3] => Array ( [Spalte4] => 55 ) 
[4] => Array ( [Spalte5] => 1 ) 

[5] => Array ( [Spalte1] => 13 ) 
[6] => Array ( [Spalte2] => F ) 
[7] => Array ( [Spalte3] => Nein ) 
[8] => Array ( [Spalte4] => 34 ) 
[9] => Array ( [Spalte5] => 2 ) 

[10] => Array ( [Spalte1] => 14 ) 
[11] => Array ( [Spalte2] => h ) 
[12] => Array ( [Spalte3] => JA ) 
[13] => Array ( [Spalte4] => 67 ) 
[14] => Array ( [Spalte5] => 12 )
 )

Antwort 26 von IngridL. vom 21.11.2020, 11:42 Options

Hier mal die Ausagbe von print_r($_POST['test']);

Array (
[0] => Array ( [Spalte1] => 12 )
[1] => Array ( [Spalte2] => M )
[2] => Array ( [Spalte3] => Nein )
[3] => Array ( [Spalte4] => 55 )
[4] => Array ( [Spalte5] => 1 )

[5] => Array ( [Spalte1] => 13 )
[6] => Array ( [Spalte2] => F )
[7] => Array ( [Spalte3] => Nein )
[8] => Array ( [Spalte4] => 34 )
[9] => Array ( [Spalte5] => 2 )

[10] => Array ( [Spalte1] => 14 )
[11] => Array ( [Spalte2] => h )
[12] => Array ( [Spalte3] => JA )
[13] => Array ( [Spalte4] => 67 )
[14] => Array ( [Spalte5] => 2 )
)





<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<title>.</title>
<link href="css/style.css" rel="stylesheet" type="text/css">

</head><body>
<form action="....php" Spalte5thod="post" enctype="multipart/form-data" name="request" id="request">
<br><br><table>

<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="12" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="M" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="55" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="1" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="13" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="F" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="34" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="2" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input name="test[][Spalte1]" type="text" maxlength="5" size="5" value="14" ></td>
<td><input name="test[][Spalte2]" type="text" maxlength="50" size="40" value="h" ></td>
<td><select name="test[][Spalte3]" size="1" class="searchField"><option value="Ja" />Ja</option><option value="Nein" selected="selected" />Nein</option></select></td>
<td><input name="test[][Spalte4]" type="text" maxlength="6" size="6" value="67" ></td>
<td><select name="test[][Spalte5]" size="1" class="searchField"><option value="2" selected="selected" />1</option><option value="2" />2</option></select></td>
</tr>
<tr><td><input type="submit" name="submit" value="Weiter"></td></tr></table></form>
</body></head>

Antwort 27 von son_quatsch vom 21.11.2020, 12:04 Options

Also pass auf: mit den Feldern hast du dich etwas übernommen - eine Dimension davon brauchst du definitiv nicht. Aber ich belass es erstmal dabei und werf nicht gleich alles bestehende über den Haufen. Das fahrlässige daran ist nämlich, dass z.B. nicht 3 große Felder mit jeweils 5 Werten entstehen, sondern 15 Felder mit jeweils einem Wert :(

"Spalte1" soll wohl die ID sein. Vergiss bitte nicht, dass du in sämtlichem PHP-Code immer als WHERE-Bedingung "id_spalte= 3" drin hast, also werden nur Datensätze aktualisiert, deren Wert (3) in der Spalte (id_spalte) übereinstimmt. Das müssen wir selbstverständlich entsprechend dynamisch gestalten. Hier stellt sich auch die Frage, ob du bei der HTML-Ausgabe die ID überhaupt sehen willst. In jedem Fall gibt es Optimierungsbedarf.

Nachfolgend jetzt mal ein Beispiel, wie es funktionieren sollte, wenn deine HTML-Formulare weiterhin so aussehen wie in deinem Beispiel:


<?php

  error_reporting(E_ALL);

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

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

  $i= 0;
  $where= '';
  foreach ( $_POST['test'] as $val1 ) {
    // es geht von vorne los
    // den ersten Wert wollen wir nicht UPDATEN, sondern als KRITERIUM nutzen...
    if ($i== 0) {
      $query= 'UPDATE Tabelle SET ';

      // diese Schleife wird nur einmal (infolge der etwas doofen Datenzusammenstellung) durchlaufen
      foreach ( $val1 as $key2=> $val2 ) {
        $where= $key2. '= '. $val2;
      }
    // ...alle anderen Werte sammeln wir
    } else {
      // diese Schleife wird nur einmal (infolge der etwas doofen Datenzusammenstellung) durchlaufen
      foreach ( $val1 as $key2=> $val2 ) {
        $query.= $key2. '= \''. $val2. '\', ';
      }
    }
    $i++;  // einen weiteren Wert dem SQL-Kommando hinzugefügt

    // bei 5 Werten insgesamt haben wir einen Datensatz zusammen
    if ($i== 5) {
      $query= substr( $query, 0, -2 ). ' WHERE '. $where;
      echo '<br />query: '. $query;
      mysql_query( $query ) or die( 'SQL-Fehler: '. mysql_error() );
      echo '<br />'. mysql_affected_rows(). ' Datensätze betroffen';
    }
  }

?>

Antwort 28 von IngridL. vom 21.11.2020, 13:28 Options

@son_quatsch

riesen Lob an Dich! Sicher es ist alles noch sehr laienhaft gemacht und es besteht noch großer Optimierungsbedarf.

Eine Frage habe ich allerdings noch:

Beim testen stellte ich fest, dass die Where-Klausel immer so gleich ist:

WHERE Spalte1=12. Wo wird das im Code festegelegt?

Antwort 29 von IngridL. vom 21.11.2020, 13:33 Options

@son_quatsch,

werde das Array vollkommen anders aufbauen müssen. Da komme ich nicht drum herum.

VIELEN DANK FÜR DEINE MÜHE, HAT MIR SEHR GEHOLFEN

D A N K E

Ä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