php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 15-01-2008, 10:49
Timbob
 Newbie
Links : Onlinestatus : Timbob ist offline
Registriert seit: Jan 2008
Beiträge: 7
Timbob ist zur Zeit noch ein unbeschriebenes Blatt
Standard Zweidimensionales Array vor Speicherung auf veränderte Datensätze überprüfen

Hallo Boardies,

mein erstes Posting hier und gleich ein dickes sorry(!) aber ich komme nicht weiter...

Ich will überprüfen, ob Daten im Felder geändert wurden, wenn nicht sollen Sie nicht gespeichert werden.

Wie kann ich überprüfen, ob etwas eingetragen wurde bzw. verändert wurde,
d.h. es wurde beispielsweise nur etwas in deuNoteHalb[34] eingetragen, dann brauche ich ja nur diesen Satz zu speichern. Mit empty() könnte ich die leeren löschen, aber wie nur diese herausfiltern und was ist mit denen geänderten?

Zweidimensionales Array (alles verkürzt auf zwei Dummivariablen, eigentlich 10-30)
Formular - SQL Einlesen
Code:
$sql ="SELECT name, vorname, id FROM students WHERE klasse='$klasse' ORDER BY name";
Formular - Felder
Code:
while ($row = mysql_fetch_assoc($result)) 
    { 
    echo "<tr><td>$nr</td>"; // jeweils Zeile eroeffnen
    foreach ($row as $key => $value) 
      {
      switch ($key) 
        {      
        case 'name':
        echo "<td><input type='text' name='name[]' value='$value' size='30' readonly='readonly'></td>\n"; break;
        case 'vorname':
        echo "<td><input type='text' name='vorname[]' value='$value' size='20' readonly='readonly'></td>\n"; break;
        case 'deuNoteHalb':
        echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteHalb[]' value='$value' size='1'></td>\n"; break;
        
        }
      }
    $nr++;
    echo "</tr>"; // jeweils Zeile schliessen
    }
vardump (verkürzte Ausgabe vom Formular):
Code:
array(6) { 
  ["name"]=> array(34) { [0]=> string(6) "ABANDO" [1]=> string(6) } 
  ["vorname"]=> array(34) { [0]=> string(5) "IÑIGO" [1]=> string(7) } 
  ["id"]=> array(34) { [0]=> string(3) "176"} 
["sqlAuswahlFach"]=> string(7) "Deutsch" }
SQL-Satz
Code:
 $sql = "UPDATE `students` SET `deuNoteHalb` = '".$_POST["deuNoteHalb"][$i]."'  WHERE `id` = '".$_POST["id"][$i]."';";
Hoffe dass das übersichtlich ist.

Gruß Tim
Mit Zitat antworten
  #2 (permalink)  
Alt 15-01-2008, 10:57
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Fuege in das Formular noch fuer jeden Wert ein Hidden Field ein, gebe ihm den Namen "var_alt" und dann den entsprechenden Wert.

Spaeter kannst du dann mit einer if Abfrage die Werte Gruppenweise vergleichen, und das Update eben nur dann ausfuheren wenn mindestens ein Wer geaendert wurde.
Mit Zitat antworten
  #3 (permalink)  
Alt 15-01-2008, 11:01
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Das einfachste ist nach meiner Meinung, alle zu ändern. Was macht es schon aus, wenn du einen Wert auf sich selber "updatest".
Andernfalls gäbe es zwei Möglichkeiten:
Einerseits könntest du alle änderbaren Variablen im Formular zusätzlich noch in einem "Hidden Field" speichern, nach dem Abschicken dann alle diese mit den Input-Feldern vergleichen und die geänderten Daten speichern.
Die andere Möglichkeit ist, nach dem Abschicken die Daten jeweils nochmals aus der DB zu holen und diese dann mit den Input-Daten zu vergleichen.
Ich gehe aber davon aus, dass beide Versionen nicht nur aufwändiger in der Programmierung sind, sondern vermutlich auch performance-mässig schlechter.
__________________
Gruss
H2O
Mit Zitat antworten
  #4 (permalink)  
