Hallo,

Ik heb een form. gemaakt die (nieuws) berichten naar de database stuurt.

Nu is mijn vraag hoe kan ik een nieuwsbericht bewerken met behulp van het bericht ID? Ik heb op verschillende forums gelezen dat ik dan moet werken met "get id" nog wat...

Wie kan mij helpen? Of een start maken?

<?php

$pagetitle = "Maak nieuw artikel";

include ("../config.php");


if($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST)) 
  { 
    $aFouten = array(); 
    if($_POST['title'] == '') 
      { 
        $aFouten[] = 'Je hebt geen titel ingevuld!'; 
      } 
    if($_POST['category'] == '') 
      { 
        $aFouten[] = 'Je hebt geen categorie gekozen!'; 
      } 
    if($_POST['story'] == '') 
      { 
        $aFouten[] = 'Je hebt geen bericht ingevuld'; 
      } 
       
        if(count($aFouten) != 0) 
          { 
            echo 'De volgende fouten zijn opgetreden: <br /><br />'; 
            for($Fi = 0; $Fi < count($aFouten); $Fi++) 
              { 
                echo $aFouten[$Fi].'<br />'; 
              } 
            echo '<br />Klik <a href="javascript:history.go(-1);">hier</a> om terug te keren'; 
          } 
        else 
          { 
          mysql_query("INSERT INTO cms_news (title,category,topstory,short_story,story,author,date) VALUES ('".addslashes($_POST['title'])."','".addslashes($_POST['category'])."','".addslashes($_POST['story'])."','".addslashes($_POST['author'])."','".$_POST['date']."')") or die (mysql_error()); 
           
          echo '<h2 class="title">Jou bericht is gepubliceerd!</h2>'; 
          } 
       
  } 
else 
  { 
?>
		
			
<h2 class="title">Schrijf een e-mail bericht</h2>
<form method="post" action="index.php?page=add-nieuws">
				<p><label for="titel">Titel:</label><br>

				<input type="text" name="title" onclick="this.value='';" onfocus="this.select()" onblur="this.value=!this.value?'Jou naam':this.value;" value="titel" /></p>

  
  <p><label for="author">Categorie:</label><br>

    <label>
      <input type="checkbox" name="category" value="Onderwijs" id="category_1">
      Onderwijs</label>
    <br>
    <label>
      <input type="checkbox" name="category" value="Nieuws" id="category_2">
      Nieuws</label>
    <br>
  </p>


<p><label for="bericht">Bericht:</label><br>
<textarea name="story" onclick="this.value='';" onfocus="this.select()" onblur="this.value=!this.value?'Typ hier jou bericht....':this.value;" class="your-message">Typ hier jou bericht...</textarea></p>
				
<p><label for="author">Schrijver:</label><br>
<input type="text" name="author" onclick="this.value='';" onfocus="this.select()" onblur="this.value=!this.value?'Onderwerp':this.value;" value="author" /></p>
      
<p><label for="date">Date:</label><br>
<input type="date" name="date" value="
" id="date"></p>
<input type="submit" value="Verstuur e-mail" class="send-message">
				
</form>
<?
}
?>
		</div>
			
			

addslashes($_POST['....']) is geen beveiliging.
Gebruik mysql_real_escape_string($_POST['....']).

Alle mysql_* functions zijn verouderd.
Stap over op mysqli_* of pdo().
Stel je hebt een pagina waar je alle titels van berichten toont met achter iedere titel een snelkoppeling:


<a href="edit.php?id=326">Bewerken</a>


Dan krijg je iets als dit in edit.php:
<?php

// checken of er een GET[id] variabele bestaat
if(!isset($_GET['id'])) {
echo 'geen id opgegeven.';
exit;
}

// checken of GET[id] een positief getal is groter dan nul
if(intval($_GET['id']) <= 0) {
echo 'Ongeldig id.';
exit;
}

// maak connectie met de database

// maak query
$query = "SELECT * FROM tablename WHERE id=" . intval($_GET['id']);

//query uitvoeren en inhoud op scherm tonen

?>

intval() beveiligt hier je query tegen sql injectie
De eerste stap... :)

Ik zou beginnen met het structureren van je PHP-code. Je hebt in principe de volgende acties:
- bericht(en) weergeven *
- nieuw bericht invoeren *
- nieuw bericht wegschrijven
- bestaand bericht wijzigen *
- wijzigingen bestaand bericht wegschrijven
- bericht verwijderen

