Hallo,

Ik heb dit scriptje getypt wat natuurlijk nog niet werkt. Het is een script die nieuws naar de database stuurt. Ik wil graag weten hoe ik hier een goede foutafhandeling aan moet toevoegen.

Script:

<?php
error_reporting(0);
session_start();
include 'config.php';
$adminchecksql 		= 	mysql_query('SELECT admin FROM users');
$admincheckfetch 	= 	mysql_fetch_assoc($adminchecksql);
$admin				=	$admincheckfetch;
//if ($_SESSION['loggedin'] != true) {
//Header ('Location: index.php');
//}
//if ($admin != 1) {
//Header ('Location: index.php');
//}
?>
<html>
<head>
<title>PortalCMS | Nieuw nieuwsbericht</title>
</head>
<body>
<form method='post'>
<em>Titel</em><br>
<input type='text' name='naam' value='Titel'><br><br>
<em>Inleiding</em><br>
<textarea name='kort'rows='15' cols='50'>Een inleiding...</textarea><br><br>
<em>Bericht</em><br>
<textarea name='lang' rows='25' cols='50'>het echte bericht...</textarea><br><br>
<input type='submit' name='submit' value='Publiceer'>
</form>
</body>
</html>
<?php
$name	=	mysql_real_escape_string($_POST['naam']);
$short	=	mysql_real_escape_string($_POST['kort']);
$long	=	mysql_real_escape_string($_POST['lang']);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$submitsql = mysql_query('INSERT INTO news (naam, kort, lang, visible) VALUES ($name, $short, $long, 1') or die('ERROR!');
echo $submit_sql;

}

?>


Koen Hollander
Koen, mysql_query geeft bij een INSERT, UPDATE, DELETE en DROP altijd een true terug als de query geslaagd is of false terug als de query niet geslaagd is.

dus:

<?php
$submitsql = mysql_query('INSERT INTO news (naam, kort, lang, visible) VALUES ($name, $short, $long, 1'));
if(!$submit_sql)
// handel de fout af
?>
Dit deel van de code controleert toch of de request method post is EN hij controleert of de query fout is uitgevoerd?
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST' AND !$submit_sql) {
echo 'Er is een fout opgetreden! Probeer het later nog eens!';
}
?>
Of heb ik het nu mis? Want ik zie dit: Er is een fout opgetreden! Probeer het later nog eens!
terwijl er niks is verzonden.
Heb je al wel de $submit_sql gevuld met een false of true? Is hij überhaupt geset?
't Lijkt mij dat je EERST je input wilt controleren voordat je wat submit/insert?
Dat weet ik. Ik wil eerst weten of dit werkt en dan doe ik dat pas.
vervang error_reporting(0); is door:
ini_set('display_errors', 1);
error_reporting(E_ALL);

dan zie je al dat je iets fout doet namelijk POST waarden in variablen zetten die nog niet verstuurd zijn.

 <?php
ini_set('display_errors', 1); //het script is nog niet af, we willen weten of er fouten zijn.
error_reporting(E_ALL);
session_start();
include 'config.php';
$adminchecksql         =     mysql_query('SELECT admin FROM users');
$admincheckfetch     =     mysql_fetch_assoc($adminchecksql);
$admin                =    $admincheckfetch;
//if ($_SESSION['loggedin'] != true) {
//Header ('Location: index.php');
//}
//if ($admin != 1) {
//Header ('Location: index.php');
//}
?>
<html>
<head>
<title>PortalCMS | Nieuw nieuwsbericht</title>
</head>
<body>
<form method='post'>
<em>Titel</em><br>
<input type='text' name='naam' value='Titel'><br><br>
<em>Inleiding</em><br>
<textarea name='kort'rows='15' cols='50'>Een inleiding...</textarea><br><br>
<em>Bericht</em><br>
<textarea name='lang' rows='25' cols='50'>het echte bericht...</textarea><br><br>
<input type='submit' name='submit' value='Publiceer'>
</form>
</body>
</html>
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') { //het formulier is verzonden
    $name    =    mysql_real_escape_string($_POST['naam']);
    $short    =    mysql_real_escape_string($_POST['kort']);
    $long    =    mysql_real_escape_string($_POST['lang']);
    $submitsql = mysql_query('INSERT INTO news (naam, kort, lang, visible) VALUES ($name, $short, $long, 1'));
    if($submitsql) { //kijken of het is gelukt.
        echo 'Nieuws toegevoegt!';
    }
    else {
        echo 'Er is een fout opgetreden! Probeer het later nog eens!';
    }
}
?> 
Dus je wilt eerst gaan fietsen, en dan pas de wielen monteren?
Dat werkt dus niet.