Alt 15-01-2008, 11:21
Timbob
 Newbie
Links : Onlinestatus : Timbob ist offline
Registriert seit: Jan 2008
Beiträge: 7
Timbob ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von H2O
alle zu ändern. Was macht es schon aus, wenn du einen Wert auf sich selber "updatest".
Problem Zugriff von mehren Usern und Änderung gerade geänderter Daten (was mein zweites aber kleines Problem ist)!

Zitat:
Einerseits könntest du alle änderbaren Variablen im Formular zusätzlich noch in einem "Hidden Field" speichern, nach dem Abschicken dann alle diese mit den Input-Feldern vergleichen und die geänderten Daten speichern.
Das klingt interesant. Mit einer for-Schleife oder hast Du ein Bsp.?

Zitat:
Die andere Möglichkeit ist, nach dem Abschicken die Daten jeweils nochmals aus der DB zu holen und diese dann mit den Input-Daten zu vergleichen.
Auch hier wieder eine Schleife, die mich beim mehrdimensionalen Array echt umbringt!

Zitat:
performance-mässig schlechter.
Kein Problem, da Intranet-Anwendung.
Mit Zitat antworten
  #5 (permalink)  
Alt 15-01-2008, 11:52
Lennynero
 Registrierter Benutzer
Links : Onlinestatus : Lennynero ist offline
Registriert seit: Sep 2007
Beiträge: 121
Blog-Einträge: 1
Lennynero ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Timbob
Problem Zugriff von mehren Usern und Änderung gerade geänderter Daten (was mein zweites aber kleines Problem ist)!
Dann muesstest du sogar drei Werte vergleichen um sicher zu sein:

Den alten Wert (der im Hidden field steht), den neuen im Formular geaenderten Wert und der Wert in der DB. Das ist aber im Grunde eher ein Problem von Zugriffsrechten.


