Code script zonder output

Overzicht

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Harry H Arends

Harry H Arends

11/07/2017 17:48:28
Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 ;
?>


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!
Gewijzigd op 11/07/2017 19:56:41 door - Ariën -
 
PHP hulp

PHP hulp

29/11/2024 15:38:28
 
- SanThe -

- SanThe -

11/07/2017 18:03:46
Anchor link
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";
 
Thomas van den Heuvel

Thomas van den Heuvel

12/07/2017 02:22:34
Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)
?>


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...
 
Harry H Arends

Harry H Arends

12/07/2017 11:25:48
Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>");      
    ?>

Vraagje, welk type fout rapportage moet aan staan in een productie omgeving??
 
- Ariën  -
Beheerder

- Ariën -

12/07/2017 11:35:51
Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
define(DEBUG, true); // true of false
?>


Waarbij je je met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?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.
Gewijzigd op 12/07/2017 11:37:17 door - Ariën -
 
Ward van der Put
Moderator

Ward van der Put

12/07/2017 11:46:30
Anchor link
- 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
 
- Ariën  -
Beheerder

- Ariën -

12/07/2017 11:56:37
Anchor link
Ikzelf gebruik al een exception in een gekloonde method van 'query' in een extended classe van de MySQLi-classe. In combinatie met set_exception_handler heb je feitelijk die try/catch blokken niet eens meer nodig.
Gewijzigd op 12/07/2017 11:56:53 door - Ariën -
 
Harry H Arends

Harry H Arends

12/07/2017 13:44:15
Anchor link
Vraagje, hoe bouw ik dit om naar een OO variant:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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!
                    }
?>

Als ik weet hoe dat 'kunstje' werkt kan ik van daaruit verder werken.
 
- Ariën  -
Beheerder

- Ariën -

12/07/2017 13:55:26
Anchor link
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.
Gewijzigd op 12/07/2017 13:59:38 door - Ariën -
 
Harry H Arends

Harry H Arends

12/07/2017 15:28:24
Anchor link
Mijn oude connectie-script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>");      
?>


In OO zou het er dus zo uitzien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?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.
 
- Ariën  -
Beheerder

- Ariën -

12/07/2017 15:50:52
Anchor link
Het vierde argument in je mysqli-aanroep is voor de database.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$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.
Gewijzigd op 12/07/2017 15:51:53 door - Ariën -
 
Harry H Arends

Harry H Arends

12/07/2017 17:31:05
Anchor link
- Ariën - op 12/07/2017 15:50:52:
Het vierde argument in je mysqli-aanroep is voor de database.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$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.

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
 
Ward van der Put
Moderator

Ward van der Put

12/07/2017 17:37:42
Anchor link
Dit is het eerste voorbeeld van de constructor van MySQLi:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$mysqli
= new mysqli('localhost', 'my_user', 'my_password', 'my_db');
?>


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.
 
Harry H Arends

Harry H Arends

12/07/2017 20:10:43
Anchor link
Ik was dus met MySQLi Object-Oriented aan het kijken en bij dat voorbeeld wordt de database optie niet genoemd en ik ben geen wizkid.

Wat bedoel je eigenlijk met de laatste opmerking??
 
- Ariën  -
Beheerder

- Ariën -

12/07/2017 20:41:00
Anchor link
Wel vreemd dat ze die niet noemen, maar hierboven staat hij gelukkig wel genoemd.
 
Thomas van den Heuvel

Thomas van den Heuvel

13/07/2017 10:13:32
Anchor link
Ben het eigenlijk wel met @Ward eens. Je kunt nu wel een OO-saus over je code heengooien, maar als je verder niet nadenkt over de architectuur dan zou je je af kunnen vragen wat hier de meerwaarde van is.

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
 
- Ariën  -
Beheerder

- Ariën -

14/05/2018 16:27:05
Anchor link
Onnodige kick weggegooid en topic gesloten!
 
 

Dit topic is gesloten.



Overzicht

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.