Alleen als er wat gepost wordt, ga je wat submitten. Dat kan dus niet in 1 controle, chronologisch gezien.
Nu kan je met namespaces en allerlei gare constructies wel wat maken, maar dat moet je gewoon niet doen.

<?php
	// error reporting aan. Anders commentaar je deze weg?
	error_reporting(E_ALL);
	//error_reporting(0);

	// start sessie
	session_start();

	// include de configuratie
	include 'config.php';

	// controleer een admin... niets van de gebruiker nodig?
	// wat wil je hier nou? De enige admin selecteren? En dan?
	$sql = "SELECT admin FROM users";
	$res = mysql_query($sql);
	$geenideewatikhiermeegadoen = mysql_fetch_assoc($res);
	
	// formulier maken, met soort van __VARS__ in het formulier.
	$formulier = '
	<form method="post" action="">
		<em>Titel</em>
		<input type="text" name="naam" value="__NAAM__">
		<em>Inleiding</em>
		<textarea name="kort"rows="15" cols="50">__KORT__</textarea>
		<em>Bericht</em>
		<textarea name="lang" rows="25" cols="50">__LANG__</textarea>
		<input type="submit" value="Publiceer">
	</form>';
		
	// controle van formulier
	// kijk of er NOG NIET gepost is
	if($_SERVER['REQUEST_METHOD'] != 'POST')
	{
		// standaard-waarden dan maar...	
		$_POST['naam'] = 'Titel van het stuk';
		$_POST['kort'] = 'Samenvatting, niet meer dan 200 tekens.';
		$_POST['lang'] = 'Het lange bericht';
				
		// gaat formulier tonen
		$melding[] = str_replace(array("__NAAM__", "__KORT__", "__LANG__"), array($_POST['naam'], $_POST['lang'], $_POST['kort']), $formulier);
	}
	else
	{
		// kijk of de benodigde gegevens er zijn
		if(isset($_POST['naam'], $_POST['kort'], $_POST['lang']))
		{
			// schrijf de SQL netjes uit. Deze kan je makkelijk echoén als nodig
			$sql = "INSERT INTO news 
							(
								naam, 
								kort, 
								lang, 
								visible
							) 
						VALUES 
							(
								'" . mysql_real_escape_string($_POST['naam']) . "',
								'" . mysql_real_escape_string($_POST['kort']) . "',
								'" . mysql_real_escape_string($_POST['lang']) . "',
								1
							);
							";
			// echo $sql;

			// voer de query uit, sla resultaat (true/false) op in $res
			$res = mysql_query($sql);

			// kijk of de query gelukt is
			if($res === true)
			{
				// geef melding dat het opslaan gelukt is
				$melding[] = '<p class="alert_ok">Opgeslagen</p>';
			}
			// query is niet gelukt
			else
			{
				// geef melding van failure
				$melding[] = '<p class="alert_fault">Niet opgeslagen</p>';
				
				// geef formulier weer
				$melding[] = str_replace(array("__NAAM__", "__KORT__", "__LANG__"), array($_POST['naam'], $_POST['lang'], $_POST['kort']), $formulier);
			}
		}
		// niet alle waarden zijn binnen gekomen
		else
		{
			// melding geven dat we wat missen
			$melding[] = '<p class="alert_fault">Een van de gevraagde gegevens missen. Vul die alsnog in!</p>';
			
			// geef formulier weer
			$melding[] = str_replace(array("__NAAM__", "__KORT__", "__LANG__"), array($_POST['naam'], $_POST['lang'], $_POST['kort']), $formulier);
		}
	}

?>
<!DOCTYPE html>
<head>
	<title>PortalCMS | Nieuw nieuwsbericht</title>
</head>
<body>
	<?php
		echo implode(PHP_EOL, $melding);
	?>
</body>
</html>
Eddy Erkelens op 02/11/2012 20:21:40

