Avatar billede NielsErikP Mester
28. juni 2011 - 21:16 Der er 20 kommentarer og
2 løsninger

Gemme i DataBasen...??

Hej...
Er ny indenfor PHP/MySQL..osv.
Jeg prøver at oprette en gæstebog, har følgende scripts/Html formular, men kan ikke få det til at virke, Html formen kommer godt nok frem, og jeg skriver navn og besked, trykker "Send", felterne tømmes. Men den skriver ikke indlægget under formen, som var planen. Jeg prøver så at gå i PhpMyAdmin, hvor jeg oprettede DataBasen "web145-bog", vælger tabellen bog, men der ingen data i den.
Nogle der kan se, hvad der er galt, her er filen "gb1.php" indeholdende min kode :



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<?php

/* Tilpas variablerne til dine oplysninger */
    $host = "localhost";     //skal ikke ændres i 90% af tilfældende
    $bruger = "root";        //"navn på din bruger"; //se de udleverede papirer/spørg dit wehotel
    $kodeord = "";     //"MosterFie"; //dit personlige password
    $database = "web145-bog";        //"navn på din database"; //se de udleverede papirer/spørg dit wehotel
       
/* Herfra ændres på eget ansvar - Der forbindes til databasen */
    $db = mysql_connect($host,$bruger,$kodeord)or die ('Der kunne ikke forbindes til databasen. Fejl: ' . mysql_error());    //der connectes til databasen
    mysql_select_db($database,$db);       
                       
/* Der spam-tjekkes og navn og besked hentes i html formularen.  */   
    if(isset($_POST["skriv"]) &&  strtolower($_POST["spamtjek"]) == "grøn"){
        $navn = htmlspecialchars($_POST["navn"]); 
        $besked  = htmlspecialchars($_POST["besked"]);
       
/*Tjekker om begge felter er udfyldt*/       
        if($navn != "" || $besked != ""){
               
/* Sikkerheds script mod SQL injektions*/
            if(!get_magic_quotes_gpc()){           
                $navn = addslashes($navn);
                $besked = addslashes($besked);
            }
               
/* Der tester på om navn og besked er postet før. For at undgå ens indlæg, når man  opdaterer  siden */   
            $sql = "SELECT * FROM bog ";
            $sql .= "WHERE navn = '" . $navn . "' ";
            $sql .= "AND  besked = '" . $besked ."' ";
            $result= mysql_query($sql);
               
            if($row = mysql_fetch_row($result)){
                echo "<p style='color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{
                $dato_array=getdate();            //php datofunktion
                $dato = $dato_array["mday"] . "/" . $dato_array["mon"] . " - " . $dato_array["year"];
                mysql_query("INSERT INTO bog(navn, dato, besked) VALUES('$navn','$dato','$besked')");  //data skrives til tabellen bog
            }
        }   
    }
?>


<html>
<head>
    <title>
        Gæstebog.
    </title>
</head>

<h3>Gæstebog </h3>

<body>
    <form  method="post" id="gaestbog" action="C:\xampp\htdocs\gb1.php">
            <p>
                <input type="hidden" name="Skriv" value="1"/>
                navn: <br />
                <input type="text" name="navn" size="35"/> <br /> <br />
                Besked: <br />
                <textarea name="besked" cols="50" rows="10"></textarea>
                <br /> <br />
                Hvilken farve er skoven: <br />
                <input type="text" name="spamtjek" size="35" />
                <br />
                <input type="submit" value="Send"/>
            </p>
    </form>

<?php
   
    $foresp = mysql_query("SELECT navn, dato, besked FROM bog ORDER BY nr DESC") or die(mysql_error()); //Data hentes i tabellen bog
    echo "<table>";
   
    while($data = mysql_fetch_array($foresp)){
        echo "<tr><td style=\"vertical-align:top;padding:15px;\">";
        echo "<b>" . $data["navn"];
        echo "</b><br />";
        echo $data["dato"];
        echo "</td><td style='vertical-align:top;padding:15px;'>";
        echo nl2br($data["besked"]);    //nl2br = newline oversættes til html breaktag.
        echo "</td></tr>";
    }
    echo "</table>";
?>

</body>
</html>




På forhånd tak..!!
Avatar billede kjeldsted Novice
28. juni 2011 - 21:24 #1
Først og fremmest hedder dit hidden input "Skriv", men du tjekker et input der hedder "skriv". Så isset($_POST["skriv"]) vil jo bare være false.
Navne er case insensitive.
Avatar billede NielsErikP Mester
28. juni 2011 - 21:32 #2
Hej..
"By the way" flot hjemmeside du holder dig :-)
Okay...Ja det kan jeg se, kan det være nok til den ikke vil gemme i Databasen???
Avatar billede kjeldsted Novice
28. juni 2011 - 21:38 #3
Øh, jamen tak da. Jeg er vist den eneste her på stedet der ikke er tilfreds. Nå...

Ja. For hvis det statemet er false hopper den jo helt over din mysql_query. Så det kan sagtens være en grund.
Avatar billede NielsErikP Mester
28. juni 2011 - 21:41 #4
Hej igen..
"skriv er rettet", men den gemmer intet i "web145-bog" og udskriver heller ikke på siden!!!
Hvad pokker kan det skyldes  :



mysql_query("INSERT INTO bog(navn, dato, besked) VALUES('$navn','$dato','$besked')");  //data skrives til tabellen bog




Skulle jo gerne gemme i tabellen "bog".
Avatar billede kjeldsted Novice
28. juni 2011 - 21:43 #5
prøv at ret til:

