google-code-backups / threesixtieweb

Automatically exported from code.google.com/p/threesixtieweb
0 stars 0 forks source link

MySQLQuery #7

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
Er gebeurt iets vreemd tijdens het ophalen van data uit de database, maar ik 
weet niet hoe het komt.

Ik probeer deze query uit te voeren:
{{{ SELECT ID, Reviewee, Score FROM candidate_poll WHERE Reviewer=$reviewer AND 
Ok_reviewee=1 ORDER BY Score DESC LIMIT 5 }}}

Maar als ik deze query uitvoer in php geeft hij altyd error voor $reviewer= 1, 
$reviewer = 2 en soms nog 1 willekeurige andere gebruiker.

Het vreemde is dat als ik deze query dan uitvoer voor die specifieke gebruiker 
in de MySQL UI, hij wel de juiste resultaat genereert, maar als ik het in php 
uitvoer, krijg ik een error.
In bijlage vindt u een screenshot van de error die wordt gegenereerd en de 
queries uitgevoerd in de mysql UI (dus de resultaten dat hij zou moeten 
genereren). Het probleem is dat php denk dat er voor deze gebruikers de query 
een lege array terugstuurt (maar deze is niet leeg
Dit is de volledig code in php:
{{{
best_polls_reviewee_reviewer = get_best_polls_reviewee_reviewer($user['ID']);
foreach ($best_polls_reviewee_reviewer as $poll) {
    $id = $poll['ID'];
    mysql_query("UPDATE candidate_poll SET Ok_overall=1 WHERE ID = $id");
}

function get_best_polls_reviewee_reviewer($reviewer){ // Selecteer maximaal 5 
polls voor elke reviewer, waarbij de polls komen uit de verzameling van 5 beste 
polls voor een reviewee
    $query = mysql_query("SELECT ID, Reviewee, Score FROM candidate_poll WHERE Reviewer=$reviewer AND Ok_reviewee=1 ORDER BY Score DESC LIMIT 5");
    if(!$query || mysql_num_rows($query) <=0) {
        echo mysql_error();
        return false;
    }else{
        while ($row = mysql_fetch_assoc($query)) {
            $polls[] = array(
                'ID' => $row['ID'],
                'Reviewee' => $row['Reviewee'],
                'Score' => $row['Score']
            );
        }
        return $polls;
    }
}

}}}

Original issue reported on code.google.com by wens.ced...@gmail.com on 16 Aug 2014 at 4:48

Attachments:

GoogleCodeExporter commented 8 years ago
Op de '{{{' en '}}}' moet je niet letten. Ik dacht dat deze ervoor zouden 
zorgen dat de code hier mooier weergegeven zou worden, maar dit is dus 
blijkbaar niet het geval.

Original comment by wens.ced...@gmail.com on 16 Aug 2014 at 4:49

GoogleCodeExporter commented 8 years ago
Hier is een screenshot van de code, zo is het misschien iets beter te lezen.

Original comment by wens.ced...@gmail.com on 17 Aug 2014 at 8:23

Attachments:

GoogleCodeExporter commented 8 years ago
Cedric,
Probeer brute force debugging toe te voegen.
Laat het update statement afdrukken naar scherm (na substitutie van de 
variabelen)
en kijk of het telkens goed gaat, en er netjes 5 verschillende statements zijn.
Vervolgens kijk de syntax van FOREACH na op lijn 171.
Het lijkt erop dat je code niet omkan met alle mogelijke returns uit de query 
(leeg / etc).
Dit is een quick analyse zonder veel tryout :-)

Original comment by leander....@gmail.com on 18 Aug 2014 at 7:25

GoogleCodeExporter commented 8 years ago
Ik heb het geprobeerd, en alle queries werden juist afgedrukt. Dus daar zit het 
probleem niet; Maar ik heb nog eens iets anders geprobeerd, en dit gaf een 
vreemder resultaat: Ik heb de query niet meer laten uitvoeren in functie van de 
reviewer, maar altyd voor reviewer 1. En hier kreeg ik hetzelfde resultaat als 
de vorige keer: de eerste 2 queries geven een error en een random 3de. Maar 
voor de rest werken al de andere queries wel (hoewel het identiek dezelfde 
queries zijn, voor identiek dezelfde waarden.

"SELECT ID, Reviewee, Score FROM candidate_poll WHERE Ok_reviewee=1 AND 
Reviewer=1 ORDER BY Score DESC LIMIT 5"

Original comment by wens.ced...@gmail.com on 18 Aug 2014 at 12:06

Attachments:

GoogleCodeExporter commented 8 years ago
Het gaat toch vooral ook om de warning ...
http://stackoverflow.com/questions/2630013/invalid-argument-supplied-for-foreach

Als je php bijstand nodig hebt kan je zowel Johan als Kristof (naast jou) snel 
even laten meekijken.
De code die ik snel vond is er eentje om de warning te laten verdwijnen,
maar is het nog steeds zo dat je onverwacht resultaat terugkrijgt uit de 
databank,
ie zijn er queries die geen rijen opleveren, terwijl je dat wel verwacht?

Het punt van de brute force debug is ook dat je ze eventueel allemaal uitvoert, 
desnoods met een count er omheen zodat je snel ziet dat er geen lege resultsets 
zijn, thans toch niet waar je dat niet verwacht.

Je kan:
select count(1) from (select...gegenereerde-query1)
union all
select count(1) from (select...gegenereerde-query2)
union all
union all
select count(1) from (select...gegenereerde-query3)
union all
...

en dit in een script (command line ) uitvoeren via mysql.
Het connect commando heb je wel ergens nog staan  hier in de wiki:
https://code.google.com/p/threesixtieweb/wiki/MySQLCommandLine

Zelf heb ik in tussentijd nog geen tijd gevonden om jouw code te debuggen.

Original comment by leander....@gmail.com on 18 Aug 2014 at 10:43

GoogleCodeExporter commented 8 years ago
We (=Johan) hebben het probleem kunnen oplossen door de foreach($users as 
$user) die boven het stuk code stond, te laten stoppen, en dan voor dit stuk 
code een nieuwe foreach te laten beginnen. Hierdoor verdween het probleem en 
verkregen we hetzelfde resultaat.

Original comment by wens.ced...@gmail.com on 19 Aug 2014 at 3:24