php: daten aus datenbank durch while-schleife lesen, ändern und speichern

#0
18.08.2009, 11:31
...neu hier

Beiträge: 9
#1 Hallo,

ich habe eine Webseite mit html und php programmiert, die auch funktioniert. nun möchte die möglichkeit zur änderung von daten aus der datenbank geben. dazu kann der benutzer rufnummern von- bis eingeben. diese daten werden dann herausgesucht und in felder geschrieben. der benutzer hat nun die möglichkeit, die daten innerhalb des feldes zu ändern. was noch nicht funktioniert ist das speichern. weil ich die daten durch eine while-schleife einlese, werden die variablen jeweils überspeichert. am ende will ich aber alle daten speichern.
ich hoffe, man kann so einigermaßen verstehen, was ich will....hier der quellcode, der die daten einliest und in die felder schreibt:

PHP Code


<?php

$rufnr_von 
$_POST['Nummer_von'];
$rufnr_bis $_POST['Nummer_bis'];



    
#Datenbankverbindung
    
include('verbindung.php');

    
$nummerda=mysql_query("SELECT * FROM testdaten WHERE Rufnr >= '$rufnr_von' &amp;&amp; Rufnr <= '$rufnr_bis'");

    
#nummer schon vorhanden?
    
if(mysql_num_rows($nummerda)==){
    echo 
"Nummer nicht vorhanden ";
    return;
    }else{



    
$sql "SELECT * FROM testdaten WHERE Rufnr >= '$rufnr_von' &amp;&amp; Rufnr <= '$rufnr_bis' ORDER BY Rufnr";

    
$db_erg mysql_query($sql) ;

    if ( ! 
$db_erg ){
        die(
'Ungültige Abfrage: ' mysql_error());
    }



    
//$result = mysql_fetch_array($db_erg);

    
$ums = @$_POST['umsnr'];

    
//$nummer = array();
    //$name= array();
    //$einrichtung= array();
    //$node= array();
    //$status= array();
    //$index= array();
    //$status= array();
    //$zaehler = 0;
    
$nummer;
    
$name;
    
$einrichtung;
    
$node;
    
$status;
    
$index;
    
$status;


    while (@
$row mysql_fetch_array($db_ergMYSQL_NUM)) {

        
$nummer $row[0];
        
$name $row[1];
        
$einrichtung $row[2];
        
$node $row[3];
        
$status $row[5];
        
$index $status;
        if(
$status == 1){
            
$status "belegt";
        }else{
            
$status "reserviert";
        }
        
//$zaehler++;
        
?>
        <html>
    <form action="aendern.php" method="post" style="background-color: orange;">
        Rufnummer:<?php echo" <u><b> $nummer </b></u> &amp;nbsp Status: <u><b> ".$status."</b></u>" ?>
        &amp;nbsp;&amp;nbsp;Name <input  type="text" name="name" value="<?php echo $name?>"/>
        Einrichtung <input  type="text" name="einrichtung" value="<?php echo $einrichtung?>"/>
        Node <input  type="text" name="node" value="<?php echo $node?>"/>
        Status &amp;auml;ndern <input type="checkbox" name="status" />
        <input type="Submit" name="speichern" value="Daten speichern"/>

        <input type="hidden" name="reserviert" value="<?php echo $index?>" />
        <input type="hidden" name="ums2" value="<?php echo $ums ?>"/>
        <input type="hidden" name="nummer" value="<?php echo $nummer?>" />
        <input type="hidden" name="Nummer_von" value="<?php echo $_POST['Nummer_von'?>"/>
        <input type="hidden" name="Nummer_bis" value="<?php echo $_POST['Nummer_bis'?>"/>
    </form>
</html>
<?php
    
}
    if(@
$_POST['speichern']){
        include(
'speichern.php');

    }
?>

speichern.php funktioniert bisher nicht....
ich wäre euch superdankbar, wenn ihr mir dabei helfen könntet...ich habe gerade angefangen, php, html und mysql zu lernen...also bitte ich euch um nachsicht, wenn ich dumm rüberkomme....
Seitenanfang Seitenende
18.08.2009, 11:40
Member
Avatar Xeper

Beiträge: 5285
#2 Wenn es geht solltest du den PHP Code vom HTML Code trennen, dass gehört zum guten Stil.

Mache es doch einfach so:

PHP Code


<?php
$data 
= array( );
while(
$row mysql_fetch_row($db_erg)) $data[] = $row;
mysql_free_result($db_erg);
?>

Das wird alle Daten ins Array $data kopieren.
Es gibt natürlich auch noch andere Möglichkeiten...

Ach desweiteren solltest du vorher deine $_POST data überprüfen und schauen was wirklich dadrin ist, so wie deine SQL queries jetzt sind wird man sie sicherlich leicht ausnutzen können:
Siehe: http://de2.php.net/manual/en/function.strip-tags.php
__________
Email/XMPP: therion at ninth-art dot de
IRC: megatherion @ Freenode
Seitenanfang Seitenende
18.08.2009, 11:51
...neu hier

Themenstarter

Beiträge: 9
#3 hey...ja super. das probier ich erstmal aus...
ich dachte mir schon, dass das schlechter stil ist, wenn ich das mixe, aber ich wusste mir nicht besser zu helfen...danke bis hierher ;)
Seitenanfang Seitenende
19.08.2009, 15:41
...neu hier

