Avatar billede phillipvarsted Nybegynder
27. december 2012 - 17:06 Der er 25 kommentarer og
1 løsning

PHP MySQL Update Tabel fejl

Hej eksperter!

Jeg har et problem med min kodning - har lavet en form der opdaterer min data i min database. Er der nogen af jer som kan se fejlen? Poster koden under:


<?
   
    // Kundeinformationen
    $kundenavn = addslashes($_POST[kundefirmanavn]);
    $adresse = addslashes($_POST[kundefirmaadresse]);
    $postboks = addslashes($_POST[kundefirmapostboks]);
    $postnr = addslashes($_POST[kundefirmapostnr]);
    $by = addslashes($_POST[kundefirmaby]);
    $kundeemail = addslashes($_POST[kundefirmaemail]);
    $kundeemail2 = addslashes($_POST[kundefirmaemail2]);
   
    // Beskrivelsen
    $dato = addslashes($_POST[dato]);
    $fakturanr = addslashes($_POST[fakturanr]);
    $debitor = addslashes($_POST[debitor]);
    $ref = addslashes($_POST[ref]);
   
    // Forsikringen
    $selskab = addslashes($_POST[selskab]);
    $att = addslashes($_POST[att]);
    $forsikringemail = addslashes($_POST[forsikring_email]);
    $skadesnummer = addslashes($_POST[skadesnummer]);
   
    // Priserne
    $beskrivelse = addslashes($_POST[FakBeskrivelse]);
    $enhed = addslashes($_POST[FakEnhed]);
    $stk = addslashes($_POST[FakStk]);
    $prisekslmoms = addslashes($_POST[FakPrisEkslMoms]);
   
    $fejl = "<p3>Denne faktura er nu blevet gemt..</p3>";
   
    // Tjekker om submit knappen er trykket
    if (isset($_POST["gemfaktura"]) && $_POST["gemfaktura"]!= ""){
       
        $mysqli->query("UPDATE faktura_kunder
       
        set navn = '".$kundenavn."',
        adresse = '".$adresse."',
        postboks = '".$postboks."',
        postnr = '".$postnr."',
        by = '".$by."',
        email = '".$kundeemail."',
        email2 = '".$kundeemail2."'
       
        WHERE fak_nr = '".$_GET[fak_nr]."'");
       
        echo $fejl;
       
    }
   
    ?>
   
   
    <form action="" method="POST">
   
    <table id="fak_kunde">
        <tr><td width="140"><p3><b>Kundeinformation:</b></p3></td></tr>
        <tr><td><p3>Kunde/firma navn:</p3></td><td><input type="text" name="kundefirmanavn" size="30" value="<? echo retfaktura_kunde_navn() ?>"></td></tr>
        <tr><td><p3>Adresse:</p3></td><td><input type="text" name="kundefirmaadresse" size="30" value="<? echo retfaktura_adresse() ?>"></td></tr>
        <tr><td><p3>Postboks:</p3></td><td><input type="text" name="kundefirmapostboks" size="30" value="<? echo retfaktura_postboks() ?>"></td></tr>
        <tr><td><p3>Post nr. / by:</p3></td><td><input type="text" name="kundefirmapostnr" size="4" style="margin-right:2px;" value="<? echo retfaktura_postnr() ?>"><input type="text" name="kundefirmaby" size="21" value="<? echo retfaktura_by() ?>"></td></tr>
        <tr><td><p3>E-mail adresse:</p3></td><td><input type="text" name="kundefirmaemail" size="30" value="<? echo retfaktura_email() ?>"></td></tr>
        <tr><td><p3>2. E-mail adresse:</p3></td><td><input type="text" name="kundefirmaemail2" size="30" value="<? echo retfaktura_email2() ?>"></td></tr>       
    </table>

    <table id="fak_beskrivelse">
        <tr><td width="140"><p3><b> </b></p3></td></tr>
        <tr><td><p3>Dato:</p3></td><td><input type="text" name="dato" size="30" value="<? echo retfaktura_dato() ?>"></td></tr>
        <tr><td><p3>Faktura nr.:</p3></td><td><input type="text" name="fakturanr" size="30" value="<? echo retfaktura_fak_nr() ?>"></td></tr>
        <tr><td><p3>Debitor:</p3></td><td><input type="text" name="debitor" size="30" value="<? echo retfaktura_debitor() ?>"></td></tr>
        <tr><td><p3>Ref:</p3></td><td><input type="text" name="ref" size="30" value="<? echo retfaktura_ref() ?>"></td></tr>
    </table>
   
    <br><br><br>
   
    <table id="fak_forsikring">
        <tr><td width="140"><p3><b>Forsikring:</b></p3></td></tr>
        <tr><td><p3>Selskab:</p3></td><td><input type="text" name="selskab" size="30" value="<? echo retfaktura_forsikringsselskab() ?>"></td></tr>
        <tr><td><p3>Att.:</p3></td><td><input type="text" name="att" size="30" value="<? echo retfaktura_att() ?>"></td></tr>
        <tr><td><p3>E-mail:</p3></td><td><input type="text" name="forsikring_email" size="30" value="<? echo retfaktura_forsikringemail() ?>"></td></tr>
        <tr><td><p3>Skadesnummer:</p3></td><td><input type="text" name="skadesnummer" size="30" value="<? echo retfaktura_skadesnummer() ?>"></td></tr>
    </table>

    <br><br><br><br><br><br><br>
   
   
    <h3>Faktura</h3>
   
    <table id="priser">
        <tr>
            <td><p3><b>Beskrivelse:</b></p3></td>
            <td><p3><b>Enhed:</b></p3></td>
            <td><p3><b>Stk.:</b></p3></td>
            <td><p3><b>Pris eksl. moms:</b></p3></td>
        </tr>
       
        <?
        $fakq = $mysqli->query("SELECT * FROM faktura_priser WHERE fak_nr = '$_GET[fak_nr]'");
        while ($fak = mysqli_fetch_array($fakq)){
        ?>
        <tr>
            <td><p3><input type="text" name="FakBeskrivelse" size="70" value="<? echo $fak[beskrivelse] ?>"></p3></td>
            <td><p3><input type="text" name="FakEnhed" size="8" value="<? echo $fak[enhed] ?>"></p3></td>
            <td><p3><input type="text" name="FakStk" size="8" value="<? echo $fak[stk] ?>"></p3></td>
            <td><p3><input type="text" name="FakPrisEkslMoms" size="30" value="<? echo "".number_format($fak[vejleksmoms],2,",",".")."" ?>"></p3></td>
        </tr>
        <?
        }
        ?>
    </table>
   
    <br><input class="submit" type="submit" name="gemfaktura" value="Gem faktura">
   
    </form>
Avatar billede michael_stim Ekspert
27. december 2012 - 17:51 #1
Ærligt talt, så kan jeg ikke se nogen grund til at vi skal sidde og lede efter fejl. Du må komme med lidt mere.
Hvad gør den (ikke)?
Hvad burde den gøre?
Har du slået fejlmeddelelser til?
Hvilken fejl får du?
Osv osv.
Avatar billede phillipvarsted Nybegynder
27. december 2012 - 18:04 #2
Jeg får ingen fejlmeddelelser. Det koden burde gøre er, at update mine informationer ved hjælp af disse input felter. Det vil sige, at hvis jeg under "Navn:" ændre navnet fra Peter Larsen til Jens Hansen, så skal koden update min MySQL row der hedder navn til det ny-indtastet navn.

Når jeg trykker på "Gem faktura", så ryger den fint videre - det vil sige, at jeg får min besked "Fakturen er gemt", men den bliver ikke opdateret i databasen som den meget gerne skulle gøre :)
Avatar billede arne_v Ekspert
27. december 2012 - 18:25 #3
Du kunne starte med at teste paa om $mysqli->query returnerer en fejl.
Avatar billede phillipvarsted Nybegynder
27. december 2012 - 18:49 #4
Hvordan?
Avatar billede arne_v Ekspert
27. december 2012 - 18:54 #5
$mysqli->query("...");

