Code script zonder output
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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 ;
?>
$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??
- Ariën -:
Gelieve in het vervolg bij code de [code][/code]-tags gebruiken.
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Hier kan je meer lezen over de mogelijke opmaakcodes.
Alvast bedankt!
Gewijzigd op 11/07/2017 19:56:41 door - Ariën -
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";
Zet daartoe in een configuratiebestand -die je altijd inlaad bij het uitvoeren van overige code- de volgende twee regels:
Code (php)
1
2
3
4
2
3
4
<?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)
?>
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?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>");
?>
$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??
"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:
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:
Waarbij je je met:
Code (php)
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.
Gewijzigd op 12/07/2017 11:37:17 door - Ariën -
- 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
set_exception_handler heb je feitelijk die try/catch blokken niet eens meer nodig.
Ikzelf gebruik al een exception in een gekloonde method van 'query' in een extended classe van de MySQLi-classe. In combinatie met Gewijzigd op 12/07/2017 11:56:53 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?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!
}
?>
// 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.
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.
Gewijzigd op 12/07/2017 13:59:38 door - Ariën -
Code (php)
1
2
3
4
5
2
3
4
5
<?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>");
?>
/* 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:
Code (php)
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.
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.
Gewijzigd op 12/07/2017 15:51:53 door - Ariën -
- Ariën - op 12/07/2017 15:50:52:
Wat jij nu beschrijft vondt ik niet in de link, maar is in princype gelijk aan de oude methode.
Ik doe alles beetje bij beetje om het verband niet kwijt te raken
Als je dat — met alle respect hoor — over het hoofd ziet, dan denk ik dat je er verstandig aan doet om hier te stoppen. Anders gebeurt er zoiets als met de eerste link in je portfolio, om maar wat te noemen.
Wat bedoel je eigenlijk met de laatste opmerking??
Wel vreemd dat ze die niet noemen, maar hierboven staat hij gelukkig wel genoemd.
Sure, je code wordt misschien wat korter door OO-equivalenten, maar de algemene structuur hiervan zal waarschijnlijk in wezen nog steeds de denktrant van een procedurele applicatie volgen.
Als je met OO aan de slag gaat moet je misschien ook wat meer conceptueel aan de slag gaan. Bijvoorbeeld: hoe bouw ik een pagina in het algemeen op.
Waarschijnlijk is op dit moment elke webpagina of eenheid functionaliteit in jouw site een standalone script die een aantal standaard includes heeft. Dit volgt niet echt een OO-denkwijze. Het staat dan, wat mij betreft, ook ter discussie of je de code van dit soort scripts in een OO-dialect zou moeten schrijven. In het beste geval krijg je dan een mengelmoes van object georiënteerde en procedurele code door elkaar.
Gewijzigd op 13/07/2017 10:18:19 door Thomas van den Heuvel
Onnodige kick weggegooid en topic gesloten!