Door
Harry H Arends
op 11-07-2017 17:48
gewijzigd op 11-07-2017 19:56
3.216 views
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??
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...
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!"
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.
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.
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.
<?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.
<?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>");
?>
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.