Themenstarter

Beiträge: 9
#4 so...die daten rüberschicken usw klappt jetzt. es gibt nur noch ein problem: nicht die aktuellen daten (die geändert wurden in den dafür vorgesehenen feldern) werden geschickt sondern die alten.

in der aendern.php-datei ist alles so geblieben, außer das ich den tipp angewendet hab (danke). dann hab ich das feld mit serialize() und base64_encode() verpackt und mit hidden weitergeschickt an speichern.php.
der code dort sieht so aus:

PHP Code


<?php
$post 
= ($_POST['alleDaten']);
$status $_POST['stat'];

$var base64_decode($post);
$daten unserialize($var);

if(
$status[$i][5] == 'on'){
    
$daten[$i][5] = true;
}else{
    
$daten[$i][5] = false;
}
#Status gegebenenfalls aendern
if($aendern_status==true &amp;&amp$status == 0){
    
$status 1;
}elseif(
$aendern_status==true &amp;&amp$status == 1){
    
$status 0;
}
#Datenbankverbindung
include('verbindung.php');

for(
$i 0$i sizeof($daten); $i++){
    
$update "UPDATE testdaten SET Name = '$daten[$i][1]', Einrichtung = '$daten[$i][2]', Node = '$daten[$i][3]', Res = '$status'  WHERE Rufnr='$daten[$i][0]'";

    
$db_erg mysql_query($update);
     if ( ! 
$db_erg ){
        die(
'Ungültige Abfrage: ' mysql_error());
     }
}
?>

problem ist, dass man in den feldern ja die einträge ändern kann. die geänderten daten werden aber leider nicht gespeichert, da das feld ersteinmal kodiert wird und dann erst verschickt. also werden die alten daten verschickt. das ist ja aber leider genau nicht der sinn. hat einer eine idee, wie man die daten im feld $data aktualisieren kann oder so, bevor man sie mit serialize() verpackt?
Seitenanfang Seitenende
19.08.2009, 16:57
Member
Avatar Xeper

Beiträge: 5285
#5 Hmm das ist ja nen ganz schönes gefrickel was du da hast, warum denn serialisieren und dann noch base64 - was willst du denn damit machen?
So wie ich das mitbekommen habe geht es sich doch nur um ein paar Fomular daten die per POST geschickt werden.
Wüßte jetz grade nicht wo das Problem sein soll, gebe zu bin bissl Faul mich darein zu denken.
Beschreib mal was du wie genau machen willst...
__________
Email/XMPP: therion at ninth-art dot de
IRC: megatherion @ Freenode
Seitenanfang Seitenende
21.08.2009, 11:21
...neu hier

Themenstarter

Beiträge: 9
#6 also es werden daten aus der datenbank in kästchen gefüllt, die der nutzer bearbeiten kann. diese neuen daten will ich dann schicken. die kästchen mit den daten werden in der 1. datei (siehe oben) gespeichert.
mein problem ist jetzt nur, dass nicht die aktuell eingegebenen daten gespeichert werden, weil die neuen variablen nirgendwo aufgerufen werden. es wird nur das array(gespeichert in einem string, deswegen die 2 komischen funktionen) rübergeschickt.
was ich will, ist, dass die neu eingegebenen daten gespeichert werden, bevor das array "komprimiert" wird. ich weiß nicht, wie ich es noch deutlicher beschreiben soll...
Seitenanfang Seitenende
21.08.2009, 11:41
Member
Avatar Xeper