->

if(!$mysqli->query("...")) die('Ooooops: ' . $mysqli->error);

eller noget tilsvarende.
Avatar billede olebole Juniormester
27. december 2012 - 18:55 #6
<ole>

Det har ikke umiddelbar indflydelse på virkemåden af din kode, men du bør altid escape et arraykald: [b]$_POST['kundefirmanavn'].

Derudover er jeg lidt nysgerrig efter begrundelsen for at bruge MySQLI  =)

/mvh
</bole>
Avatar billede phillipvarsted Nybegynder
27. december 2012 - 18:57 #7
Jeg er begyndt at bruge MySQLI da det umiddelbart lyder som om, at det fungerer hurtigere og mere effektivt :)
Avatar billede erikjacobsen Ekspert
27. december 2012 - 19:01 #8
Du har misforstået mysqli - men det er ikke derfor det ikke virker.

Du bør nok undesøge, om der står noget i $_GET[fak_nr]
Avatar billede olebole Juniormester
27. december 2012 - 19:02 #9
Der er ikke nævneværdig forskel på det, du laver og ganske almindelig, gammeldags MySQL.

Fordelene ved MySQLI får du ved brug af prepared statements. Bruger du PS, gør det din kode sikker overfor SQL-injection (og så kan du springe 'addslashes-hackeriet' over) - og gør den i mange tilfælde væsentligt hurtigere
Avatar billede olebole Juniormester
27. december 2012 - 19:03 #10
*LoL* Godt set, Erik  *o)
Avatar billede arne_v Ekspert
27. december 2012 - 19:04 #11
mysqli og addslashes er vist lidt som at smide en Lada 1200 motor i en formel 1 racer

:-)
Avatar billede phillipvarsted Nybegynder
27. december 2012 - 19:06 #12
#erikjacobsen

