Avatar billede fialdo Nybegynder
03. november 2002 - 16:40 Der er 9 kommentarer og
1 løsning

Gæstebog

Hej,

Jeg har hentet den gæstebog der ligger på
http://www.webcafe.dk/artikler/php/phpmysqlgaestebog/
Og det virker også fint nok, men der er lige et stykke af koden i filen gem.php som jeg ikke forstår.
Koden i gem.php ser således ud:
<?php

require("./gbog-ting/mysql-funktioner.php");
require("./gbog-ting/design-funktioner.php");
require("./gbog-ting/indstillinger.php");

/*
* Foerst napper vi variablerne fra miljoet.
*/

if(is_array($HTTP_POST_VARS)) {
  $navn = $HTTP_POST_VARS['navn'];
  $epost = $HTTP_POST_VARS['epost'];
  $besked = $HTTP_POST_VARS['besked'];
} elseif (is_array($_POST)) {
  $navn = $_POST['navn'];
  $epost = $_POST['epost'];
  $besked = $_POST['epost'];
}


/*
* Her er en simpel funktion der spytter en fejlmelding ud.
* Den bruger vi senere, når vi checker, at folk har skrevet noget i formularen.
*/

function gbog_fejl($fejl) {

    $generel_tekst = "<p>V&aelig;r venlig at g&aring; tilbage og ret til.</p>";

    $fejlmelding = "<ul>";

    for($i=0;$i<count($fejl);$i++) {
        $fejlmelding .= "<li>". $fejl[$i];
    }

    $fejlmelding .= "</ul>";

    echo top("Fejl") . "G&aelig;stebogen brokkede sig lidt over dit input:" . $fejlmelding . $generel_tekst . bund();
    exit;

}

/*
* Denne funktion skriver i gæstebogen - altså i databasen.
* Bemærk, at vi ikke bruger PHP til at indsætte tiden, men
* bruger MySQLs indbyggede funktion now().
*/

function skriv_i_gbog($navn, $epost, $besked) {
   
    $ip = getenv('REMOTE_ADDR');

    $sql = "insert into gaestebog(navn,epost,besked,ip,tid)
        values('$navn','$epost','$besked','$ip',now())";

    aabn_forbindelse_og_vaelgdb();
    sql_spoerg($sql);
    luk_forbindelse();

}

/*
* Vi laver lidt simpelt fejlcheckeri og ser, om der overhovedet
* er skrevet noget. Hvis ikke, bruger vi fejlfunktionen til at brokke os.
* Fejlfunktionen slutter med "exit", der sørger for, at PHP stopper.
*/

if(!ereg("[A-z0-9]+", $navn)) {

    $fejl[] = "Du har ikke skrevet dit navn";

}

if(!ereg("[A-z0-9]+", $besked)) {

    $fejl[] = "Du har ikke skrevet nogen besked";

}

if(count($fejl) > 0) {
    gbog_fejl($fejl);
}

/*
* Hvis vi er nået hertil, så står der i det mindste et eller andet i felterne og vi
* knalder det i databasen med funktionen skriv_i_gbog().
* Vi escaper alle fyfy-tegn med addslashes(). Når vi senere præsenterer indholdet
* af gBogen bruger vi stripslashes() til at "afkode".
*
* Alt dette besvær er til for at folk ikke skal snige ondsindede SQL-kommandoer
* ind i deres indlæg. Nyere versioner af PHP gør alt dette automatisk,
* men vi kan godt li' at være på den sikre side.
*/

skriv_i_gbog(addslashes($navn),addslashes($epost),addslashes($besked));

/*
* Så er skidtet banket i databasen og vi sender folk videre til selve gBogen
* hvor de kan se deres eget indlæg.
*/

header("Location: gbog.php");

/*
* Skal der sendes epost til administratoren?
*
* Bemærk, at vi godt kan gøre dette selv om folk er sendt videre til gBogen.
* Der er ingen grund til at gæsterne skal vente på, at der bliver sendt
* post - derfor kommer det først allersidst.
*/