Beiträge: 5285
#7

Zitat

also es werden daten aus der datenbank in kästchen gefüllt
Kästchen? ;)
Die Dinge nennt man bei ihrem Namen wie zb. input Felder.
Hmm naja schwer zu verstehen...

Zitat

$post = ($_POST['alleDaten']);
$status = $_POST['stat'];

$var = base64_decode($post);
$daten = unserialize($var);
Was sind denn hier alleDaten wo kommt das her? Warum in base64 encoded und dann serialisiert?
Welchen Sinn mag des haben?

Eigentlich ist das einfach was du willst allerdings versteh ich deine Umsetzung nicht.
Gehen wir mal in der Theorie weiter, ich abe ein Formular und da werden Daten von einer Datenbank eingefügt okay...
Wenn ich jetzt neue Daten speichern will dann soll der Benutzer diese mittels POST abschicken und die werden dann am anderen Ende wieder angenommen und ersetzen die alten Daten mittels SQL Update wie du es ja hier auch schon tust.
__________
Email/XMPP: therion at ninth-art dot de
IRC: megatherion @ Freenode
Seitenanfang Seitenende
21.08.2009, 11:49
...neu hier

Themenstarter

Beiträge: 9
#8 :-) ja sorry....bin halt echt übelst anfänger...
ja genau das will ich machen, was du geschildert hast. allerdings ist das prob, dass ich nicht weiß, wieviele reihen von den input Feldern ich habe...d.h. ich mach das ganze in einer schleife. nun werden die variablen, die ich abschicke aber immer überspeichert, wenn ich sie nicht in ein array speichere. wenn man das per post schicken will, hilft es, wenn man serialisiert und base64 anwendet...habs ausprobiert...funktioniert sonst nicht!
ja mein problem ist, dass ich irgendwie nicht schaffe, alle daten, die ich abschicken will, auch am ende zu erhalten...wegen der while-schleife.
und wenn ich die in dem array hab, dann ändert der die neu eingegebenen daten trotzdem nicht, bevor ich es "komprimiere". verstehst du? d.h. im moment werden die alten daten rübergeschickt...ich weiß halt nicht wie man das anders machen kann. kann dir auch mal den code von der wichtigeren datei nochmal aktuell geben:

PHP Code


<?php
$data 
= array( );

        while(
$row mysql_fetch_row($db_erg)) $data[] = $row;
        
mysql_free_result($db_erg);

        for(
$i 0$i sizeof($data); $i++){
            
$status $data[5];
            if(
$status == 0){
                
$status "reserviert";
            }else{
                
$status "belegt";
            }

            
?>
            <form action="speichern.php" method="post" style="background-color: orange;">
            Rufnummer:<?php echo" <u><b>" .$data[$i][0]. "</b></u> &amp;nbsp Status: <u><b> ".$status."</b></u>" ?>
            &amp;nbsp;&amp;nbsp;Name <input  type="text" name="name" value="<?php echo $data[$i][1]; ?>"/>
            Einrichtung <input  type="text" name="einrichtung" value="<?php echo $data[$i][2]; ?>"/>
            Node <input  type="text" name="node" value="<?php echo $data[$i][3]; ?>"/>
            Status &amp;auml;ndern <input type="checkbox" name="status" />

            <br />
        <?php
        
}

        
$variable serialize($data);
        
$var base64_encode($variable);
        
?>
        <form action="speichern.php" method="post" style="background-color: orange;">

        <input type="hidden" name="alleDaten" value="<?php echo $var ?>"/>
        <input type="hidden" name="stat" value="<?php echo $status ?>"/>
        <input type="Submit" name="speichern" value="Daten speichern"/>
        <?php

    
}
?>

Seitenanfang Seitenende
21.08.2009, 11:57
Member
Avatar Xeper

Beiträge: 5285
#9

Zitat

die ich abschicke aber immer überspeichert, wenn ich sie nicht in ein array speichere. wenn man das per post schicken will, hilft es, wenn man serialisiert und base64 anwendet...habs ausprobiert...funktioniert sonst nicht!
Es ist klar das du keine abstrakten Datenstrukturen über HTTP abschicken kannst, allerdings würde ich trotzdem davon absehen.