Jeg har prøvet at ændre:
WHERE fak_nr = '".$_GET[fak_nr]."'

.. til:
WHERE fak_nr = '1'

Fak_nr = 1 er min test faktura som jeg tester med. Jeg får samme effekt ved at ændre den til dette..
Avatar billede phillipvarsted Nybegynder
27. december 2012 - 19:08 #13
#olebole

Jeg har kigget på din guide med Prepared Statements og dem anvender jeg skam også. Dette er min test side. Det vil sige, at jeg kun bruger denne side som test - hvis koden virker tilføjer jeg alle mine prepared statements.

Det er bare blevet en vane at bruge addslashes når jeg tester mine PHP-koder :)
Avatar billede arne_v Ekspert
27. december 2012 - 19:10 #14
Der er gode og daarlige vaner.

:-)
Avatar billede phillipvarsted Nybegynder
27. december 2012 - 19:16 #15
#arne_v

Jeg brugte din metode du nævnet længere oppe med at bruge if(!$mysqli->query(...)) die('Ooops:'...), og denne fejlmeddelse tjekkede frem:

Fejl:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'by = 'Middelfart', email = 'km@lbg.dk', email2 = 'kj@rdsmontanagroup.dk' ' at line 7
Avatar billede olebole Juniormester
27. december 2012 - 19:18 #16
by er et reserveret ord i MySQL. Du kan bruge backticks omkring den slags ord (eller undlade dem): `by`
Avatar billede olebole Juniormester
27. december 2012 - 19:21 #17
- og hvad angår $_GET['fak_nr'], så mener Erik nok, at det er meget lidt sandsynligt at finde en $_GET variabel fra en form, sendt med method="post".

Hint: Der står aldrig noget i den variabel  *o)
Avatar billede phillipvarsted Nybegynder
27. december 2012 - 19:23 #18
Tak for hjælpen! Det hjalp! Det var ordet by som var reserveret som olebole sagde. Backtickets hjalp som du sagde. Tak :)
Avatar billede olebole Juniormester
27. december 2012 - 19:24 #19
"Det vil sige, at jeg kun bruger denne side som test - hvis koden virker tilføjer jeg alle mine prepared statements."

Er det mon klogt at teste en kode, man ikke skal bruge til noget? Ville det mon være mere hensigtsmæssigt at teste den kode, der faktisk skal bruges? Bare en tanke  =)
Avatar billede olebole Juniormester
27. december 2012 - 19:29 #20
Så må det være arne_v's point. Det var hans idé med at få dig til at teste på MySQLI-fejl, der kunne vise dig, hvor fejlen lå. Jeg må indrømme, at jeg havde overset fejlen i min undren over den øvrige syntaks - men jeg har på fornemmeren, at Arne faktisk havde set den. Den er trods alt lidt af en klassiker her i landet  *o)
Avatar billede olebole Juniormester
27. december 2012 - 19:31 #21
PS: og årsagen er selvfølgelig f.eks. statements som 'ORDER BY'. Det sætter selvsagt vand over til ballade at bruge 'BY' til andet  *o)
Avatar billede phillipvarsted Nybegynder
27. december 2012 - 19:49 #22
"Er det mon klogt at teste en kode, man ikke skal bruge til noget? Ville det mon være mere hensigtsmæssigt at teste den kode, der faktisk skal bruges?"

Du har ret i, at det ikke er klogt at teste et stykke kode man ikke skal bruge til noget, men koden her skal faktisk bruges i vores brugersystem. Det jeg mente med at teste var, at jeg opretter en ny testside.php som hvor jeg så skriver koden i. Det giver mig et bedre overblik over mine koder :)

#arne_v

Hvis du smider et svar, så accepterer jeg lige dit svar.

.. mange tak for hjælpen til både dig Olebole og Arne_v!
Avatar billede olebole Juniormester
27. december 2012 - 20:28 #23
Jeg forstår det stadig ikke, men hvis det gør dig glad, skal jeg ikke blande mig  =)
Avatar billede arne_v Ekspert
27. december 2012 - 21:18 #24
Der er forskellige tilgange til at finde fejl.

Man kan kigge paa koden til man bliver blaa i hovedet og haabe at man ser noget.

Nogen gange ser man noget.

Du kunne sagtens have vaeret heldig og en straks havde set BY.

Men man kan altsaa ogsaa vaere uheldig og ingen lige ser det.

Alternativet er at man laver en mere systematisk fejlsoegning.

Hvis man goer det saa vil relativt trivielle fejl som denn altid blive hurtigt fundet.

Noget af det ferste man kan goere er at sikre sig at man faar alle fejlmeddelelser ud.

Det er ikke altid fejlmeddelser er gode, men tit giver de meget klar besked om hvad problemet er og/eller hvor problemet er.
Avatar billede arne_v Ekspert
27. december 2012 - 21:18 #25
og et svar
Avatar billede olebole Juniormester
27. december 2012 - 21:34 #26
Arne, for pokker! Det der får vi da aldrig en diskusion ud af!  *D
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