Gå til innhold

Anbefalte innlegg

Spørsmålet er da "Hvordan lager man en gjestebok for MySQL?"

 

Først, hva er MySQL's fordeler og ulemper i forhold til flatfiler? Det har ikke jeg noe spesifik info om eneste jeg vet er at flatfiler er tregere å lese, vanskeligere å slette speifik inlegg og ikke lett å redigere. Man kan også lettere lage side system som maks 5 per side og sånt. MySQL er kjapt, lett å redigere, lett å slette, lett å sortere og oversiktlig!

 

Først må vi sette opp en tabell i databasen, den må inholde det som er standar, dette er IP, NAVN, EPOST, HJEMMESIDE, TIDEN, MELDING og seff Identifikasjons nummer (ID)

 

Den vil da se noe som dette ut (trur den er rett skrevet ?!?):

CREATE TABLE `my_guestbook` (
`id` INT( 20 ) NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 255 ) NOT NULL ,
`email` VARCHAR( 255 ) NOT NULL ,
`homepage` VARCHAR( 255 ) NOT NULL ,
`message` TEXT NOT NULL ,
`time` INT( 20 ) NOT NULL ,
PRIMARY KEY ( `id` )
);

 

Så må vi begynne med formen for å sette inn ett inlegg. Jeg skal ikke forklare så mye siden dem som driver med php burde ha standar HTML kunnskaper først!

<form method="post" action="">
Navn: <input type="text" name="gb_name"><br />
E-Post: <input type="text" name="gb_mail"><br />
Webside: <input type="text" name="gb_web"><br />
Melding: <textarea name="gb_message"></textarea><br />
<input type="submit" name="gb_insert" value="Skriv inn!"><br /><br/><hr />

 

Så skal vi ha litt php kode for å sette den inn når dem trykker på knappen. Denne koden skal helst øverst i dokumentet.

 

<?php
 mysql_connect("host", "user", "pass");
 mysql_select_db("database");
 if(isset($_POST['gb_insert'])) {
   # knappen gb_insert er trykket ned!
   # Da kan vi hente resten:
$name = mysql_real_escape_string(strip_tags($_POST['gb_name']));
$web = mysql_real_escape_string(strip_tags($_POST['gb_web']));
$mail = mysql_real_escape_string(strip_tags($_POST['gb_mail']));
$message = mysql_real_escape_string(strip_tags($_POST['gb_message']));
# Så henter vi unix timestamp og bruker i databasen nå
$time = time();
# Så må vi sjekke om alle inholder noe:
if(!empty($name) && !empty($web) && !empty($mail) && !empty($message)) {
  # Om ingen er tomme kommer vi hit og da skal vi sette inn
  # Første er da å bygge spørringa:
  $sql = "INSERT INTO my_guestbook(`name`, `email`, `homepage`, `message`, `time`)
          VALUES('$name', '$mail', '$web', '$message', '$time')";

  # Så får vi sende det inn..
  if(mysql_query($sql)) {
    # Det ble nå postet!
    echo "Ditt inlegg er postet";
  }
  else {
    # Det oppsto en feil, la oss echoe den og si ifra!
 echo "Det oppsto en feil, denne var: ".mysql_error();
  }
}
else {
  # Noen felt var tomme da kan vi klage!;)
  echo "Du må fylle ut alle feltene!";
}
 }
?>

 

Denne lander over HTML formen. Det den gjør er å sette inn inlegga. Nå skal vi vise alt her..

 

<?php
 # Her skal alle inlegga vises
 # Først bygger vi en spørring som henter alle
 $sql = "SELECT name, email, homepage, message, time, id FROM my_guestbook ORDER BY time DESC";
 # Der henter vi alle felta fra gjestboken i kronologisk rekkefølge.
 $ans = mysql_query($sql);
 # Der har vi henta spørringa, nå skal vi se hvor mange inlegg det er:
 $numRecords = mysql_num_rows($ans);
 # Så skal vi echoe alle inlegga. Da må vi ha en while som henter ut ett
 # Assoc array for oss.
 while($arr = mysql_fetch_assoc($ans)) {
   # Da inholder arr hele tiden en rad til den ikke går mer.
$name = $arr['name'];
$mail = $arr['email'];
$web  = $arr['homepage'];
$msg  = $arr['message'];
$time = $arr['time'];
$id   = $arr['id'];
# Det over gjorde jeg bare for å korte ned variablene og da må vi vise inlegget
# Først må jge formatere tiden.
$time_formatted = date("d.m.Y - H:i:", $time);
# Datoformatet over må dere les om på: http://www.php.net/date
echo "Skrevet av: $name - Tid: $time_formatted<br />";
echo "Epost: $mail<br />";
echo "Web: $web<br />";
echo "Melding: $msg<br /><hr />";
# Nå er inlegget printet og så skal whilen gå til neste..
 }
