Ik ben maar gestart om mijn scripts opnieuw op te bouwen i.p.v. urenlang regel voor regel an te passen.
Gelijk de gelegenheid om meer structuur aan te brengen.
Een van de problemen was een foutmelding dat een bestand niet bestaat.
Dat wilde ik ondervangen door altijd een default plaatje te toen als een bestand niet bestaat.

Echter onderstaande code laat het script stoppen zonder dat deze output genereerd.

<?php
$Row['competing_for_country'] = 'NED';
// Create Flag directory Path
	$FlagPath = dirname(__FILE__)."/images/Flags/";
	$CountryFlag = dirname(__FILE__)."/images/Flags/FEI.png"; //Default flag
// Check if the requested flag exists
			if (!(@file_exists(dirname(__FILE__)."/image/Flags/.$Row['competing_for_country']"")) {
// And then create the complete path+file name
			$CountryFlag = dirname(__FILE__)."/image/Flags/".$Row['competing_for_country']."png";
			}

echo dirname(__FILE__) ;
echo $FlagPath ;
echo $CountryFlag ;
?>


Echter dit script genereerd geen output dus de vraag is, is deze constructie fout en zo ja waar??

Harry
Wat kan hier mis gaan??
if (!(@file_exists(dirname(__FILE__)."/image/Flags/.$Row['competing_for_country']"")) {
mist een " en een )
if (!(@file_exists(dirname(__FILE__)."/image/Flags/".$Row['competing_for_country']))) {

$CountryFlag = dirname(__FILE__)."/image/Flags/".$Row['competing_for_country']."png";
mist een punt voor png:
$CountryFlag = dirname(__FILE__)."/image/Flags/".$Row['competing_for_country'].".png";
Indien je code aan het (her)ontwikkelen bent, zorg dan dat je code "mondig" is in het melden + weergeven van fouten, anders zullen de scripts je niet de informatie geven die je nodig hebt om eventuele fouten er uit te halen, tenzij je webserver zo geconfigureerd is.

Zet daartoe in een configuratiebestand -die je altijd inlaad bij het uitvoeren van overige code- de volgende twee regels:
<?php
error_reporting(E_ALL); // WELKE fouten je wilt weergeven
ini_set('display_errors', 'stdout'); // WAAR je de fouten meldt (standard output, op je scherm)
?>


Dit is eigenlijk verplicht voor ontwikkeling, en verboden op een productie-omgeving (omdat je applicatie anders fouten kunt blootleggen die kwaadwillenden kunnen uitbuiten).

Het eerste wat men eigenlijk zou moeten leren bij programmeren is debuggen, want als men eenmaal van de gebaande paden afraakt is ieder meteen het spoor bijster...
Hoi Thomas,

Moest even zoeken waar ik deze regels zou plaatsen Staan nu in mijn script waar ik connect met de database aangezien dit in vrijwel elk script gebeurd. Zie hieronder:
<?php
$MySqlHostname = "localhost";
$MySqlDatabase = "harryare";

	$MySqlUsername = "geheim";
	$MySqlPassword = "geheim";

/* make connection to database */
/* If no connection made, display error Message */
$dblink=MYSQLI_CONNECT($MySqlHostname, $MySqlUsername, $MySqlPassword, $MySqlDatabase) OR DIE("Could not connect to database server:".mysql_error()."<br>");       
	?>

Vraagje, welk type fout rapportage moet aan staan in een productie omgeving??
Ik zou in productie-omgeving geen foutmeldingen vanuit PHP of MySQL tonen, en alleen maar een mens-vriendelijke:

"Er is een storing bij ons opgetreden bij het bezoeken aan de website. Wij zijn op de hoogte en zullen dit z.s.m. verhelpen. Onze excuses voor het ongemak!"

je kan fouten in ieder geval dan verbergen met:

<?php
 ini_set('display_errors', 0);
 error_reporting(0);
?>


Maar zorg dan wel dat je goede foutafhandeling hebt in je gehele code, die mens-vriendelijke meldingen toont of uitgebreide meldingen voor ontwikkelaars. Met een switch in je configuratie zou je zoiets kunnen doen:
<?php
define(DEBUG, true); // true of false
?>

Waarbij je je met:
<?php
if(DEBUG) {
// debug mode geactiveerd!
} else {
// debug mode uit. Dit hoor je enkel in productie te zien
}
?>

Het is nog mooier als je de OO-variant van MySQLi gebruikt, dan kan je een algemene foutafhandeling maken die op al je $mysqli->query()'s geldt , zonder dat je daar steeds maar weer een if-statement voor aan hoeft te maken. Ikzelf gebruik hier een extended class voor waarmee ik query-method overschrijf. Maar ik denk dat dit zelfs beter kan.
- Ariën - op 12/07/2017 11:35:51

Het is nog mooier als je de OO-variant van MySQLi gebruikt, dan kan je een algemene foutafhandeling maken die op al je $mysqli->query()'s geldt , zonder dat je daar steeds maar weer een if-statement voor aan hoeft te maken. Ikzelf gebruik hier een extended class voor waarmee ik query-method overschrijf. Maar ik denk dat dit zelfs beter kan.

Daarvoor kun je exceptions gebruiken. Per saldo maakt het echter nauwelijks uit of je nu een if/else of een try/catch gebruikt: je moet een eventuele fout uiteindelijk toch afhandelen.

https://stackoverflow.com/questions/14578243/turning-query-errors-to-exceptions-in-mysqli
Ikzelf gebruik al een exception in een gekloonde method van 'query' in een extended classe van de MySQLi-classe. In combinatie met [php]set_exception_handler[/php] heb je feitelijk die try/catch blokken niet eens meer nodig.
Vraagje, hoe bouw ik dit om naar een OO variant:

<?php
// get country long name
				IF (!(@ $resultCountry = mysqli_query($dblink, $sqlCountry))) {
					$html = 'There was an error running your query: '.mysqli_error($dblink);
					}
				ELSE {
					$country_name = mysqli_fetch_assoc($resultCountry);
					$Ctxt = $country_name['e_country']; // VELDNAAM_UIT_TABEL aanpassen!
				    } 
?>

Als ik weet hoe dat 'kunstje' werkt kan ik van daaruit verder werken.
Nu gebruik je de procedurele versie van MySQLi. De Object Georiënteerde (OO) werkt met een class en is herkenbaar aan pijlen.
Zie ook: https://www.w3schools.com/php/php_mysql_connect.asp

Klik ook even door naar de rest van de manual. Het heeft betrekking op alle functies van MySQLi.
Mijn oude connectie-script:
<?php
/* make connection to database */
/* If no connection made, display error Message */
$dblink=MYSQLI_CONNECT($MySqlHostname, $MySqlUsername, $MySqlPassword, $MySqlDatabase) OR DIE("Could not connect to database server:".mysql_error()."<br>");       
?>


In OO zou het er dus zo uitzien:

<?php
/ Create connection
$dblink = new mysqli($MySqlHostname, $MySqlUsername, $MySqlPassword);

// Check connection
if ($dblink->connect_error) {
    die("Connection failed: " . $dblink->connect_error);
}
?>

Zoals ik het zie maak ik een verbinding met de server waarop MYSQL draaid maar mis ik de verwijzing naar de database zoals nu wel gebeurd. Ik zal wel weer wat missen, maar dat vindt ik niet op de gelinkte pagina.
Het vierde argument in je mysqli-aanroep is voor de database.


$dblink = new mysqli($MySqlHostname, $MySqlUsername, $MySqlPassword, $MySqlDatabase);


Maar dan heb je tot nu toe nog alleen de eerste stap gedaan, en dat is de connectie omzetten naar OO. De rest moet ook nog gebeuren.

Reageren