Avatar billede puffin Nybegynder
27. december 2004 - 01:15 Der er 15 kommentarer og
1 løsning

Side opdateres, men henter gammel tekst frem igen?

Jeg er lige begyndt at lære PHP og er stødt ind i et træls problem med en side jeg er ved at lave :(

Jeg har lavet en række tekstfelter der opdaterer en MySQL database med en submit-knap, men efter databasen er blevet opdateret, nøjagtigt som den skal, kommer teksten der stod i tekstfelterne frem igen... jeg vil gerne have den nye tekst bliver der... hvad gør jeg forkert.. eller hvad mangler jeg?

Hele sidens kode er som følger:

<html>

<head>
    <?php
        include('connect.php');
       
        $id = $_REQUEST["id"];
       
        echo    "<title>Vogn $id</title>";
    ?>
    <link rel="stylesheet" type="text/css" href="style.css">
   
</head>

<body>
<?php
    echo    "<h2>Vogn $id</h2>";
   
    $q=mysql_query("SELECT * FROM vestjysk_camping WHERE id=$id") or die(mysql_error());
   
    while($r=mysql_fetch_array($q)){
        extract($r);
        }
   
    if    ($dato == "0000-00-00") {
        $dato = "yyyy-mm-dd";
        }
?>

<br>

<?php
    echo "<form method='post' action='vcc.php?id=$id'>";
?>

    <table border="0" align="left">
        <tr>
            <?php
                echo    "<td>Fornavn og efternavn:</td><td><input text='' name='navn' value='$navn'></td>";
            ?>
        </tr>
        <tr>
            <?php
                echo    "<td>Adresse:</td><td><input text='' name='adresse' value='$adresse'></td>";
            ?>
        </tr>
        <tr>
            <?php
                echo    "<td>Postnummer:</td><td><input text='' name='postnr' maxlength='4' value='$postnr'></td>";
            ?>
        </tr>
        <tr>
            <?php
                echo    "<td>By:</td><td><input text='' name='city' value='$city'></td>";
            ?>
        </tr>
        <tr>
            <?php
                echo    "<td>Telefon:</td><td><input text='' name='telefon' maxlength='8' value='$telefon'></td>";
            ?>
        </tr>
        <tr>
            <?php
                echo    "<td>Udløbsdato:</td><td><input text='' name='dato' value='$dato' maxlength='10'></td>";
            ?>
        </tr>
        <tr>
            <td align="center"><br><input type="submit" name="update" value="Gem ændringer"></td><td align="center"><br><input type="submit" name="slet" value="Slet alt"></td>
        </tr>
        <tr>
            <td colspan="2">
            <?php
                $id = $_REQUEST["id"];
                $update = $_REQUEST["update"];
                $slet = $_REQUEST["slet"];
                $navn = $_REQUEST["navn"];
                $telefon = $_REQUEST["telefon"];
                $adresse = $_REQUEST["adresse"];
                $postnr = $_REQUEST["postnr"];
                $city = $_REQUEST["city"];
                $dato = $_REQUEST["dato"];

                if ($update){
                    mysql_query("UPDATE vestjysk_camping SET navn='$navn', telefon='$telefon', adresse='$adresse', postnr='$postnr', city='$city', dato='$dato' WHERE id=$id") or die(mysql_error());
               
                    echo "<br><br>Oplysningerne er blevet opdateret.";
                }
               
                if ($slet){
                    mysql_query("UPDATE vestjysk_camping SET navn='', telefon='', adresse='', postnr='', city='', dato='' WHERE id=$id") or die(mysql_error());
               
                    echo "<br><br>Oplysningerne er blevet slettet.";
                }
            ?>
            </td>
        </tr>
    </table>
   
<?php
    echo "</form>";
?>

<?php
    mysql_close(); //stopper database forbindelsen
?>

</body>

</html>

Håber der er en flink sjæl der kan hjælpe :)
Avatar billede morteeart Nybegynder
27. december 2004 - 01:48 #1
prøv at lave korrekt echo's:

echo "<td>Adresse:</td><td><input type=\"text\" name=\"adresse\" value=\"".$adresse."\"></td>";
Avatar billede puffin Nybegynder
27. december 2004 - 02:04 #2
Hvad er forskellen da på den og det jeg har skrevet?

Prøvede det, og intet nyt skete. Den gemmer stadig infoen fint, men efter man har trykket på "Gem ændringer" kommer den gamle tekst frem, indtil man opdaterer siden.
Avatar billede morteeart Nybegynder
27. december 2004 - 02:09 #3
Faktisk så er begge dele alt for besværligt.