?>

 

Mvh Thorleif Jacobsen

 

Se dette live?

PHP Fil: my_guestbook_preview.php

Sourcen: my_guestbook_preview.php

Endret av ziller
Lenke til kommentar
Videoannonse
Annonse

Ser fint ut det :) som alltid noe jeg ville ha forandret på ( alle har vel sin måte å programmere på så vi blir vel aldri helt fornøyd : ) ), men en fin ting å bygge ut fra.

 

En ting jeg synes av litt rart, hvorfor definerte du ikke "time" i DB som en timestamp i stede for en varchar ?

 

EDIT: "i stede for en INT som det er nå"

Endret av trondes
Lenke til kommentar

timestamp i db er åååå-mm-dd hh:mm:ss og ikke et unix timestamp.

 

Det jeg stussa på er den manglende validering av input. Hvorfor tillates jeg å skrive javascript / html i beskjeden min? hvorfor brukes ikke en quote_smart() funksjon? om serveren som brukere av guiden har ikke har magic_quotes_gpc på er dette forøvrig et stort sikkerhets hull. Da brukeren har muligheten til å skrive hva de selv måtte ønske rett inn i spørringen din.

 

Her brukes verken striptags() eller mysql_real_escape_string(), ser ikke ut som om du har tenkt på det en gang.

Lenke til kommentar

ja. skal det. er noen tegn som ikke escapes, men tror neppe det er noen sikkerhets risiko..

 

alternativt er denne fin

 

function quote_smart($value)
{
  // Stripslashes
  if (get_magic_quotes_gpc()) {
      $value = stripslashes($value);
  }
  // Quote if not integer
  if (!is_numeric($value)) {
      $value = "'" . mysql_real_escape_string($value) . "'";
  }
  return $value;
}

 

brukes flott sånn

$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
          quote_smart($_POST['username']),
          quote_smart($_POST['password']));

 

legger også til enkle quotesa runt strenger i spørringen etc. så sparer du deg for noe tenking :p

Lenke til kommentar
ja. skal det. er noen tegn som ikke escapes, men tror neppe det er noen sikkerhets risiko..

 

alternativt er denne fin

 

function quote_smart($value)
{
  // Stripslashes
  if (get_magic_quotes_gpc()) {
      $value = stripslashes($value);
  }
  // Quote if not integer
  if (!is_numeric($value)) {
      $value = "'" . mysql_real_escape_string($value) . "'";
  }
  return $value;
}

 

brukes flott sånn

$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
          quote_smart($_POST['username']),
          quote_smart($_POST['password']));

 

legger også til enkle quotesa runt strenger i spørringen etc. så sparer du deg for noe tenking :p

5785452[/snapback]

 

ok. selv har jeg lage denne:

function add_slashes( $data){
if(is_array($data)){
 foreach($data as $key => $value){
 	if(is_array($value))
   $tilbake["$key"] = add_slashes($value);
 	else
   $tilbake["$key"] = addslashes($value);
 	}
 }
return $tilbake;
}

 

For å få addslashes på arrays...

 

da det er bare å å kjøre $query = mk_db_input( <tabel>, add_slashes(<array som skal inn>));

Lenke til kommentar

problemet ditt er er om magic_quotes_gpc er på gjør PHP dette for deg gjennom GET, POST, COOKIE automatisk og du trenger ikke addslashes() over hodet ;)

 

men om magic_quotes_gpc er av må dette gjøres...

 

kan eventuelt løses slik:

function add_slashes( $data){
if(!magic_quotes_gpc() XOR is_numeric($data)){
if(is_array($data)){
foreach($data as $key => $value){
 if(is_array($value))
  $tilbake["$key"] = add_slashes($value);
 else
  $tilbake["$key"] = addslashes($value);
 }
}
return $tilbake;
else return $data;
}

 

PS: Ingen vits i å quote forrige post... blir mindre skrolling om vi quoter minst mulig...

Endret av NH
Lenke til kommentar
problemet ditt er er om magic_quotes_gpc er på gjør PHP dette for deg gjennom GET, POST, COOKIE automatisk og du trenger ikke addslashes() over hodet ;)

 

men om magic_quotes_gpc er av må dette gjøres...

5785564[/snapback]

 

Smart :) tenke jeg ikke på ... lært noe i dag også ;)

 

( fy trond, skal skjerpe meg med quoteingen )

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...