De acties met een * betreffen acties waarbij je het e.e.a. weergeeft op je scherm. Hierbij is het zaak dat je output zet in een volledig (en kloppend) HTML document.

Als je in eerste instantie een simpel standalone script wilt maken (nog even zonder authenticatie van gebruikers), dan kun je overwegen om hiervoor de object georienteerde aanpak te kiezen en een class opstellen, waarbij je van de acties methoden maakt met het vaste voorvoegsel "action":

<?php
class MyNews
{
    public function __construct() {
    }

    // voor het weergeven van een of meer berichten
    protected function actionDefault() {
    }

    // voor het weergeven van een formulier voor het toevoegen van een nieuwsbericht
    protected function actionAddNews() {
    }

    // voor het verwerken van het toevoegen van een nieuwsbericht
    protected function actionAddNewsProcess() {
    }

    // voor het wijzigen van een bestaand nieuwsbericht
    protected function actionEditNews() {
    }

    // voor het verwerken van het wijzigen van een nieuwsbericht
    protected function actionEditNewsProcess() {
    }

    // voor het verwijderen van een nieuwsbericht
    protected function actionDeleteNews() {
    }
} // class
?>


Deze code doet nog niets. Ook zijn de acties niet rechtstreeks benaderbaar omdat deze protected zijn - ze zijn enkel aanroepbaar binnen de klasse zelf. Vervolgens gaan we de volgende zaken regelen:
- het aanmaken van een object van deze klasse
- het bepalen van de uit te voeren actie
- het uitvoeren van deze actie

Het eerste punt kunnen we na afloop van de class rechtstreeks doen, of we zouden ervoor kunnen kiezen de class in een apart bestand te zetten en deze te includen / te autoloaden op de plek waar we deze gaan gebruiken. De tweede methode zou netter zijn, maar om het voorbeeld simpel te houden doen we dit voor nu in hetzelfde bestand als de class.

Het tweede punt regelen we in de __construct methode, we slaan hier op welke (geldige) actie we uit willen gaan voeren. Dit bepalen we aan de hand van de GET variabele "action". Hierbij controleren we op de methode bestaat.

Het derde punt regelen we in de (enige andere publieke) methode execute().

We drukken in de methodes ook meteen wat output af om te kijken of het aanroepen van een action slaagt.

De code wordt aldus:
<?php
class MyNews
{
    protected $action;

    // creeer object en bepaal uit te voeren actie
    public function __construct() {
        $this->action = 'default'; // default action
        if (isset($_GET['action']) ) {
            $method = 'action'.ucfirst($_GET['action']);
            if (method_exists($this, $method)) {
                $this->action = $_GET['action'];
            }
        }
    }

    // voer de actie uit
    public function execute() {
        $action = 'action'.ucfirst($this->action);
        $this->$action();
    }

    // voor het weergeven van een of meer berichten
    protected function actionDefault() {
        // debugging
        echo 'actionDefault called';
    }

    // voor het weergeven van een formulier voor het toevoegen van een nieuwsbericht
    protected function actionAddNews() {
        // debugging
        echo 'actionAddNews called';
    }

    // voor het verwerken van het toevoegen van een nieuwsbericht
    protected function actionAddNewsProcess() {
        // debugging
        echo 'actionAddNewsProcess called';
    }

    // voor het wijzigen van een bestaand nieuwsbericht
    protected function actionEditNews() {
        // debugging
        echo 'actionEditNews called';
    }

    // voor het verwerken van het wijzigen van een nieuwsbericht
    protected function actionEditNewsProcess() {
        // debugging
        echo 'actionEditNewsProcess called';
    }

    // voor het verwijderen van een nieuwsbericht
    protected function actionDeleteNews() {
        // debugging
        echo 'actionDeleteNews called';
    }
} // class

// maak object aan
$myNews = new MyNews();
// voer actie uit
$myNews->execute();
?>


Dan waren er enkele acties die output hadden in de vorm van een HTML-document. Hiervoor introduceren we twee hulpmethoden: __header() en __footer().

Nu moeten er een aantal beslissingen worden genomen waarvan de belangrijkste is: welke character encoding gebruik ik. Ik ga er even vanuit dat je UTF-8 gebruikt.

De header en footer methoden worden aldus:
<?php
    protected function __header($title='') {
        header('Content-Type: text/html; charset=UTF-8');
?><!DOCTYPE html>
<html>
<head>
<title><?php echo $title ?></title>
<!-- en wat je hier nog wilt includen: JavaScript, CSS et cetera -->
</head>

<body><?php
    }

    protected function __footer() {
?></body>
</html><?php
    }