<tr>
<td>
Fornavn og efternavn:</td><td><input type="text" name="navn" value="<? echo $navn; ?>">
</td>
</tr>

Er meget bedre.
Avatar billede puffin Nybegynder
27. december 2004 - 02:32 #4
Det er rigtigt nok lettere, men problemet er der stadigt...

http://www.puffin.dk/camping/vcc.php?id=21

ovenstående er et exempel på koden. Den viser fint indholdet af databasen og man kan fint opdatere, men når man trykker gem kommer de gamle værdier frem igen, selvom de nye lige er blevet gemt. :(
Avatar billede morteeart Nybegynder
27. december 2004 - 03:01 #5
ahh, ja det er klart, du skal jo opdateret siden f.eks. med et redirect, med header.
MySQL henter jo ikke nyt bare fordi du laver en kommando.

Mht. din kode så er virker den måske, men det er fuld af fejl, og bryder stort set alle standarter for god kodning inden for php.
Den burde faktisk slet ikke virke.


if ($update)
{
mysql_query("UPDATE vestjysk_camping SET navn='$navn', telefon='$telefon', adresse='$adresse', postnr='$postnr', city='$city', dato='$dato' WHERE id=$id") or die(mysql_error());

$page = $_SERVER['PHP_SELF'];
header("Location: $page "); // redirecter tilbage til samme side som man er på.
}
Avatar billede erikjacobsen Ekspert
27. december 2004 - 08:53 #6
Lav din update sætning *før* du laver din select sætning - altså øverst i din kode,
som du viser den. Når det så virker, vender du tilbage og får lavet koden ordentligt -
der er nemlig en række mindre heldige ting... ;)
Avatar billede puffin Nybegynder
27. december 2004 - 16:20 #7
#erikjacobsen
Hvordan mener du jeg bør gøre det? Jeg har siddet og leget lidt med det, men enten kommer den med fejl eller opdaterer databasen inden den har hentet indholdet ud og dermed sletter hvad der nu stod i den.

#morteeart
Jeg har også prøvet at lege lidt med en header som du skriver, men lige meget hvor i dokumentet jeg placerer den, får jeg den fejl at "header already sent".

Er sådan lidt rimelig lost lige nu... eneste måde jeg kan få den til at du på, er som i min første post... jeg har dog smidt det meste udenfor php, som morteeart foreslog.
<td>
Fornavn og efternavn:</td><td><input type="text" name="navn" value="<? echo $navn; ?>">
</td>
Avatar billede erikjacobsen Ekspert
27. december 2004 - 17:52 #8
Flyt alt det fra

          <?php
                $id = $_REQUEST["id"];
                $update = $_REQUEST["update"];

og frem op i toppen.
Avatar billede puffin Nybegynder
27. december 2004 - 17:59 #9
Det syntes jeg jeg så absolut jeg havde prøvet, men whatever... nu virker det som det skal... takker.

I skrev noget om der er noget i vejen med den måde jeg skriver min kode på, og jeg bryder stort set alle standarter for god kodning osv...

Hvordan burde jeg gøre?

Lige nu ser min kode sådan ud:

<html>

<head>
    <?php
        include('connect.php');
   
        $id = $_REQUEST["id"];
        $update = $_REQUEST["update"];
        $slet = $_REQUEST["slet"];
        $navn = $_REQUEST["navn"];
        $telefon = $_REQUEST["telefon"];
        $adresse = $_REQUEST["adresse"];
        $postnr = $_REQUEST["postnr"];
        $city = $_REQUEST["city"];
        $dato = $_REQUEST["dato"];

        if ($update){
            mysql_query("UPDATE vestjysk_camping SET navn='$navn', telefon='$telefon', adresse='$adresse', postnr='$postnr', city='$city', dato='$dato' WHERE id=$id") or die(mysql_error());
             
            echo "<br><br>Oplysningerne er blevet opdateret.";
        }
             
        if ($slet){
            mysql_query("UPDATE vestjysk_camping SET navn='', telefon='', adresse='', postnr='', city='', dato='' WHERE id=$id") or die(mysql_error());
             
            echo "<br><br>Oplysningerne er blevet slettet.";
        }   
       
        $q=mysql_query("SELECT * FROM vestjysk_camping WHERE id=$id") or die(mysql_error());
 
          while($r=mysql_fetch_array($q)){
            extract($r);
        }
 
        if ($dato == "0000-00-00") {
            $dato = "yyyy-mm-dd";
        }
           
        echo    "<title>Vogn $id</title>";
    ?>
    <link rel="stylesheet" type="text/css" href="style.css">
 