mysql_query("INSERT INTO bog(navn, dato, besked) VALUES('$navn','$dato','$besked')") or die(mysql_error());  //data skrives til tabellen bog
Avatar billede NielsErikP Mester
28. juni 2011 - 21:47 #6
Hej..
Jeg har tænkt en tanke...min form action="C:\xampp\htdocs\gb1.php", skulle jo refererer stien til gæstebogs scriptet.
Så jeg tænker lidt kan selv opbygningen af php filen have en betydning, mener php scriptet der tjekker kommer jo før formen osv.. og udskrivnings scriptet kommer efter html formen, hvilket jo er ok.
Men kunne det betyde noget at lave dem i flere filer???
Avatar billede NielsErikP Mester
28. juni 2011 - 21:53 #7
Hej...
Har prøvet dit forslag i #5, men den "die'r" ikke, der kommer ingen fejlmelding osv...
Avatar billede heinzdmx Nybegynder
28. juni 2011 - 22:33 #8
Din form action peger til en lokal filsti:
C:\xampp\htdocs\gb1.php

Det skal den ikke, den skal pege til hvor serveren befinder sig.

Jeg ville sætte action="/gb1.php"

Så bliver den kørt på serveren og ikke lokalt
Avatar billede kjeldsted Novice
28. juni 2011 - 22:56 #9
Altså mht. action kan du jo også bare skrive action="<?=$PHP_SELF?>" så kommer du til den den side du er på i forvejen. Og det ser det ud til at det er det du ønsker.

Men du kan jo prøve et par steder efter
if(isset($_POST["skriv"]) &&  strtolower($_POST["spamtjek"]) == "grøn"){
at udskrive nogle test variabler, kan du se hvor langt den kommer.
Avatar billede heinzdmx Nybegynder
28. juni 2011 - 23:11 #10
PHP_SELF er ikke helt problemfri, på nogen servere er den ikke sat, på andre kan du risikere injections af kode fra brugeren

http://www.php.net/manual/en/reserved.variables.php#55068
Avatar billede kjeldsted Novice
28. juni 2011 - 23:25 #11
#10
Hm. Den har jeg faktisk ikke hørt før. Men man bliver vel klogere hver dag :)
Avatar billede NielsErikP Mester
28. juni 2011 - 23:35 #12
Hej..
Ja nu har jeg prøvet at følge server rådet i #8. Funger ikke den udskriver ikke indlægget og kigger jeg i databasen i phpmyadmin,, Er der ingen data..hmmmmmmmm..

Kender ikke til php_self, vil prøvce at kigge, men kunne forestille mig det var en global variable??

#9...
Ja det kunne jeg jo prøve...


Er der stadig nogle med råd til #0.. Så svar gerne, point stadig i spil ;-)
Avatar billede heinzdmx Nybegynder
28. juni 2011 - 23:42 #13
Personligt bruger jeg ikke magic_quotes da jeg har læst et sted at det ikke altid gør som det skal.

I stedet kan du (med mysql) bruge

mysql_real_escape_string

Lidt forklaring:
http://www.tizag.com/mysqlTutorial/mysql-php-sql-injection.php
Avatar billede kjeldsted Novice
28. juni 2011 - 23:44 #14
Øh... Nu var #9 jo sådan set et forsøg på at finde fejlen i #0. Ganske almindelig fejlfinding.
Avatar billede heinzdmx Nybegynder
28. juni 2011 - 23:52 #15
Eftersom han skriver han er ny, tænker jeg at det ikke gør noget at komme med gode råd inden han begynder at få dårlige vaner uden at vide det...

Men til selve problemet så bør du nok lave nogle echo sætninger der tjekker hvor langt du kommer igennem det hele
Avatar billede NielsErikP Mester
28. juni 2011 - 23:53 #16
Hej..
Ja. kjeldsted, ved godt godt det var et forsøg på "Debugging" i #9, heller ikke at forstå sådan at jeg ikke er glad for det indlæg, men det tager jo lige sin tid at "debugge", sker nok ikke lige i aften, men med MySql'en i #4 fatter jeg bare ikke den ikke indsætter nogle data i den tabel.

#13 :
Okay tak for erfaringen, vil kigge lidt på den real_ascape istedet.
Avatar billede NielsErikP Mester
28. juni 2011 - 23:57 #17
Hej...
#15:
Det vil HAN prøve!!
Avatar billede kjeldsted Novice
28. juni 2011 - 23:58 #18
Det hurtigste er helt klart at debugge på det. Det er i hvert fald sådan at jeg selv koder, når tingene driller. Så det bør nok være næste skridt :)

#15: Så sandt, så sandt :)
Avatar billede NielsErikP Mester
29. juni 2011 - 00:20 #19
Hej..
Det prøver jeg, jeg håber vi kan lade spørgsmålet stå åben lidt for gode ideer, og evt, lidt støtte under "debug"'en.
Jeg husker kjeldsted og heinzdms.
Avatar billede NielsErikP Mester
29. juni 2011 - 01:05 #20
Hej..
Kjeldsted... Det må du squ undskylde, du løste problemet i #1, jeg var ved at rette S'et i "isset($_POST["skriv"])", da jeg fandt ud af jeg hellere ville rette input navnet store S til lille s, så havde jeg slette S'et i "isset($_POST["skriv"]) " sådan der kun stod "kriv". Da jeg fik sat det S på virkede det hele. Men for hans indlæg og erfaring vil jeg godt give lidt til Heinzdms også.


Så læg venligst et svar begge to.

Tusind tak for hjælpen.!!
Avatar billede heinzdmx Nybegynder
29. juni 2011 - 01:20 #21
Evt. kan du give 20 point til ham og så 10 point til mig, da han jo løste dit egentlige problem :)
Avatar billede kjeldsted Novice
29. juni 2011 - 09:40 #22
Svar
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