Du machst hier übelst grundlegende Designfehler, Mischung mit PHP/HTML, dynamische Generierung von aneinandergereihten HTML code und und und...
Da kann man nicht wirklich was machen, wir müßten jetzt erstmal klären warum du nicht weißt wieviele Felder du benötigst??
Warum musst du zich html input Felder generieren, ich denke mal das dein ganzer Ansatz einfach falsch ist.

Vielleicht sollten wir ganz von vorne anfangen, wozu soll das gut sein?
Was willst du realisieren? Bis jetzt erkenne ich das es sich um eine Art Datensatz für Personen oder ähnliches handelt mit Adresse, Telefonnummer usw.
Aber das erklärt nicht warum du eine unbekannte Anzahl von Formularfeldern brauchst, dass HTML Dokument sollte erstmal für sich stehen und statisch sein.
Keine unbekannte Anzahl mehr einfach nur die Felder die du für einen Datensatz benötigst... diese Daten sollen ja angenommen werden vom server-side PHP Script.
Und du möchtest die Daten verändern können also abrufen können, dann musst due eine choice machen wo alle verfügbaren Datensätze (oder Kundennamen, IDs, etc.) geladen sind und du die somit auswählen kannst.
Außerdem muss übertragen werden um welchen Datensatz es sich gerade handelt, für sowas eignet sich SQL mäßig nen integer als ID und primary key.
__________
Email/XMPP: therion at ninth-art dot de
IRC: megatherion @ Freenode
Seitenanfang Seitenende
21.08.2009, 12:21
...neu hier

Themenstarter

Beiträge: 9
#10 es soll möglich sein, eine anzahl von nummern einzugeben, bei denen die daten geändert werden. da ich aber nicht weiß, wieviele daten das sind, kann ich auch nicht wissen, wieviele felder ich erzeugen muss. das geht nicht anders.
und ich muss es mit html und php erzeugen...wüsste nicht, wie ich das anders anstellen soll...
Seitenanfang Seitenende
21.08.2009, 12:34
Member
Avatar Xeper

Beiträge: 5285
#11 Dann würde man immer noch nicht mehr oder weniger Felder haben, es gibt auch die Möglichkeit mehrere Nummern in ein Feld einzugeben.
Außerdem wie gesagt in HTML gibts auch andere Wege, <select> zb.
__________
Email/XMPP: therion at ninth-art dot de
IRC: megatherion @ Freenode
Dieser Beitrag wurde am 21.08.2009 um 12:38 Uhr von Xeper editiert.
Seitenanfang Seitenende
21.08.2009, 14:43
...neu hier

Themenstarter

Beiträge: 9
#12 ich bin jetzt soweit, dass er sie rübersendet, die aktuellen daten....
ich weiß nur nicht, wie ich sie auslesen soll :-)
vll kann mir ja jemand weiterhelfen.... bei print_r($_POST) kommt folgender text:


Array ( [name] => Array ( [1] => Array ( [0] => Bettina [1] => Paul [2] => Gerhard ) ) [einrichtung] => Array ( [2] => Array ( [0] => bla [1] => blubb [2] => blubblubb ) ) [node] => Array ( [3] => Array ( [0] => node1 [1] => node2 [2] => node3 ) )


kann mir jemand sagen, was ich jetzt aufrufen muss, wenn ich das wort Bettina haben will?
Seitenanfang Seitenende
21.08.2009, 14:51
Member
Avatar Xeper

Beiträge: 5285
#13 Offensichtlich ist es $_POST["name"][1][0]

Denke mal des topic kann offensichtlich geschlossen werden;)
Empfehle mal noch das PHP Book von O'Reilly.


__________
Email/XMPP: therion at ninth-art dot de
IRC: megatherion @ Freenode
Seitenanfang Seitenende
21.08.2009, 15:04
...neu hier

Themenstarter

Beiträge: 9
#14 vielen vielen dank für die geduld und die hilfe!! :-)
Seitenanfang Seitenende
Um auf dieses Thema zu ANTWORTEN
bitte erst » hier kostenlos registrieren!!

Folgende Themen könnten Dich auch interessieren: