Webprofis is een Forum waarin je vragen kunt stellen die webgerelateerd zijn. Heb je vragen over of problemen met je Webpagina, HTML, CSS, Javascript, PHP of andere client of serverside scriptingtalen? Stel ze dan gerust op dit forum. Op dit forum zijn een aantal vrijwilligers actief die u graag met uw vragen willen helpen en u waar mogelijk een passend antwoord aanbieden. Hebt u zelf veel ervaring en kennis met betrekking tot het bovenstaande? U bent van harte welkom om uw kennis met anderen te delen!

We hopen dat eenieder op dit Forum een leerzame ervaring mag opdoen.

Team Webprofis

gastenboek maken in php mbv database

2»

Reacties

  • en dan nu stap2 :p

    stel ik ben aan het spammen in je gastenboek, je kunt moeilijk van de noob die dit gb gebruikt verlangen dat hij pma gaat uitpluizen ;-)
  • PMPosts: 879
    yep, ik had ook al wat vervolgstappen in gedachten; het was heel leuk als er een admin console bij zit.. #:-S
  • ik wil wel helpen hoor, moet je alleen even zeggen hoe jij het voor je ziet (voor mezelf weet ik het wel :p )
  • PMPosts: 879
    Ik zal ff globaal brainstormen hoe ik denk dat het zou moeten, want heb dit ook nog nooit gedaan:
    1. Admin wordt afgeschermd met een login natuurlijk
    2. Admin krijgt dezelfde output voor de neus als anderen alleen met delete optie (unlink zit ik aan te denken, of drop from table guestbook where id =....blablabla...)
    3. Moet Admin ook kunnen editten? Geen idee hoe dat zou moeten
    4. Admin moet een ban op basis van IP kunnen instellen; geen idee hoe dat moet
  • bewerkt ma 6 apr 2015
    PMPosts: 415
    zelf doe ik altijd alle admin functies op ????n pagina, adhv de 'action' weet je script wat het moet gaan doen.
    De admin pagina beveilig je inderdaad met een sessie/inlog, zodat nienand er aan kan behalve jij.

    De login kun je al wel?

    De admin (minus login), de code is niet getest, het is gewoon losse pols werk, dus typo's en foutmeldingen even wegdenken.

    <?php
    //delete
    if(isset($_GET['action']) && action == 'delete')
    {
    if(isset($_GET['id']))
    {
    mysqli_query("delete from guestbook where id = ".mysqli_real_escape_string($_GET['id']);

    /*
    redirect terug naar het gastenboek (als je al met pagination werkt, kun je de pagina nr meegeven in de url en terug naar de juiste pagina redirecten)
    de url is dan bv zo: action=delete&id=xx&page=x
    */

    header('location: lees.php?page='.$_GET['page']);
    exit;
    }
    else
    {
    //wtf doe je hier? :p
    }
    }

    //edit
    if(isset($_GET['action']) && action == 'edit')
    {
    if(isset($_GET['id']))
    {
    $qry = mysqli_query("select * from guestbook where id = ".mysqli_real_escape_string($_GET['id']);
    while($res = mysqli_fetch_assoc($qry)) {
    ?>
    <form>
    <input type="text" name="name" value="<?php echo stripslashes($res['name'])?>" />
    <input type="text" name="email" value="<?php echo stripslashes($res['email'])?>" />
    <textarea name="message"><?php echo stripslashes($res['message'])?></textarea>
    <input type="submit" name="edit" value="opslaan" />
    </form>
    <?php
    }
    if(isset($_POST[edit]))
    {
    mysqli_query(
    "update guestbook set
    name='".mysqli_real_escape_string($_POST['name'])."',
    email='".mysqli_real_escape_string($_POST['email'])."',
    message ='".mysqli_real_escape_string($_POST['message'])."'
    where id = ".mysqli_real_escape_string($_GET['id'])
    )
    header('location: lees.php?page='.$_GET['page']);
    exit;
    }
    }
    else
    {
    //wtf doe je hier? :p
    }
    }

    Het bannen is vrij makkelijk, je moet dan natuurlijk ook de ip adressen opslaan, $_SERVER['REMOTE_ADDR']
    Dan maak je een nieuwe tabel aan waarin je de verbannen ip's opslaat.
    Bovenin de pagina kijk je gewoon of het ip voorkomt in die db.
    Zo ja, dan geen formulier tonen om een nieuwe post te kunnen plaatsen

    In de while loop van je gastenboek laat je linkjes genereren in deze strekking:
    admin.php?action=ban&ip=<?php echo $row['ip'] ?>
    in de admin

    if(isset($_GET['action']) && action == 'ban')
    {
    mysqli_query("insert into banned (ip) values('".$_GET['ip']."')");
    //redirect terug
    }

    En bovenin de pag met het form:

    $bancheck = mysqli_query("select ip from banned where ip = '".$_SERVER['REMOTE_ADDR']."'");
    if(mysqli_num_rows($bancheck) > 0)
    {
    //ga weg!
    }
    else
    {
    //form gedoe
    }
  • PMPosts: 879
    Wow, Dit moet ik eens even gaan besturderen...
  • Als iets niet duidelijk is, moet je het gewoon even laten weten :)
  • bewerkt di 7 apr 2015
    PMPosts: 879
    ik heb nu dit: admin.php

    <?php
    // hier moet nog de login komen

    // connectiegegevens ophalen
    include ('connection.php');

    include ('gastenboek.php');

    //delete
    if(isset($_GET['action']) && action == 'delete')
    {
    if(isset($_GET['id']))
    {
    mysqli_query("DELETE FROM guestbook WHERE id = ".mysqli_real_escape_string($_GET['id']));


    /*
    redirect terug naar het gastenboek (als je al met pagination werkt, kun je de pagina nr meegeven in de url en terug naar de juiste pagina redirecten)
    de url is dan bv zo: action=delete&id=xx&page=x
    */


    header('Location: lees.php?page='.$_GET['page']);
    exit;
    }
    else
    {
    //wtf doe je hier?
    }
    }

    //edit
    if(isset($_GET['action']) && action == 'edit')
    {
    if(isset($_GET['id']))
    {
    $results = mysqli_query($conDB,"SELECT * FROM guestbook WHERE id = ".mysqli_real_escape_string($_GET['id']));
    while($row = mysqli_fetch_assoc($results)) {
    ?>
    <form>
    <input type="text" name="name" value="<?php echo stripslashes($row['name'])?>" />
    <input type="text" name="email" value="<?php echo stripslashes($row['email'])?>" />
    <textarea name="message"><?php echo stripslashes($row['message'])?></textarea>
    <input type="submit" name="edit" value="opslaan" />
    </form>
    <?php
    }
    if(isset($_POST[edit]))
    {
    mysqli_query(
    "update guestbook set
    name='".mysqli_real_escape_string($_POST['name'])."',
    email='".mysqli_real_escape_string($_POST['email'])."',
    message ='".mysqli_real_escape_string($_POST['message'])."'
    where id = ".mysqli_real_escape_string($_GET['id'])
    );
    header('Location: lees.php?page='.$_GET['page']);
    exit;
    }
    }
    else
    {
    //wtf doe je hier?
    }
    }
    ?>

    Hoe krijg ik nu get gastenboek voor mijn neus met daarin per comment een (laten we zeggen een simpel kruisje x) en met als actie wanneer ik op dat kruis klik dat het record met dat specifieke id gedelete wordt
  • Je moet gastenboek niet includen in admin, in admin moet alleen de login, de connect, en verder de code die ik je min of meer gaf.

    In gastenboek.php start je een session.

    dan in de while krijg je zoiets:


    while($row = mysqli_fetch_array($result))
    {
    if(isset($_SESSION['admin']))
    {
    ?>
    <a href="admin.php?action="delete&id=<?php echo $row['id'];?>">delete</a> | <a href="admin.php?action="edit&id=<?php echo $row['id'];?>">edit</a> <!-- etc-->
    <?php
    }
    ?>

    <div class="velden"> <!-- voor styling van alle echo's; zie CSS -->
    <div class="header">
    <div class="naam"><?php echo htmlspecialchars($row['name'], ENT_QUOTES, UTF-8, true); ?></div> <!-- echo naam-->
    <div class="email"><?php echo htmlspecialchars($row['email'], ENT_QUOTES, UTF-8, true); ?></div> <!-- echo email-->
    <div class="tijd"><?php echo $row['datetime']; ?></div> <!-- echo datum en tijd-->

    </div>

    <div class="bericht"><?php echo htmlspecialchars($row['message'], ENT_QUOTES, UTF-8, true); ?></div> <!-- echo bericht-->

    </div>
    <?php } ?>
  • bewerkt do 21 mei 2015
    PMPosts: 1
    Beste,

    Op zich leuk gastenboek,
    Ik zie dat er intussen een en ander aan code veranderd is, kan ik ergens de actuele code vinden?

    Misschien nog leuk een mailtje naar de admin als er een bericht is geplaatst

    Verder krijg ik nogal wat meldingen als

    Use of undefined constant UTF - assumed 'UTF' in /home/ en
    htmlspecialchars(): charset `-8' not supported, assuming
  • bewerkt do 21 mei 2015
    PMPosts: 879
    Projectje is nog niet af, althans er moet nog een beheerconsole geplaatst worden zodat de admin van het gastenboek makkelijk entries kan verwijderen of editten. De DESC functie is pas later toegevoegd toen er al berichten in het gastenboek stonden. Die zijn nu verwijderd. Alle nieuwe berichten komen nu bovenaan.
    Maar projectje is dus nog niet helemaal af
    http://webprofis.nl/demo/vd/1/php-scripten/gastenboek/index.html
  • ah, foutje, quotes vergeten.

    Zo moet het zijjn:

    htmlspecialchars($iets, ENT_QUOTES, 'UTF-8', true) //quotes rond de string die de charset bepaald
    nuet
  • bewerkt vr 22 mei 2015
    PMPosts: 879
    Meest actuele code:
    index.html

    <div class="wrapper">

    <a class="button" href="gastenboek.php">Bekijk Gastenboek</a>

    <h2>Schrijf in Gastenboek</h2>
    <form name="guest" method="post" action="verwerk.php">
    Naam: <br />
    <input pattern=".{2,25}" type="text" name="name" placeholder="Uw Naam" required /><br /><br />
    Email: <br />
    <input type="email" name="email" placeholder="Uw Email" required /><br /><br />
    Bericht: <br /><textarea name="message" rows="10" cols="50" placeholder="Uw Bericht" required></textarea> <br /><br />
    <input type="checkbox" name="verplicht" required>Ik ben geen robot</input><br /><br />
    <button class="button" name="submit" type="submit">Plaats bericht</button>

    </form>

    </div>

    verwerk.php

    include ('connection.php');

    if (mysqli_connect_errno($conDB))
    {
    echo "<h1>Connectie Database mislukt: " . mysqli_connect_error() ."</h1>";
    }
    // uitlzen inputvelden en toekennen aan variabelen
    $name = mysqli_real_escape_string($conDB, $_POST['name']);
    $email = mysqli_real_escape_string($conDB, $_POST['email']);
    $message = mysqli_real_escape_string($conDB, $_POST['message']);

    date_default_timezone_set('Europe/Amsterdam');
    $datetime=date("d-m-y \o\m\ H:i:s"); //datum en tijd met "om" ertussen

    $sql="INSERT INTO guestbook(name,email,message,datetime) VALUES('$name','$email','$message','$datetime')"; // data in de database zetten
    if (!mysqli_query($conDB,$sql))
    {
    die('Fout: ' . mysqli_error($conDB)); // evt fout met error vermelden
    }
    else {
    mysqli_close($conDB);
    header('Location: gastenboek.php'); //gelijk doorsturen naar gastenboek
    }
    connection.php

    $db_username = 'xxxx'; // Your MYSQL Username.
    $db_password = 'xxxx'; // Your MYSQL Password.
    $db_name = 'guestbook'; // Your Database name.
    $db_host = 'localhost';

    $conDB = mysqli_connect($db_host, $db_username, $db_password,$db_name)or die('Error: Could not connect to database.');
    gastenboek.php

    <link rel="stylesheet" type="text/css" href="gastenboek.css" media="all" />

    <?php
    include_once('connection.php');
    include_once('functions.php');


    $page = (int)(!isset($_GET["page"]) ? 1 : $_GET["page"]);

    if ($page <= 0) $page = 1;

    $per_page = 5; // hoeveel records tonen per pagina

    $startpoint = ($page * $per_page) - $per_page;

    $statement = "guestbook ORDER BY datetime DESC"; // records sorteren; laatst toegevoegde eerst tonen DESC

    $results = mysqli_query($conDB,"SELECT * FROM {$statement} LIMIT {$startpoint} , {$per_page}");

    if (mysqli_num_rows($results) != 0) { // als DB niet leeg is

    ?>
    <div class="wrapper">
    <div class="nieuw-bericht">
    <a class="button" href="index.html">Plaats Nieuw Bericht</a> <!-- Nieuw bericht plaatsen -->
    </div>
    <?php


    // output van de records
    while ($row = mysqli_fetch_array($results))
    { ?>



    <div class="velden"> <!-- voor styling van alle echo's; zie CSS -->
    <div class="header">
    <div class="id"><?php echo htmlspecialchars($row['id'], ENT_QUOTES, 'UTF-8', true); ?></div> <!-- echo ID-->
    <div class="naam"><?php echo htmlspecialchars($row['name'], ENT_QUOTES, 'UTF-8', true); ?></div> <!-- echo naam-->
    <div class="email"><?php echo htmlspecialchars($row['email'], ENT_QUOTES, 'UTF-8', true); ?></div> <!-- echo email-->
    <div class="tijd"><?php echo $row['datetime']; ?></div> <!-- echo datum en tijd-->

    </div>

    <div class="bericht"><?php echo htmlspecialchars($row['message'], ENT_QUOTES, UTF-8, true); ?></div> <!-- echo bericht-->

    </div> <!-- end velden -->

    <?php } ?>


    <br /><br />
    <?php echo pagination($conDB,$statement,$per_page,$page,$url='?'); ?>
    </div> <!-- end wrapper -->


    <?php } else { // DB is dus nog leeg

    if (isset($_GET['page'])) {
    header('Deze pagina bestaat niet', true, 404);
    include('404.php');
    die();
    }
    else {
    echo "Schrijf als eerste in het Gastenboek";
    }

    }

    ?>

    functions.php (pagination)

    function pagination($conDB,$query,$per_page=10,$page=1,$url='?'){
    //global $conDB;
    //var_dump(func_get_args());
    $query = "SELECT COUNT(id) as num FROM {$query}";
    //$query = "SELECT COUNT(*) as num FROM" . $query;
    $row = mysqli_fetch_array(mysqli_query($conDB,$query));
    $total = $row['num'];
    $adjacents = "2";

    $prevlabel = "&lsaquo;";
    $nextlabel = "&rsaquo;";
    $lastlabel = "&rsaquo;&rsaquo;";

    $page = ($page == 0 ? 1 : $page);
    $start = ($page - 1) * $per_page;

    $prev = $page - 1;
    $next = $page + 1;

    $lastpage = ceil($total/$per_page);

    $lpm1 = $lastpage - 1; // //laatste pagina -1

    $pagination = "";
    if($lastpage > 1){
    $pagination .= "<ul class='pagination'>";
    $pagination .= "<li class='page_info'>Pagina {$page} van {$lastpage}</li><br /><br />";

    if ($page > 1) $pagination.= "<li><a href='{$url}page={$prev}'>{$prevlabel}</a></li>";

    if ($lastpage < 1 + ($adjacents * 2)){ // 7
    for ($counter = 1; $counter <= $lastpage; $counter++){
    if ($counter == $page)
    $pagination.= "<li><a class='current'>{$counter}</a></li>";
    else
    $pagination.= "<li><a href='{$url}page={$counter}'>{$counter}</a></li>";
    }

    } elseif($lastpage > 1 + ($adjacents * 2)){ // 5

    if($page < 1 + ($adjacents * 2)) {

    for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++){
    if ($counter == $page)
    $pagination.= "<li><a class='current'>{$counter}</a></li>";
    else
    $pagination.= "<li><a href='{$url}page={$counter}'>{$counter}</a></li>";
    }
    $pagination.= "<li class='dot'>...</li>";
    $pagination.= "<li><a href='{$url}page={$lpm1}'>{$lpm1}</a></li>";
    $pagination.= "<li><a href='{$url}page={$lastpage}'>{$lastpage}</a></li>";

    } elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) {

    $pagination.= "<li><a href='{$url}page=1'>1</a></li>";
    $pagination.= "<li><a href='{$url}page=2'>2</a></li>";
    $pagination.= "<li class='dot'>...</li>";
    for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) {
    if ($counter == $page)
    $pagination.= "<li><a class='current'>{$counter}</a></li>";
    else
    $pagination.= "<li><a href='{$url}page={$counter}'>{$counter}</a></li>";
    }
    $pagination.= "<li class='dot'>..</li>";
    $pagination.= "<li><a href='{$url}page={$lpm1}'>{$lpm1}</a></li>";
    $pagination.= "<li><a href='{$url}page={$lastpage}'>{$lastpage}</a></li>";

    } else {

    $pagination.= "<li><a href='{$url}page=1'>1</a></li>";
    $pagination.= "<li><a href='{$url}page=2'>2</a></li>";
    $pagination.= "<li class='dot'>..</li>";
    for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++) {
    if ($counter == $page)
    $pagination.= "<li><a class='current'>{$counter}</a></li>";
    else
    $pagination.= "<li><a href='{$url}page={$counter}'>{$counter}</a></li>";
    }
    }
    }

    if ($page < $counter - 1) {
    $pagination.= "<li><a href='{$url}page={$next}'>{$nextlabel}</a></li>";
    $pagination.= "<li><a href='{$url}page=$lastpage'>{$lastlabel}</a></li>";
    }

    $pagination.= "</ul>";
    }

    return $pagination;
    }
    404.php

    echo "Schrijf als eerste in het gastenboek!";
    gastenboek.css

    input, textarea {
    border: 1px solid #cccccc;
    }


    a.button, button[type=submit] {
    background-color: #428bca;
    padding: 10px;
    color: #f6f6f6;
    border-radius: 2px;
    text-decoration: none;
    cursor: pointer;
    border: none;
    font-size: 16px;
    }
    .wrapper {
    margin: 20px auto;
    width: 600px;
    height: auto;
    }
    .velden {
    width: 600px;
    height: auto;
    border: 1px solid #ccc;
    border-radius: 2px;
    background-color: #f6f6f6;
    margin-bottom: 10px;
    }
    .header {

    min-height: 30px;
    height: auto;
    background-color: #e5e5e5;
    border-bottom: 1px solid #ccc;
    }

    .id{
    height: auto;
    padding: 5px;
    font-size: 16px;
    float: left;
    font-weight: bold;
    word-wrap: break-word;
    }
    .naam {
    height: auto;
    padding: 5px;
    font-size: 16px;
    float: left;
    font-weight: bold;
    word-wrap: break-word;
    }
    .email {
    height: auto;
    padding: 5px 20px 5px 10px;
    float: left;
    word-wrap: break-word;
    }
    .tijd {
    height: auto;
    padding: 5px 20px 5px 0;
    float: right;

    }

    .bericht {
    clear: both;
    padding: 10px 5px 10px 5px;
    word-wrap: break-word;
    }
    a.button {
    background-color: #428bca;
    padding: 10px;
    color: #f6f6f6;
    border-radius: 2px;
    text-decoration: none;
    cursor: pointer;

    }
    .nieuw-bericht {
    margin: 20px 0 20px 0;
    }

    /* navigatie pagination */
    ul.pagination {
    text-align:center;
    color:#333333;
    }
    ul.pagination li {
    display:inline;
    padding:0 3px;
    }
    ul.pagination a {
    color:#333333;
    display:inline-block;
    padding:5px 10px;
    border:1px solid #ccc;
    text-decoration:none;
    }
    ul.pagination a:hover,
    ul.pagination a.current {
    background:#428bca;
    color:#fff;
    }

    sql

    CREATE TABLE guestbook(
    id INT(5) NOT NULL AUTO_INCREMENT,
    name VARCHAR(60) NOT NULL DEFAULT ' ',
    email VARCHAR(60) NOT NULL DEFAULT ' ',
    datetime VARCHAR(60) NOT NULL DEFAULT '',
    message text NOT NULL,

    PRIMARY KEY(id)
    );


  • Super uitleg.
    echter na het plaatsen van meerdere berichten heb je totaal geen overzicht meer.
    alle berichten staan op elkaar.
    is er een manier dit te onderscheiden in kaders?
Login of Registreer om te reageren.