Problemen met verwerken van de fouten in de database
Ik gebruik een script om fouten met de database connectie te kunnen bekijken.
Ik heb alleen een fout waar ik niet uit kom. Wie kan er even kijken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function safe_query($db, $query){
global $ERRORS;
return false;
}
if (DEBUG_MODE) {
if (!$result = @mysqli_query($db, $query)) {
die("{$ERRORS['QUERY_ERROR_ADMIN']})
<br> uitgevoerde query: $query .
<br> MySQL-foutnummer: ". mysqli_errno($db) .
"<br>MySQL-melding: " . mysqli_error($db));
}
else {
return $result;
}
}
else{
if (!$result = @mysqli_query($db, $query)){
die ($ERRORS ['QUERY_ERROR_USER']);
}
else {
return $result;
}
}
global $ERRORS;
return false;
}
if (DEBUG_MODE) {
if (!$result = @mysqli_query($db, $query)) {
die("{$ERRORS['QUERY_ERROR_ADMIN']})
<br> uitgevoerde query: $query .
<br> MySQL-foutnummer: ". mysqli_errno($db) .
"<br>MySQL-melding: " . mysqli_error($db));
}
else {
return $result;
}
}
else{
if (!$result = @mysqli_query($db, $query)){
die ($ERRORS ['QUERY_ERROR_USER']);
}
else {
return $result;
}
}
Melding op mijn scherm:
Warning: mysqli_errno() expects parameter 1 to be mysqli, string given in /public/sites/mijnsite/php/Gastenboek/functions.php on line 40
Warning: mysqli_error() expects parameter 1 to be mysqli, string given in /public/sites/mijnsite /php/Gastenboek/functions.php on line 41
Er is een fout opgetreden bij het werken met de database
)
uitgevoerde query: null .
MySQL-foutnummer:
MySQL-melding:
Gewijzigd op 28/12/2016 19:51:21 door Rubensky PHP starter
Waar komt $db vandaan? En haal ook de @-jes weg, want foutmeldingen wil je niet verbergen.
Is het de bedoeling dat deze code onderdeel is van de functie safe_query? Want die functie heb je al afgesloten tegen de tijd dat je met de code begint.
Die $db staat in mijn config file bij het verbinden met de database.
Ziet er zo uit:
Ten eerste je zou een MySQLi-connectie moeten geven met de functie mysqli_connect(). Wat jij nu hebt is een string met 'null' als inhoud.
Rubensky PHP starter op 28/12/2016 21:31:03:
Ook dit lijkt niet goed te gaan. Waarschijnlijk bedoel je
en waar gebruik je mysqli_connect() dan?
Gewijzigd op 28/12/2016 21:52:14 door Frank Nietbelangrijk
in die $db zit het probleem niet denk ik. Het is namelijk het laatste stuk wat ik heb toegevoegd waar het probleem zit.
Zit daar de connectie in van je database?
Welk stuk heb je toegevoegd toen het nog wel werkte?
En waarom werkt het nu dan niet meer?
O ja, dit deel heb ik bovenaan de file toegevoegd
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
define ('DEBUG_MODE', true);
$ERRORS ['QUERY_ERROR_USER'] = 'Onze excusus er is iets mis gegaan met de database neem eventueel contact op met de beheerder';
$ERRORS ['QUERY_ERROR_ADMIN'] = 'Er is een fout opgetreden bij het werken met de database<br>';
?>
define ('DEBUG_MODE', true);
$ERRORS ['QUERY_ERROR_USER'] = 'Onze excusus er is iets mis gegaan met de database neem eventueel contact op met de beheerder';
$ERRORS ['QUERY_ERROR_ADMIN'] = 'Er is een fout opgetreden bij het werken met de database<br>';
?>
Waarom het nu niet meer werkt dat vraag ik nu juist. Het idee is het beveiligen van de query's in de database. Zodat de gebruiker niet een of andere vreemde melding te zien krijgt. Maar ook dat de hacker dat niet ziet en daar dus niets mee kan.
Gewijzigd op 29/12/2016 10:00:02 door Rubensky PHP starter
Waar is nu je database-connectie?
Die ziet er zo uit:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$host = 'localhost';
$gebruiker = 'root';
$wachtwoord = 'gaikhiernietplaatsen';
$database = 'gastenboek';
$query = 'null';
$db = 'null';
$gebruiker = 'root';
$wachtwoord = 'gaikhiernietplaatsen';
$database = 'gastenboek';
$query = 'null';
$db = 'null';
Ik wil hier wel de gehele code plaatsen maar dat is niet zo gewenst denk ik.
Laat eens zien hoe hij eruit ziet?
Ik meld alleen dat de connectie in zo'n config file zit. Bovenstaande is de connectie met de database dat is ook het enige wat in die file zit.
Code (php)
1
2
3
4
2
3
4
if (!$db = mysqli_connect($host, $gebruiker, $wachtwoord, $database)) {
echo '<h2>Het openen van de database is mislukt</h2>';
echo 'De MySQL-foutmelding luidt: ' . mysqli_connect_error();
exit;
echo '<h2>Het openen van de database is mislukt</h2>';
echo 'De MySQL-foutmelding luidt: ' . mysqli_connect_error();
exit;
Moet ik anders voor de duidelijkheid de files even uploaden?
Maar daarna zet je $db op NULL, en wordt je connectie weer weggegooid. Dat hoort niet.
Ik ben het aan het leren he dus ik wil graag begrijpen hoe en wat.
Het gebruiken van die() kan resulteren in een half HTML-document wat andere webpagina-functionaliteit kan breken dus dit lijkt mij (in dit geval, het hangt natuurlijk af van wat je bouwt) geen goed idee. Dit is trouwens prima geschikt voor ontwikkeling maar waarschijnlijk niet zo'n fantastische keuze voor een productie-omgeving.
Overigens kun je het "moment van foutafhandeling" uitstellen (dit is vooral handig voor live-omgevingen). En de manier waarop de fout afgehandeld wordt hoeft geen onderdeel uit te maken van je wrapper functionaliteit. Dit doe je met exceptions. Een exception beschrijft een (semi-)onvoorziene situatie die optreedt. Hiermee geeft de wrapper in feite aan "kan iemand mij vertellen wat ik hiermee moet doen". Vervolgens moet een ander proces deze exception oppikken (anders resulteert dit alsnog in een fatal error) en verder afhandelen. Dit doe je met een try-catch blok.
Anyway, het lijkt mij handiger om een wrapper te schrijven in OOP-code (te meer omdat mysqli zelf ook object-georiënteerd is en) omdat dit (ook) beter past in het try-catch stramien.
Daarnaast is het gebruik van een @ niet per definitie taboe, zolang je maar iets met mogelijk opgetreden fouten doet.
Gewijzigd op 29/12/2016 16:31:52 door Thomas van den Heuvel
@Thomas: Ik hoop dat een beginner als Rubensky je snapt. Je draaft een beetje door.
Gewijzigd op 29/12/2016 16:31:26 door - Ariën -
Tomas ik begrijp maar voor een heel klein deel wat je hier neer zet. En daarnaast heb ik geen idee hoe ik met de door jou geschreven zaken verder moet om de fout weg te krijgen.
Maakt niet uit of dit beginnerscode of geavanceerd spul is: wanneer je teveel combineert resulteert dit in een onoverzichtelijke brei waarin weinig tot niets aangepast kan worden zonder dat de hele toren instort.
@Rubensky mysqli_error() en mysqli_errno() verwachten één parameter: het database-object. Deze is van de klasse mysqli. Je roept dit aan met iets wat niet van het type (de klasse) mysqli is.
Gewijzigd op 29/12/2016 16:40:42 door Thomas van den Heuvel