Dus je wilt eerst gaan fietsen, en dan pas de wielen monteren?
Dat werkt dus niet.

Alleen als er wat gepost wordt, ga je wat submitten. Dat kan dus niet in 1 controle, chronologisch gezien.
Nu kan je met namespaces en allerlei gare constructies wel wat maken, maar dat moet je gewoon niet doen.

<?php
	// error reporting aan. Anders commentaar je deze weg?
	error_reporting(E_ALL);
	//error_reporting(0);

	// start sessie
	session_start();

	// include de configuratie
	include 'config.php';

	// controleer een admin... niets van de gebruiker nodig?
	// wat wil je hier nou? De enige admin selecteren? En dan?
	$sql = "SELECT admin FROM users";
	$res = mysql_query($sql);
	$geenideewatikhiermeegadoen = mysql_fetch_assoc($res);
	
	// formulier maken, met soort van __VARS__ in het formulier.
	$formulier = '
	<form method="post" action="">
		<em>Titel</em>
		<input type="text" name="naam" value="__NAAM__">
		<em>Inleiding</em>
		<textarea name="kort"rows="15" cols="50">__KORT__</textarea>
		<em>Bericht</em>
		<textarea name="lang" rows="25" cols="50">__LANG__</textarea>
		<input type="submit" value="Publiceer">
	</form>';
		
	// controle van formulier
	// kijk of er NOG NIET gepost is
	if($_SERVER['REQUEST_METHOD'] != 'POST')
	{
		// standaard-waarden dan maar...	
		$_POST['naam'] = 'Titel van het stuk';
		$_POST['kort'] = 'Samenvatting, niet meer dan 200 tekens.';
		$_POST['lang'] = 'Het lange bericht';
				
		// gaat formulier tonen
		$melding[] = str_replace(array("__NAAM__", "__KORT__", "__LANG__"), array($_POST['naam'], $_POST['lang'], $_POST['kort']), $formulier);
	}
	else
	{
		// kijk of de benodigde gegevens er zijn
		if(isset($_POST['naam'], $_POST['kort'], $_POST['lang']))
		{
			// schrijf de SQL netjes uit. Deze kan je makkelijk echoén als nodig
			$sql = "INSERT INTO news 
							(
								naam, 
								kort, 
								lang, 
								visible
							) 
						VALUES 
							(
								'" . mysql_real_escape_string($_POST['naam']) . "',
								'" . mysql_real_escape_string($_POST['kort']) . "',
								'" . mysql_real_escape_string($_POST['lang']) . "',
								1
							);
							";
			// echo $sql;

			// voer de query uit, sla resultaat (true/false) op in $res
			$res = mysql_query($sql);

			// kijk of de query gelukt is
			if($res === true)
			{
				// geef melding dat het opslaan gelukt is
				$melding[] = '<p class="alert_ok">Opgeslagen</p>';
			}
			// query is niet gelukt
			else
			{
				// geef melding van failure
				$melding[] = '<p class="alert_fault">Niet opgeslagen</p>';
				
				// geef formulier weer
				$melding[] = str_replace(array("__NAAM__", "__KORT__", "__LANG__"), array($_POST['naam'], $_POST['lang'], $_POST['kort']), $formulier);
			}
		}
		// niet alle waarden zijn binnen gekomen
		else
		{
			// melding geven dat we wat missen
			$melding[] = '<p class="alert_fault">Een van de gevraagde gegevens missen. Vul die alsnog in!</p>';
			
			// geef formulier weer
			$melding[] = str_replace(array("__NAAM__", "__KORT__", "__LANG__"), array($_POST['naam'], $_POST['lang'], $_POST['kort']), $formulier);
		}
	}

?>
<!DOCTYPE html>
<head>
	<title>PortalCMS | Nieuw nieuwsbericht</title>
</head>
<body>
	<?php
		echo implode(PHP_EOL, $melding);
	?>
</body>
</html>



Heel erg bedankt! Nu werkt de code wel. Ik ben je vreselijk dankbaar, dankzij die commentaar regels snap ik alles! Dus: Dankjewel!

EN

PHP Jasper op 02/11/2012 21:36:27

Lees mijn tutorial een keertje: http://www.phphulp.nl/php/tutorial/data-verwerking/foutafhandeling-query-sql/735/


Die ga ik eens uitgebreid doorlezen.

Reageren