Mijn goed werkende code draaiend onder PHP 5.6 geeft altijd juist GEEN foutboodschap vanwege het teken '@', maar onder PHP 7 wordt er TOCH ALTIJD een foutboodschap weergegeven mét de onmiddellijke programma-afbreking, zodat er niet verder gegaan kan worden!
Mijn code ziet er als volgt uit:

$dbs = @mysqli_connect($dbshst, $dbsusr, $dbspsw);
if($dbs === false){---mijn eigen foutboodschaproutine---}

HOE kan ik elke mysqli foutboodschappen ONDERDRUKKEN onder PHP 7 én zonder onmiddellijke programma-afbreking?
Met onmiddelijke afbreking zou een fatal error inhouden, en die kun je niet zonder meer vangen. Dus hoe luidt de boodschap?
a) Waarom zou je dat willen? Lijkt me handiger om je code zo te schrijven dat er geen foutmeldingen voorkomen.
b) Tijdens ontwikkeling wil je zeker alle foutmeldingen zien. Als alles goed werkt en online staat kan ik me nog voorstellen dat je ALLE foutmeldingen wilt onderdrukken en niet alleen die van mysqli.
c) Alle foutmeldingen onderdrukken of juist tonen is gewoon een php.ini instelling:

Even van stackoverflow gekopieerd:


to Hide All Errors:
<?php
error_reporting(0);
ini_set('display_errors', 0);
?>
to Show All Errors:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>




[size=xsmall]Toevoeging op 18/09/2017 11:42:15:[/size]

Anyway, welke foutmelding krijg je?
Ik kreeg aldoor dezelfde boodschap:
Warning: mysqli_connect(): (HY000/1045): Access denied for user 'devrije'@'localhost' (using password: YES)
Ik heb met opzet een verkeerd wachtwoord gebruikt om te kijken, of het perfekt werkt. Blijkbaar niet!?

[size=xsmall]Toevoeging op 18/09/2017 22:33:15:[/size]

Jullie tip over verbergen van errors help HELAAS OOK NIET, want ik kreeg nog steeds dezelfde boodschap!?
Waarom bouw je geen debug-modus in?

Dan toon je de technische foutmeldingen als deze modus aan staat (tijdens ontwikkeling en het testen) en in productie (live) toon je: "Er is een technische fout bij ons opgetreden", terwijl je de foutmelding op de achtergrond logt. Eventueel kan je er een unieke MD5-hash aan koppelen, zodat je de foutmeldingen makkelijk terug kan vinden.

Dit zou bijvoorbeeld prima met behulp van een custom exception-handeler kunnen.
Warnings worden gewoon onderdrukt door @, ook in PHP 7. Warnings breken ook je programma niet af. De fout moet dus ergens anders zitten.
Voor de zekerheid: wat staat er in:

{---mijn eigen foutboodschaproutine---}
Mijn code zieter als volgt uit:

$dbs = @mysqli_connect($dbshst, $dbsusr, $dbspsw);
if($dbs === false)
error_log( 'MySQL server kan niet geopend worden;'
. 'MySQL error "'
. (string)mysqli_connect_errno()
. '" = '
. mysqli_connect_error());

Vermoedelijk ligt het aan het programma 'XAMPP'.
Ik zal er bij XAMMP naar informeren.
De "access denied"-foutmelding verschijnt bij XAMPP onder andere als je MySQL nog niet hebt gestart.
XAMPP is niet echt een programma maar meer een bundeling van alle webserver-applicaties. Je moet dus echt naar een bepaalde instelling zoeken.
De insteek om op voorhand alle fouten onder het tapijt te schuiven lijkt mij inderdaad geen juiste. Foutmeldingen wijzen vaak in de richting van een (achterliggend) probleem. Deze "voelsprieten" onklaar maken is dan ook niet zo'n fantastische strategie.

Kijk anders eens in je errorlog. Mogelijk komen hier nog hele andere foutmeldingen voorbij. En inderdaad, voor ontwikkeling altijd het melden + weergeven van fouten aanzetten zodat je meteen op fouten wordt geattendeerd.

Het gebruik van @ is eigenlijk slechts in sommige gevallen geoorloofd (en volgens anderen is welke toepassing dan ook hiervan een soort van heiligschennis), namelijk als je wéét dat een bepaalde operatie kan mislukken. Het maken van een verbinding met een database-server zou hier niet onder moeten vallen... Uiteraard moet je dit op een of andere manier ondervangen, maar (in dit geval beter) niet met @.

Reageren