?>


Vervolgens zou je je default action kunnen aanpassen naar het volgende:
<?php
    protected function actionDefault() {
        $this->__header('Hello World');
            ?><p>actionDefault called</p><?php
        $this->__footer();
    }
?>


Gefeliciteerd, je hebt de opzet voor een kloppend HTML document.

Vervolg: escaping van output, database-acties, formulieren en verwerking.

Wil je meer zien, of ga je het eerst zelf proberen?
Bedankt Thomas,

Hiermee ga ik vanavond eens mee aan de slag, zal dan even alles opnieuw schrijven.

Ik moet dus als ik t goed heb dus pagina's maken met de forms. Zoals bv nieuws-overzicht.php, nieuws-add.php enz. En daar laat ik de class includen?
Nee, dit is een standalone (op zichzelf staand) script. Deze sla je bijvoorbeeld op als news.php. Vervolgens kun je middels deze acties alles doen (weergeven en beheren). Het beheergedeelte moet natuurlijk op een of andere manier afgeschermd worden, anders kan iedereen je nieuwsberichten wijzigen of weggooien, wat je natuurlijk niet wilt.

Uit oogpunt van overzichtelijkheid heb ik dat hele authenticatie-gedeelte achterwege gelaten. Je zou dit nog op duizend en een andere manieren kunnen indelen en voor allerlei zaken aparte classes kunnen maken (database, formuliersysteem, authenticatielaag, URL rewriting) maar dat zou de vraag een beetje voorbij schieten... dan ben je onderhand bezig met het bouwen van een framework / content management systeem.

Jouw vraag is (min of meer) "hoe beheer ik nieuwsberichten", ik geef je een opzet voor een gestructureerde aanpak die ook toegepast kan worden op andere stukken functionaliteit.

EDIT: in deze class regel je dus "alles" omtrent nieuws, je hoeft geen aparte bestanden aan te maken voor het toevoegen/wijzigen van nieuws, dat doe je in de afzonderlijke acties van deze ene class.
Oef wel een zware opstap om direct op OOP over te stappen. Mocht Cas van een uitdaging houden dan zou ik willen aanraden om eerst wat te oefenen in OOP
True, maar het lijkt mij sowieso verstandig om ook MySQLi te gebruiken, en die maakt ook (voornamelijk) gebruik van objecten.

Het grote voordeel van het gebruik van OOP bij dit soort zaken ten opzichte van een procedurele aanpak is dat je niet verzandt in een if-elseif-else hel om al je acties te scheiden, wat je code gewoon onleesbaar maakt (en waarbij ook vaak allerlei output wordt gegenereerd die toch nooit getoond wordt omdat je meteen redirect).

In een object georienteerde aanpak scheid je elk onderdeel in een overzichtelijk, afgebakend gebied en doe je enkel dat wat nodig is.

Overigens hoef je het bovenstaande sjabloon niet helemaal te doorgronden om het te kunnen gebruiken / uit te breiden. Daarnaast kun je binnen je methoden ook procedureel losgaan als je dat leuk vindt.
Daar ben ik het mee eens Frank.
Dat is een bazooka afschieten op een luis.

Op zich niets mis mee, als de TS dat tempo kan bijhouden.
(dat bedoel ik niet verkeerd richting ts uiteraard)
Is het niet praktischer om gewoon basic te beginnen, met een romig stukje nette code qua database en uit te leggen en hoe een update query in elkaar zit? Zodat de TS eerst doorkrijgt hoe het werkt?

Want feitelijk is dat de vraag van de TS.

EDIT
Mijn k*t enter blijft hangen..
was nog niet klaar.
Hij is al met een database bezig, dan ga ik er (naief als ik ben, wellicht) vanuit dat 'ie daar al enige ervaring mee heeft.

Overigens is een systeempje om nieuws te beheren nou niet bepaald een luis. Hierbij moet je toch wel enigszins gestructureerd te werk gaan.

De vraag van de TS kan op meerdere manieren geinterpreteerd worden:
- het (veilig) terugplaatsen van een bestaand bericht in een formulier middels een id in de URL om vervolgens
- het bijgewerkte bericht op te slaan

Dit gaat hand in hand, lijkt mij. Daarbij schets ik een wat volledigere oplossing. Die herbruikbaar is.
Thomas, ik kom niet echt verder :S, ik snap niet waar ik de forms tussen moet zetten en de sql gegevens(delete, insert enz..)
En hoe ik dan de pagina's moet oproepen.

Reageren