mysql error?
op onze site is iets raars aan de hand, het is een soort spelletje waar iemands rank omlaag is gegaan. Maar dit mag helemaal niet kunnen. Dus ik heb zon beetje alle codes doorzocht en all mysql queries gecontroleerd maar ik kan nergens vinden wat de fout is.
Nou vraag ik me af of het mogelijk is dat een mysql query tijdelijk geen contact met de database kan maken en daarom geen waarde geeft. En als hij er dan 20 bij op moet tellen en weer in de database moet zetten, dat hij dan 20 in de database zet?
Dus bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$a = "SELECT * FROM members WHERE gebruikersnaam='".$_SESSION[id]."'";
$b = mysql_query($a);
$c = mysql_fetch_object($b);
// hier zou dus tijdelijk geen contact mee zijn dus er komt niks terug
$nieuwrank = $c->rank + 20;
// Eigenlijk moet hier dus een hoger getal uitkomen maar omdat $c->rank niet bestaan is hij maar 20
mysql_query ("UPDATE `members` SET `rank` = '".$nieuwrank."' WHERE `gebruikersnaam` = '".$naam."'");
//Hier zet de dus de 20 in de database zodat de rank dus omlaag is gegaan?
?>
$a = "SELECT * FROM members WHERE gebruikersnaam='".$_SESSION[id]."'";
$b = mysql_query($a);
$c = mysql_fetch_object($b);
// hier zou dus tijdelijk geen contact mee zijn dus er komt niks terug
$nieuwrank = $c->rank + 20;
// Eigenlijk moet hier dus een hoger getal uitkomen maar omdat $c->rank niet bestaan is hij maar 20
mysql_query ("UPDATE `members` SET `rank` = '".$nieuwrank."' WHERE `gebruikersnaam` = '".$naam."'");
//Hier zet de dus de 20 in de database zodat de rank dus omlaag is gegaan?
?>
Mijn vraag is: is zoiets mogelijk? En is hier iets aan te doen?
Met or die(mysql_error() misschien?
of zit er toch ergens een fout in mijn code?
Alvast bedankt ...
Gewijzigd op 01/01/1970 01:00:00 door Koen B
UPDATE members
SET rank = rank + 20
WHERE gebruikersnaam = '$naam'
niet als ik $nieuwrank later in de code nog nodig heb ....
Je vult de huidige rank steeds aan met 20 punten.
Heb je nog steeds de fout dat er punten worden afgetrokken? Het zit dan denk ik niet in het bovenstaande stuk, daar zie ik verder niks verkeerds.
Want de rank hoort helemaal niet omlaag te kunnen gaan en het is ook nog maar 1 keer gebeurd.
Als het een fout in de code zou zijn zou de rank vaker omlaag moeten gaan, maar we hebben het nog maar 1 keer gezien ...
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
if(mysql_num_rows($query) != 1){
//query fout gegaan, geef melding en update niet
}
else{
// wel gegevens gevonden, update wel
}
?>
if(mysql_num_rows($query) != 1){
//query fout gegaan, geef melding en update niet
}
else{
// wel gegevens gevonden, update wel
}
?>
Meest simpele oplossing om zoiets in de toekomst te voorkomen.
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Quote:
Het gaat er niet om dat er niks verkeerd is aan de code, maar ik vroeg me af of het mogelijk is dat php tijdelijk geen contact maakt met de database en daarom geen waarde heeft. En dan 'niks + 20 = 20' gaat doen.
maar niks + 20 is toch ook gewoon 20?
nico schreef op 05.02.2007 17:46:
maar niks + 20 is toch ook gewoon 20?
Quote:
Het gaat er niet om dat er niks verkeerd is aan de code, maar ik vroeg me af of het mogelijk is dat php tijdelijk geen contact maakt met de database en daarom geen waarde heeft. En dan 'niks + 20 = 20' gaat doen.
maar niks + 20 is toch ook gewoon 20?
Lees even terug, het gaat er niet om dat die de berekening niet goed doet, maar als ik level 30 ben (bijvoorbeeld) en er is even geen verbinding met de database, dan kan het zijn dat hij met een lege $row['level'] gaat werken, en dan zou ik level=level+20 is -> level=niks+20 krijgen. Snap je? Dus dan wordt ik lvl 20 terwijl ik 30 was. en 50 zou moeten worden!
nico schreef op 05.02.2007 17:46:
maar niks + 20 is toch ook gewoon 20?
heel scherp ;) maar wat als er in de database nou 300 staat ...
Robert schreef op 05.02.2007 17:45:
Controleer gewoon of er wat gegevens zijn gevonden, zo ja dan kan je updaten, anders niet:
Meest simpele oplossing om zoiets in de toekomst te voorkomen.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
if(mysql_num_rows($query) != 1){
//query fout gegaan, geef melding en update niet
}
else{
// wel gegevens gevonden, update wel
}
?>
if(mysql_num_rows($query) != 1){
//query fout gegaan, geef melding en update niet
}
else{
// wel gegevens gevonden, update wel
}
?>
Meest simpele oplossing om zoiets in de toekomst te voorkomen.
Dit is een vrij irritante oplossing, omdat ik heel erg veel queries heb in totaal. (honderden, misschien wel duizend)
Maar het is dus mogelijk dat php gewoon verder gaat als hij niks kan vinden door een tijdelijke downtime van de database ofzo?
Kan het ook met or die(mysql_error())? of werkt dit alleen als de query fout is?
Dit is namelijk makkelijker toe te voegen met ctrl h
Gewijzigd op 01/01/1970 01:00:00 door Koen B
Het helpt je wel van je probleem af, waarom niet gebruiken? Van die 3 regels wordt je script niet "merkbaar" langzamer hoor :)
Of doet dat iets anders :o ik denk dat dit wel moet werken, maar ik wil het zeker weten ...
er kunnen altijd fouten onstaan in een query dus altijd or die erbij;)
koen schreef op 05.02.2007 20:08:
Ik het mogelijk met or die(mysql_error())?
Of doet dat iets anders :o ik denk dat dit wel moet werken, maar ik wil het zeker weten ...
Of doet dat iets anders :o ik denk dat dit wel moet werken, maar ik wil het zeker weten ...
Niet doen, gebruik een error_handler die de boel logt. Als een gebruiker een melding krijgt over tabellen of een username voor het inloggen naar je database die niet goed zijn, heeft die (mogelijke) hacker meer informatie, waardoor het gemakkelijker wordt.
Geef een melding dat er wat fout is gegaan, met een globale beschrijving Bijv: Er kon geen verbinding worden gemaakt met de database, of Er zijn geen records geselecteerd.
En gebruik beter trigger_error en dan wel in combinatie met wat ik zei, je mag er nooit vanuit gaan dat query's altijd maar goed worden uitgevoerd, dus eerst controleren voor je verder gaat!