Zitat:
Das klingt interesant. Mit einer for-Schleife oder hast Du ein Bsp.?
PHP-Code:
for ($i$i count($_POST['name']; $i++)
{
 if (
     
$_POST['name[' $i ']'] != $_POST['name_alt[' $i ']'] ||
     
$_POST['vorname[' $i ']'] != $_POST['vorname_alt[' $i ']'] ||
     
$_POST['deuNoteHalb[' $i ']'] != $_POST['deuNoteHalb_alt[' $i ']']
     )
   {
       
// Update Anweisung
   
}

Mit Zitat antworten
  #6 (permalink)  
Alt 15-01-2008, 11:57
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Timbob
Problem Zugriff von mehren Usern und Änderung gerade geänderter Daten
Dann bleibt wirklich nur die Lösung mit den Hidden-Fields. Die andere Version löst das auch nicht, da du dann bereits geänderte Daten aus der DB holst.
Um dir aber detailierter helfen zu können, musst du schon etwas genauer sagen, was du willst. Geht es um mehrere Noten für einen Studenten, um einen Note für eine Studentin, oder um n Noten zu n StudentInnen? Kürzen finde ich immer gut, aber dein Beispiel mit nur einer veränderbaren Variablen ist vielleicht doch etwas zu kurz. Wie sieht deine DB-Struktur aus? Ich bin mir nicht einmal ganz sicher, ob du überhaupt einen mehrdimensionalen Array brauchst. ...
__________________
Gruss
H2O
Mit Zitat antworten
  #7 (permalink)  
Alt 15-01-2008, 12:31
Timbob
 Newbie
Links : Onlinestatus : Timbob ist offline
Registriert seit: Jan 2008
Beiträge: 7
Timbob ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Original geschrieben von H2O
Lösung...Hidden-Fields... Um dir aber detailierter helfen zu können, musst du schon etwas genauer sagen, was du willst.[/QUOTE]

Formular
Zitat:
// Zeilen des Formulars dynamisch erzeugen
$nr=1;
while ($row = mysql_fetch_assoc($result))
{
echo "<tr><td>$nr</td>"; // jeweils Zeile eroeffnen
foreach ($row as $key => $value)
{
switch ($key)
{
case 'name':
echo "<td><input type='text' name='name[]' value='$value' size='30' readonly='readonly'></td>\n"; break;
case 'vorname':
echo "<td><input type='text' name='vorname[]' value='$value' size='20' readonly='readonly'></td>\n"; break;

case 'deuNoteHalb':
echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteHalb[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteHalbMuend':
echo "<td><input type='text' name='deuNoteHalbMuend[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteHalbLesen':
echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteHalbLesen[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteHalbSchrei':
echo "<td><input type='text' name='deuNoteHalbSchrei[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteHalbRechts':
echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteHalbRechts[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteHalbHand':
echo "<td><input type='text' name='deuNoteHalbHand[]' value='$value' size='1'></td>\n"; break;

case 'deuNoteEnd':
echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteEnd[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteMuend':
echo "<td><input type='text' name='deuNoteMuend[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteLesen':
echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteLesen[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteSchrei':
echo "<td><input type='text' name='deuNoteSchrei[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteRechts':
echo "<td><input type='text' style='background-color:#d2d2d2' name='deuNoteRechts[]' value='$value' size='1'></td>\n"; break;
case 'deuNoteHand':
echo "<td><input type='text' name='deuNoteHand[]' value='$value' size='1'></td>\n"; break;

case 'id':
echo "<td><input type='hidden' name='id[]' value='$value'></td>\n"; break; // ID hidden; nicht sichtbar aber verarbeitbar

}
}
$nr++;
echo "</tr>"; // jeweils Zeile schliessen
}
}
Der Code (18 Möglichkeiten):
[QUOTE]switch ($_POST["sqlAuswahlFach"])
{
case 'Deutsch':
for ($i = 0; $i < count($_POST["id"]); $i++)
{
$sql = "UPDATE `students` SET `deuNoteHalb` = '".$_POST["deuNoteHalb"][$i]."', `deuNoteHalbMuend` = '".$_POST["deuNoteHalbMuend"][$i]."', `deuNoteHalbLesen` = '".$_POST["deuNoteHalbLesen"][$i]."', `deuNoteHalbSchrei` = '".$_POST["deuNoteHalbSchrei"][$i]."', `deuNoteHalbRechts` = '".$_POST["deuNoteHalbRechts"][$i]."', `deuNoteHalbHand` = '".$_POST["deuNoteHalbHand"][$i]."', `deuNoteEnd` = '".$_POST["deuNoteEnd"][$i]."', `deuNoteMuend` = '".$_POST["deuNoteMuend"][$i]."', `deuNoteLesen` = '".$_POST["deuNoteLesen"][$i]."', `deuNoteSchrei` = '".$_POST["deuNoteSchrei"][$i]."', `deuNoteRechts` = '".$_POST["deuNoteRechts"][$i]."', `deuNoteHand` = '".$_POST["deuNoteHand"][$i]."' WHERE `id` = '".$_POST["id"][$i]."';";
$result = mysql_query($sql) OR die(mysql_error());
}
echo "Die Daten wurden erfolgreich &uuml;bernommen.";
mysql_close();
break;[/CODE]

Zitat:

mehrere Noten für einen Studenten, um einen Note für eine Studentin, oder um n Noten zu n StudentInnen? Kürzen finde ich immer gut, aber dein Beispiel mit nur einer veränderbaren Variablen ist vielleicht doch etwas zu kurz. Wie sieht deine DB-Struktur aus? Ich bin mir nicht einmal ganz sicher, ob du überhaupt einen mehrdimensionalen Array brauchst. ...
mehre Noten und Bemerkungen (>40), mehrere Studenten (~500)

Zitat:

Wie sieht deine DB-Struktur aus?
eine Tabelle (bitte nicht hauen, aber das ist so übersichtlich...)
482 Zeilen bei ca. 200 Feldern

Gleichzeitiger Zugriff von max. 8 Usern also keine Performance Probleme :-)

Danke für jeden Codetipp Tim
Mit Zitat antworten
  #8 (permalink)  
Alt 15-01-2008, 13:53
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Timbob
eine Tabelle (bitte nicht hauen, aber das ist so übersichtlich...)
482 Zeilen bei ca. 200 Feldern[/B]
Zum hauen bist du wahrscheinlich zu weit weg. Eine Tabelle mit 200 Attributen! Das ist der pure Wahnsinn und keine Spur übersichtlich, da wahrscheinlich voller Redundanzen. Darum schilderst du wahrscheinlich auch die Struktur nicht. Ich wage zu behaupten, dass Jede tabell mit mehr als 10, vielleicht 15 Attributen, nicht normalisiert ist. Und ich mache jede Wette, dass du schon sehr bald wieder mit einem genau von dieser Unstruktur hervorgehenden Problem hier stehst. Aber was solls.
Aber noch etwas anderes: Benutzer bitte PHP-Tags für deinen Code und rücke ihn anständig ein
Un hier mal ein Vorschlag für die Formularseite, wenn schon dynamisch, dann aber ganz:
PHP-Code:
if(isset($_POST['go'])){
    ....
}
else{
    echo 
"<table>";
    echo 
"<form method='post' action='" $_SERVER['PHP_SELF'] . "'>";
    
$res mysql_query($sql) || die(mysql_error());
// Zeilen des Formulars dynamisch erzeugen
    
$nr 1;
    while (
$row mysql_fetch_assoc($result)){
        echo 
"<tr>" $nr++ . "</td>"// jeweils Zeile eroeffnen
        
foreach ($row as $key => $value){
             echo 
"<td><input name='{$key}[]' value='$value' size='30' />\n";
             echo 
"<input type='hidden' name='{$key}_alt[]' value='$value' /></td>\n";
        }
        echo 
"<td><input type='hidden' name='id[]' value='" $row['id'] . "'></tr>"// jeweils Zeile schliessen
    
}
    echo 
"<tr><td colspan='20'><input type='submit' name='go' value='Speichern' /></td></tr>\n";
}
echo 
"</form></table>"
__________________
Gruss
H2O

Geändert von H2O (15-01-2008 um 14:52 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 15-01-2008, 15:03
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Und hier, wie versprochen, noch die andere Hälfte:
PHP-Code:
if(isset($_POST['go'])){
    
$keys array_keys($_POST);
    
array_splice($keysarray_search('go'$keys), 1);  // Key von submit-Button löschen
    
array_splice($keysarray_search('id'$keys), 1);  // Key von ID-Feldern löschen
    
for ($i 0;$i count($_POST['id']);$i ++){
        
$upd_ar = array();
        foreach (
$keys as $key){
            if (
preg_match('/_alt$/i'$key)) {continue;} // Vergleichswerte überspringen
            
$idx $key "_alt";
            
$v_neu $_POST[$key][$i];
            
$v_alt $_POST[$idx][$i];
            if (
$v_alt != $v_neu){
                
$upd_ar[] = "$key = '$v_neu'";
            }
        }
        if (
count($upd_ar) > 0){
            
$upd_str "UPDATE tabelle SET " implode(', '$upd_ar) . " WHERE id = " $_POST['id'][$i];
            
mysql_query($upd_str) || die(mysql_error());
        }
    }
}
else{
    
// Formular

Da sind sicher noch Fehler drin. Aber einfach so als Anhaltspunkt
__________________
Gruss
H2O
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:36 Uhr.