if($epost_p == "t") {

  $ip = getenv('REMOTE_ADDR');
  $epostens_indhold = "$navn har skrevet denne besked fra IP-adressen $REMOTE_ADDR:\n-----------------------------------------------------\n\n$besked";

  mail($admin_epost, "Der er skrevet i din gBog!", $epostens_indhold);

}

?>

Det jeg ikke forstår er følgende:

if(is_array($HTTP_POST_VARS)) {
  $navn = $HTTP_POST_VARS['navn'];
  $epost = $HTTP_POST_VARS['epost'];
  $besked = $HTTP_POST_VARS['besked'];
} elseif (is_array($_POST)) {
  $navn = $_POST['navn'];
  $epost = $_POST['epost'];
  $besked = $_POST['epost'];
}

Er der ikke en hjælpsom person som vil ”oversætte” det?
Gerne sådan så jeg forstår det, - ikke bare at den henter nogle variabler.
Altså, hvorfor er det sat ind i en if-sætning, og hvad betyder $HTTP_POST_VARS og $_POST?

På forhånd tak.
Avatar billede phpgris Nybegynder
03. november 2002 - 16:57 #1
De to arrays $HTTP_POST_VARS og $_POST indeholder de værdier der er sendt til scriptet fra en HTML form. Det if-sætningen så checker er hvilket af de to arrays værdierne ligger i. Er $HTTP_POST_VARS initialiseret henter den værdierne derfra over i de tilsvarende varibler, hvis ikke henter den dem fra $_POST.

Linjen $besked = $_POST['epost']; ser godt nok lidt besynderlig ud. Mon ikke det skulle være $besked = $_POST['besked']; ?
Avatar billede fialdo Nybegynder
03. november 2002 - 17:22 #2
Okay, men hvorfor har man så brug for at der er to arrays, hvorfor nøjes man ikke bare med at bruge ét?
Hvornår bruger man fx. $HTTP_POST_VARS istedet for $_POST?
Avatar billede tipsen Nybegynder
03. november 2002 - 17:48 #3
Sjovt ereg-check:

Prøv at skrive "æøå" i beskeden...
Avatar billede fialdo Nybegynder
03. november 2002 - 17:51 #4
Tipsen: Det kan man ikke.
Avatar billede tipsen Nybegynder
03. november 2002 - 18:00 #5
præcis - men abc er fint nok... :-/
Avatar billede tipsen Nybegynder
03. november 2002 - 18:05 #6
Vil umiddelbart mene, at:

if(!ereg("[A-z0-9]+", $navn)) {

bør skiftes ud med:

if(strlen($navn) == 0) {

og tilsvarende for $besked, da det ifølge kommentarerne er hvad man ønsker at checke! Så længe det ikke er mere avanceret, er det håbløst overkill (og mere tidskrævende) at benytte regulære expressions!
Avatar billede phpgris Nybegynder
03. november 2002 - 18:14 #7
Man bruger $HTTP_POST_VARS i stedet for den mere korrekte $_POST i ældre versioner af PHP. Nyere versioner understøtter stadig $HTTP_POST_VARS men den er "deprecated" og der er en god chance for at den ryger helt ud på et tidspunkt. Derfor if-sætningen; hvis PHP engang i fremtiden ikke ligger form værdierne i $HTTP_POST_VARS regner scriptet altså med at kunne finde dem i $_POST i stedet for.
Avatar billede fialdo Nybegynder
03. november 2002 - 18:15 #8
Tipsen: Tusind tak for tipet.
Kan du svare på mit spørgsmål om, hvorfor man har brug for de to arrays, $HTTP_POST_VARS og $_POST?
Avatar billede fialdo Nybegynder
03. november 2002 - 18:16 #9
Okay,tusind tak Phpgris.
Avatar billede tipsen Nybegynder
03. november 2002 - 18:27 #10
Sandsynligvis kan man bare bruge $_POST og slette if-betingelserne... - de er næsten sikkert overflødige...
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

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