</head>

<body>
<?php
    echo    "<h2>Vogn $id</h2>";

    echo     "<br><form method='post' action='vcc.php?id=$id'>";
?>

    <table border="0" align="left">
        <tr>
            <td>Fornavn og efternavn:</td><td><input text='' name='navn' value="<?php echo "$navn"; ?>"></td>
        </tr>
        <tr>
              <td>Adresse:</td><td><input text='' name='adresse' value="<?php echo "$adresse"; ?>"></td>
        </tr>
        <tr>
            <td>Postnummer:</td><td><input text='' name='postnr' maxlength='4' value="<?php echo "$postnr"; ?>"></td>
        </tr>
        <tr>
            <td>By:</td><td><input text='' name='city' value="<?php echo "$city"; ?>"></td>
        </tr>
        <tr>
            <td>Telefon:</td><td><input text='' name='telefon' maxlength='8' value="<?php echo "$telefon"; ?>"></td>
        </tr>
        <tr>
            <td>Udløbsdato:</td><td><input text='' name='dato' value="<?php echo "$dato"; ?>" maxlength='10'></td>
        </tr>
        <tr>
            <td align="center"><br><input type="submit" name="update" value="Gem ændringer"></td><td align="center"><br><input type="submit" name="slet" value="Slet alt"></td>
        </tr>
    </table>
</form>

<?php
    mysql_close(); //stopper database forbindelsen
?>

</body>

</html>
Avatar billede erikjacobsen Ekspert
27. december 2004 - 18:10 #10
Lad os tage en enkelt ting. Du skal *ikke* (i betydningen: aldrig) bruge extract.
Lav

    while($r=mysql_fetch_array($q)){
            extract($r);
        }

om til

      if($r=mysql_fetch_array($q)){
      //... alt det du har
      }

og brug $r['navnpåfeltet'] i stedet for. Du vil få mystiske fejl hvis du får
navnesammenfald med felter og variabler du selv laver.
Avatar billede erikjacobsen Ekspert
27. december 2004 - 18:11 #11
Punkt 2: du skal altid sørge for htmlentities når du laver HTML:

        <td>Fornavn og efternavn:</td><td><input text='' name='navn' value="<?php echo htmlentities($navn); ?>"></td>
Avatar billede erikjacobsen Ekspert
27. december 2004 - 18:11 #12
Og kombineret ;)


  <td>Fornavn og efternavn:</td><td><input text='' name='navn' value="<?php echo htmlentities($r['navn']); ?>"></td>
Avatar billede puffin Nybegynder
27. december 2004 - 19:00 #13
Hmm..

while($r=mysql_fetch_array($q)){
            extract($r);

var noget jeg læste i en begynder guide til php, så jeg troede egentlig det var meget fint. Hvad er der så slemt ved at bruge deet, og hvad er forskellen på det og det du skrev med if(...){ osv.

if($r=mysql_fetch_array($q)){
      //... alt det du har
      }
Hvad er det du mener jeg skal skrive der i mellem, hele tabellen eller?

Og så smid lige et svar hvis du vil have point, det problem jeg havde i starten, er jo så fint løst :)
Avatar billede puffin Nybegynder
27. december 2004 - 19:05 #14
.. eller mener du noget i stil med det her:

<td>Fornavn og efternavn:</td><td><input text='' name='navn' value="<?php if($r=mysql_fetch_array($q)){ echo htmlentities($r['navn']); } ?>"></td>

?
Avatar billede erikjacobsen Ekspert
27. december 2004 - 19:06 #15
//..alt det du har
betyder bare den kode hvor du bruger noget fra rækken i databasen, dvs. din form

extract giver navne i globalt scope, som man ikke kan se hvor kommer fra, og som
kan blandes sammen med navne du allerede har. Hold dig langt fra det site, hvor
den såkaldte begynderguide lå - den kan kun være skrevet af ondskabsfulde mennesker,
der ikke vil have at andre lære at bygge robuste it-systemer ;)

Jeg samler ikke på point, tak.
Avatar billede puffin Nybegynder
27. december 2004 - 19:15 #16
Jamen så siger jeg mange tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester