Avatar billede bruger64 Nybegynder
25. august 2005 - 10:52 Der er 11 kommentarer og
1 løsning

adresse bog i php/my sql

jeg skal til at lave en lille hjemmeside til vores familie -vi skal have en enkel adressebog på siden - som alle selv kan skrive sig ind i - og efterfølgende rette/slette i. Har nogen en sådan eller et link til en - jeg har forsøgt via hjælp fra hjemmesiden webcafe at sætte en op - men er ikke så god til at forstå alle enkeltheder - på forhånd tak.
Avatar billede dmdisco Nybegynder
25. august 2005 - 10:55 #1
den du har prøvet at lave hvad får du af problemer med den da?
Avatar billede bruger64 Nybegynder
25. august 2005 - 11:01 #2
jeg har forsøgt fra bunden af at oprette database i mysql hos vore netudbyder, create table adressebog(

  id      integer not null primary key auto_increment,
  tid      datetime not null,
  ip      varchar(15) not null,
  navn    varchar(100) not null,
  adresse  text not null,
  telefon  varchar(32)  NOT NULL,
  email    varchar(100)
);

om ovenstående er rigtig ved jeg ikke helt

derudover forsøgt via webcafens tutorials at bygge forspørgsler etc. op - men kunne ikke få det til at køre så om fejlen ligger i tabellen eller i mine php/mysql koder ved jeg ikke.
Avatar billede dmdisco Nybegynder
25. august 2005 - 11:21 #3
hvordan ser dine forspørgsler ud? og fik du en fejl meddelse?
Avatar billede bruger64 Nybegynder
25. august 2005 - 11:44 #4
ja så får du det jeg har; men det ville måske være nemmere helt fra bunden??

Jeg startede med at klippe et script op jeg fandt til brug ved en gæstebog.
Først lavede jeg denne skriv.php:
<?php

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


echo top("Skriv jeres adresse i adressebogen");



?>


<form action="gem.php" method="post">
<table border="0" cellpadding="5" cellspacing="0">
<tr><td align="right"><strong>Navn:</strong></td><td><input type="text" name="navn" size="30" maxsize="100"></td></tr>
<tr>
  <td align="right"><strong>Adresse:</strong></td>
  <td><input type="text" name="adresse" size="30" maxsize="100"></td></tr>
    <td align="right"><strong>Telefon:</strong></td>
  <td><input type="text" name="telefon" size="30" maxsize="100"></td></tr>
      <td align="right"><strong>Email:</strong></td>
  <td><input type="text" name="email" size="30" maxsize="100"></td></tr>
<tr><td></td><td><input type="submit" value="Skriv!"></td></tr>
</table>
</form>


<?php

echo bund();

?>


denne sender til gem.php:
<?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'];
  $email = $HTTP_POST_VARS['email'];
  $adresse = $HTTP_POST_VARS['adresse'];
} elseif (is_array($_POST)) {
  $navn = $_POST['navn'];
  $email = $_POST['email'];
  $adresse = $_POST['email'];
}


/*
* 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") . "Adressebogen brokkede sig lidt over dit input:" . $fejlmelding . $generel_tekst . bund();
    exit;

}

/*
* Denne funktion skriver i adressebogen - 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, $adresse, $telefon, $email) {
   
    $ip = getenv('REMOTE_ADDR');

    $sql = "insert into adressebog(navn,adresse,telefon,email,ip,tid)
        values('$navn','$adresse','$telefon','$email','$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]+", $adresse)) {

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

}

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 adressebog!", $epostens_indhold);

}

?>
jeg henter adressebogen med gbog.php:
<?php

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

#
# Vi skal have fat i vores variabler, uanset hvilken version af PHP der bruges
#

if(is_array($HTTP_GET_VARS)) {
  $start_nr = $HTTP_GET_VARS['start_nr'];
} elseif (is_array($_GET)) {
  $start_nr = $_GET['start_nr'];
}

#
# Når folk kigger på gBogen første gang har de ikke noget $start_nr, så vi giver dem et nul,
# så de starter med det nyeste indlæg.
# Hvis en skuummel gæst selv prøver at sætte $start_nr kan den ende med at blive under nul,
# når man bruger navigationen. Hvis den er under nul laver vi den også om til nul, så
# mysql ikke begynder at brokke sig over ugyldigt input
#

if(!$start_nr || $start_nr < 0) {
  $start_nr = 0;
}

#
# Udskriver den første stump HTML
#

echo top("Adressebogen");
##JMC echo "<p>Et aktivt eksempel til en <a href=\"./\">artikel</a> p&aring; webcafe.dk</p>";

#
# Vi henter to ting ud af MySQL - først og fremmest alle de indlæg vi skal kigge på
# men også en hurtig optælling af, hvor mange indlæg der er ialt. Det sidste skal vi
# bruge når vi bygger "frem"- og "tilbage"-links.
#
# Der er ingen grund til at åbne databasen endnu - vi skal først lige have bygget
# de to forespørgsler.
#

$sql = "select id, navn, adresse, telefon, email, date_format(tid, '%e/%c %Y, %H:%i') as tiden, adresse from adressebog order by tid desc limit $start_nr, $antal_ad_gangen";
$taeller_sql = "select count(*) as antal from adressebog";

#
# Nu åbner vi databasen, hiver informationerne ud og lukker med det samme igen.
# Det er god skik at en forbindelse til database ikke er åben længere end højst nødvendigt.
#
# Abstraktionerne fra mysql-funktioner.php sørger for alt det grove arbejde og fejlhåndtering - dejligt.
#

aabn_forbindelse_og_vaelgdb();
$resultat = sql_spoerg_og_faa_svar($sql);
$optaelling = sql_spoerg_og_faa_svar($taeller_sql);
luk_forbindelse();

#
# Så går vi igang med at bygge navigationen
# Først bruger vi extract til at få $antal ud til behandling.
# Vi looper ikke igennem resultatet, da vi ved der kun er een række,
# så vi tilgår den direkte ved $optaelling[0].
#

extract($optaelling[0]);

#
# Skal der laves et links til flere indlæg?
#

if($antal > ($start_nr + $antal_ad_gangen)) {
   
    $naeste_start_nr = $start_nr + $antal_ad_gangen;
    $naeste_nav = "<a href=\"$PHP_SELF?start_nr=$naeste_start_nr\">N&aelig;ste</a>";

} else {

    $naeste_nav = "<span class=\"doedt-link\">N&aelig;ste</span>";

}

#
# Skal der laves link til forrige indlæg?
#

if($start_nr > 0 && ($start_nr - $antal_ad_gangen) < $antal) {

    $forrige_start_nr = $start_nr - $antal_ad_gangen;
    $forrige_nav = "<a href=\"$PHP_SELF?start_nr=$forrige_start_nr\">Forrige</a>";

} else {

    $forrige_nav = "<span class=\"doedt-link\">Forrige</span>";

}

#
# Her sætter vi det hele sammen i en tabel vi kan bruge til at sætte ind på siden.
#

$nav = "<table width=\"$tabel_bredde\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">
    <tr><td align=\"left\" width=\"33%\">$forrige_nav</td>
    <td align=\"center\" width=\"34%\"><a href=\"skriv.php\">Skriv</a></td>
    <td align=\"right\" align=\"33%\">$naeste_nav</td></tr>
    </table>";

#
# Og skriver tabellen ud med det samme:
#

echo "$nav <p />";

#
# Her begynder det egentlig interesante - vi looper os igennem de enkelte indlæg
# og skriver dem ud til skærmen.
#
# Hvis forespørgslen ikke har returneret nogle resultater, springer vi alt dette over.
#

if(count($resultat) < 1) {

  echo "Der er ingen adresser i Adressebogen";

} else {

  for($i=0;$i<count($resultat);$i++) {

    #
    # Med extract får vi smidt værdierne i variabler
    #
   
    extract($resultat[$i]);

    #
    # Vi brugte addslashes() da vi lagde tingene i databasen så for at få det til
    # at se læseligt ud, fjerne vi dem igen med stripslashes()
    #

    $besked = stripslashes($besked);
    $navn = stripslashes($navn);
    $epost = stripslashes($epost);

    #
    # Hvis der ikke må bruges HTML fjerner vi lige alle tags med htmlentities()
    #

    if($html_p != "t") {
        $navn = htmlentities($navn);
        $epost = htmlentities($epost);
        $besked = htmlentities($besked);
    }

    #
    # For at vi får linjeskift i HTML også, bruger vi nl2br til at skifte alle \n
    # ud med <br>

    $besked = nl2br($besked);

    #
    # Vi laver et simpelt check: Hvis eposten indeholder et snabel-a, så laver
    # vi det til en mailto:
    #
    # Dette er dog ingen garanti for, at eposten er gyldig.
    #

    if(ereg("@", $epost)) {
        $navn = "<a href=\"mailto:$epost\">$navn</a>";
    }

    #
    # Så er alt klart til browseren og vi spytter en tabel ud med denne besked.
    # Hvis du vil ændre markant i udseendet af din gæstebog, så er det
    # i blokken herunder det foregår. Du skal bare beholde de givne navne i
    # <input>-tagsene.
    #
    # Vi hopper lige ud af PHP-mode lidt, så vi er fri for at escape alle gåseøjnene.
    #

?>

    <table width="<?php echo $tabel_bredde; ?>" cellpadding="1" cellspacing="0" border="0">
        <tr><td class="gbog-baggrund" width="100%" align="center">

            <table border="0" cellpadding="8" cellspacing="0" width="100%">
                <tr><td class="gbog-top" width="100%">Skrevet af: <strong><?php echo $navn; ?></strong>, <?php echo $tiden; ?></td></tr>
            </table>

        </td></tr><tr><td class="gbog-baggrund" align="center" width="100%">

            <table border="0" cellpadding="8" cellspacing="0" width="100%">
                <tr><td class="gbog-bund" width="100%">
                <?php echo $besked; ?>
                <p align="right"><a class="slet" href="<?php echo "slet.php?id=$id&start_nr=$start_nr"; ?>">slet</a></p></td></tr>
            </table>

        </td></tr>
    </table><p />

<?php

  #
  # Vi hopper tilbage i PHP-mode.
  #
  # Her slutter loopet og PHP springer tilbage og går hele turen igennem med den næste
  # besked. Når der ikke er flere indlæg i denne omgang går PHP videre.
  #

  }

  #
  # Endelig skriver vi frem- og tilbage-links på i bunden af siden også.
  #

  echo $nav;

  #
  # Her slutter if-else-konstruktionen der fanger, om der er nogle indlæg overhovedet.
  #

}

#
# Og spytter den sidste stump HTML ud.
#

echo bund();

?>
og får denne meddelelse:
Adressebogen
Kunne ikke udføre: select id, navn, adresse, telefon, email, date_format(tid, '%e/%c %Y, %H:%i') as tiden, adresse from adressebog order by tid desc limit 0, 5
Fejlen er: Table 'sosimple_dk.adressebog' doesn't exist

så stod jeg af.

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

skulle være indstillet korrekt
Avatar billede bruger64 Nybegynder
25. august 2005 - 11:46 #5
"jeg henter adressebogen med gbog.php" skal med tiden hedde addressbog.php - bare lige til en orientering
Avatar billede dmdisco Nybegynder
25. august 2005 - 12:01 #6
har du oprettet tabellen som du skrev i starten?

og ja du har nok ret det er måske bedst at starte på en frisk ellers lærer du jo ikke hvordan det hele virker og får svært ved at lave det om senere eller tilføje nye funktioner
Avatar billede bruger64 Nybegynder
25. august 2005 - 12:13 #7
tabellen skulle være der ude - ja jeg må nok starte forfra
Avatar billede dmdisco Nybegynder
25. august 2005 - 12:17 #8
hmm hvis tabellen er der så prøv noget lidt mere simpelt til at starte med og byg ud derfra prøv det her til at indsætte:

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<form action="<?php echo $PHP_SELF;?>" method="post">
Navn<input type="text" name="navn"><br>
Adresse<input type="text" name="adresse"><br>
Telefon<input type="text" name="telefon"><br>
E-mail<input type="text" name="email"><br>
<input type="submit" name="submit" value="Opret">
</form>
<?php
// MySQL Variabler
$mysql_host = "localhost"; //her skriver du host til mysql.
$mysql_user = "bruger"; //skriv brugernavn til mysql, default root.
$mysql_pw = "kode"; //skriv dit password til mysql.
$mysql_db = "databasenavn"; //skriv databasen du vil bruge her.
$connection = mysql_connect ($mysql_host, $mysql_user, $mysql_pw) or die (mysql_error());
mysql_select_db ($mysql_db, $connection) or die (mysql_error());

if ($navn && $adresse && $telefon && $email) {
  $date = date();
  mysql_query("INSERT INTO adressebog (tid, ip, navn, adresse, telefon, email) VALUES ('$date','$_SERVER[REMOTE_ADDR]','$navn','$adresse','$telefon','$email')") or die(mysql_error());
  print "adressen er oprettet";
} elseif ($submit) {
  print "du skal udfylde alle felterne";
}
?>
</body>
</html>
Avatar billede bruger64 Nybegynder
25. august 2005 - 12:30 #9
jeg har nu ersattet dine koder med mine i skriv.php - rettet host etc. til - tjekket at adressebog findes, det gør den - men når jeg udfylder form i skriv.php og "udfør" sker der intet - alt det indtastede forsvinder?

her tabellen fra databasen:
#
# Struktur dump for tabellen `adressebog`
#

CREATE TABLE `adressebog` (
  `id` int(11) NOT NULL auto_increment,
  `tid` datetime NOT NULL default '0000-00-00 00:00:00',
  `ip` varchar(15) NOT NULL default '',
  `navn` varchar(100) NOT NULL default '',
  `adresse` text NOT NULL,
  `telefon` varchar(32) NOT NULL default '',
  `email` varchar(100) default NULL,
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;

#
# Data dump for tabellen `adressebog`
#
Avatar billede dmdisco Nybegynder
25. august 2005 - 13:43 #10
min fejl lav alle post variablerne om så de hedder $_POST[variabelnavn] istedet for $variabelnavn

men får du nogle fejl meddelser?
Avatar billede bruger64 Nybegynder
25. august 2005 - 14:07 #11
nej ingen fejl meldinger her..
Avatar billede bruger64 Nybegynder
27. august 2005 - 10:04 #12
lukker sp ->dmdisco 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