WHERE clausule probleem
Ik ben bezig met een multi-poll systeem te maken, maar een WHERE clausule, die het aantal stemmen op een bepaalde keuze zou moeten tellen, geeft altijd maar 1 record terug, terwijl er toch meerdere zijn.
Hier is het stukje code:
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
$sql_get_voted = "SELECT * FROM poll_votes WHERE poll_id = ".$voted_ids[$i]." AND vote_number = ".$poll_choices['id'];;
$sql_get_total_voted = "SELECT * FROM poll_votes WHERE poll_id = ".$voted_ids[$i];
if($query_count = mysql_query($sql_get_voted) && $query_total = mysql_query($sql_get_total_voted))
{
//dit is de regel waar het om gaat:
$count = mysql_num_rows($query_count);
$total = mysql_num_rows($query_total);
$percent = $count/$total;
echo $poll_choices['poll_choice'];
?>
$sql_get_total_voted = "SELECT * FROM poll_votes WHERE poll_id = ".$voted_ids[$i];
if($query_count = mysql_query($sql_get_voted) && $query_total = mysql_query($sql_get_total_voted))
{
//dit is de regel waar het om gaat:
$count = mysql_num_rows($query_count);
$total = mysql_num_rows($query_total);
$percent = $count/$total;
echo $poll_choices['poll_choice'];
?>
<div class="count_bar" style="width: px">
%
</div>
Ik krijg bij de code hierboven op de regel die ik heb aangegeven een foutmelding, dat $query_count geen geldige "result resource" is.
Toed had ik i.p.v een variabele te gebruiken, mysql_query() in mysql_num_rows() gezet, zoals hieronder te zien is
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
$sql_get_voted = "SELECT * FROM poll_votes WHERE poll_id = ".$voted_ids[$i]." AND vote_number = ".$poll_choices['id'];;
$sql_get_total_voted = "SELECT * FROM poll_votes WHERE poll_id = ".$voted_ids[$i];
//de regel waar het om gaat is de eerste test in de if: "$count ..."
if($count = mysql_num_rows(mysql_query($sql_get_voted)) && $total = mysql_num_rows(mysql_query($sql_get_total_voted)))
{
$percent = $count/$total;
echo $poll_choices['poll_choice'];
?>
$sql_get_total_voted = "SELECT * FROM poll_votes WHERE poll_id = ".$voted_ids[$i];
//de regel waar het om gaat is de eerste test in de if: "$count ..."
if($count = mysql_num_rows(mysql_query($sql_get_voted)) && $total = mysql_num_rows(mysql_query($sql_get_total_voted)))
{
$percent = $count/$total;
echo $poll_choices['poll_choice'];
?>
<div class="count_bar" style="width: px">
%
</div>
Met de code hierboven krijg ik niet de foutmelding over de "result resource", maar mysql_num_rows() geeft altijd maar 1 record terug, terwijl er toch meerdere records (stemmen) op 1 keuze zijn.
ziet iemand wat ik fout doe?
Gewijzigd op 01/01/1970 01:00:00 door Maarten Slenter
Verder controleer je nergens of je queries wel gelukt zijn. Als dat namelijk niet het geval is, zal de foutmelding die jij nu krijgt het logische gevolg zijn. Ga dat dus ook eerst eens controleren.
en ik ben niet echt zo begaafd met MYSQL, dus zeg me dan hoe dat moet alstjeblieft.
Maarten schreef op 22.03.2008 09:27:
Tja, ze staan in een if. Maar als er iets fout gaat weet je ten eerste niet in welke query er iets fout gaat en bovendien niet wat er dan fout gaat. En dat zijn nu juist dingen die je wel wilt weten...hoezo doe ik dat nergens, ze staan in een if, lijkt mij controle:S
Het tellen van het aantal votes voor een bepaalde poll kun je eenvoudig op deze manier doen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$sQuery = "
SELECT
COUNT(*) AS aantal
FROM
poll_votes
WHERE
poll_id = ".$voted_ids[$i];
if(!$rResult = mysql_query($sQuery))
{
trigger_error(mysql_error().'<br />In query: '.$sQuery);
}
else
{
$aRow = mysql_fetch_assoc($rResult);
echo $aRow['aantal'];
}
?>
$sQuery = "
SELECT
COUNT(*) AS aantal
FROM
poll_votes
WHERE
poll_id = ".$voted_ids[$i];
if(!$rResult = mysql_query($sQuery))
{
trigger_error(mysql_error().'<br />In query: '.$sQuery);
}
else
{
$aRow = mysql_fetch_assoc($rResult);
echo $aRow['aantal'];
}
?>
Als je de query een beetje handig opstelt, zal het waarschijnlijk wel mogelijk zijn om zelfs het gemiddelde al direct met die query uit de database te halen. Dan komt er dus helemaal geen PHP meer aan te pas om dat uit te rekenen.
Ik heb de query wel iets veranderd:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
$sql_get_voted = "SELECT COUNT(id) AS aantal FROM poll_votes
WHERE vote_number = ".$poll_choices['id'];
//query ingevuld, gekopieerd uit echo:
$sql_get_voted = "SELECT COUNT(id) AS aantal FROM poll_votes
WHERE vote_number = 2";
WHERE vote_number = ".$poll_choices['id'];
//query ingevuld, gekopieerd uit echo:
$sql_get_voted = "SELECT COUNT(id) AS aantal FROM poll_votes
WHERE vote_number = 2";
ik heb eens even rondgezocht en nu ben ik er zeker van dat het bij deze query fout gaat.
Als ik deze query uitvoer krijg ik (in php) een foutmelding over de "result resource".
Als ik deze query echter uitvoer in de database (phpMyAdmin -> SQL), geeft hij gewoon de rijen terug (of in dit geval het aantal).
Weet iemand waarom deze query het niet zou doen in php, ik snap er echt niets van
Laat eens zien hoe je de query uitvoert. Heb je daar net als in mijn voorbeeld een degelijke foutafhandeling bij toegepast?
Hoe denk jij in hemelsnaam dit soort regels code te kunnen debuggen? Jij smeekt op je blootjes knietjes om de grootste en meest onduidelijke problemen waar je geen touw aan vast kunt knopen. Die heb je nu dan ook gekregen, wat is dan nog het probleem?
Zie het voorbeeld van Blanche hoe je wél overzichtelijk kunt schrijven.
Ps. Dit heeft niks met SQL te maken, maar alles met ongeorganiseerd werken.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
if($query_count = mysql_query($sql_get_voted) && $query_total = mysql_query($sql_get_total_voted))
{
//rest van de code
}
else
{
echo 'Er is een fout opgetreden enz';
}
{
//rest van de code
}
else
{
echo 'Er is een fout opgetreden enz';
}
EDIT: @frank: ik heb de 2 even apart gezet en gekeken welke er fout ging?
hoe moet ik ze anders apart gaan zetten, een variabele aanmaken en die op true zetten als hij door moet?
Gewijzigd op 01/01/1970 01:00:00 door Maarten Slenter
Als je de tweede query pas uit wilt voeren als de eerste geslaagd is, kun je dat prima doen in het else statement van de eerste query...
Spagetti ligt in een onmogelijke knoop op je bord, met code wil je dat absoluut niet hebben. Ga logisch en zorgvuldig de diverse stappen uitvoeren, dan gaat het een heel stuk beter.
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
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
$sql_get_voted = "SELECT COUNT(id) AS aantal
FROM poll_votes
WHERE vote_number = ".$poll_choices['id'];
$sql_get_total_voted = "SELECT COUNT(id) AS aantal
FROM poll_votes
WHERE poll_id = ".$voted_ids[$i];
if($query_count = mysql_query($sql_get_voted))
{
if($query_total = mysql_query($sql_get_total_voted))
{
echo $sql_get_voted.'<br />'.$sql_get_total_voted.'<br />';
$result_count = mysql_fetch_array($query_count);
$result_total = mysql_fetch_array($query_total);
$percent = $result_count['aantal']/$result_total['aantal'];
echo $poll_choices['poll_choice'];
?>
<div class="count_bar" style="width: <?= $percent*100 ?>px">
<?= round($percent*100) ?>%
</div>
<?php
}
else
{
echo '<span class="error">Er is een fout opgetreden met het tellen van het totaal aantal stemmen. Excuses voor het ongemak </span>';
}
}
else
{
echo '<span class="error">Er is een fout opgetreden met het tellen van het aantal stemmen. Excuses voor het ongemak</span>';
}
?>
$sql_get_voted = "SELECT COUNT(id) AS aantal
FROM poll_votes
WHERE vote_number = ".$poll_choices['id'];
$sql_get_total_voted = "SELECT COUNT(id) AS aantal
FROM poll_votes
WHERE poll_id = ".$voted_ids[$i];
if($query_count = mysql_query($sql_get_voted))
{
if($query_total = mysql_query($sql_get_total_voted))
{
echo $sql_get_voted.'<br />'.$sql_get_total_voted.'<br />';
$result_count = mysql_fetch_array($query_count);
$result_total = mysql_fetch_array($query_total);
$percent = $result_count['aantal']/$result_total['aantal'];
echo $poll_choices['poll_choice'];
?>
<div class="count_bar" style="width: <?= $percent*100 ?>px">
<?= round($percent*100) ?>%
</div>
<?php
}
else
{
echo '<span class="error">Er is een fout opgetreden met het tellen van het totaal aantal stemmen. Excuses voor het ongemak </span>';
}
}
else
{
echo '<span class="error">Er is een fout opgetreden met het tellen van het aantal stemmen. Excuses voor het ongemak</span>';
}
?>
dit is dan alles, met aparte error afhandeling.
helpt dit?
Gewijzigd op 01/01/1970 01:00:00 door Maarten Slenter
Pas dus die foutafhandeling toe en echo de SQL foutmelding (te achterhalen met mysql_error()) als blijkt dat de query niet gelukt is. Daar heb je veel meer aan en pas dan kun je verder debuggen...
Quote:
Sterker nog, mysql_num_rows() geeft helemaal geen records terug! Het vertelt je hoeveel records er in de resultset staan. Met deze resultset doe jij overigens niets, maar dat is al vaker gezegd, zie je vorige topic over dit zelfde onderwerp.maar mysql_num_rows() geeft altijd maar 1 record terug, terwijl er toch meerdere records (stemmen) op 1 keuze zijn.
het gaat mij ook helemaal niet om de mysql_query, maar om die mysql_num_rows die het niet doet (dat staat toch echt in de eerste post)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$sQuery = "
SELECT
COUNT(*) AS aantal
FROM
poll_votes
WHERE
poll_id = '".$voted_ids[$i]."'";
if(!$rResult = mysql_query($sQuery))
{
trigger_error(mysql_error().'<br />In query: '.$sQuery);
}
else
{
$aRow = mysql_fetch_assoc($rResult);
echo $aRow['aantal'];
}
?>
$sQuery = "
SELECT
COUNT(*) AS aantal
FROM
poll_votes
WHERE
poll_id = '".$voted_ids[$i]."'";
if(!$rResult = mysql_query($sQuery))
{
trigger_error(mysql_error().'<br />In query: '.$sQuery);
}
else
{
$aRow = mysql_fetch_assoc($rResult);
echo $aRow['aantal'];
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Jesper Diovo
bedankt in ieder geval!
Quote:
Er is een fout opgetreden...
Dan zijn de betere foutmeldingen! Heb je toch minstens 10x niks aan wanneer je moet debuggen. Wat is er mis met mysql_error() ? Tijdens bouwen, testen en debuggen is deze onmisbaar. Wanneer dit mist in jouw code, weet je dat je fout bezig bent.
Maarten schreef op 22.03.2008 11:18:
Getallen hoef je inderdaad niet tussen quotes te zetten, maar onthou wel dat één en twee geen getallen zijn. 1 en 2 zijn echter wel weer getallen, integers om precies te zijn.ok, fijne mysql tutorial die ik had, hij zei dat getallen niet tussen quotes hoefde, maar nu werkt hij wel...
bedankt in ieder geval!
bedankt in ieder geval!
Echo de query eens, hoe ziet jouw query er nu uit?
Edit: Dat had ook in 1 reactie gekund...
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Als hij nu met quotes wél werkt, vraag ik me af welk veldtype poll_id is?
Quote:
Onzin! Integers hoef je nog steeds niet tussen quotes te plaatsen in SQL! Dit is gewoon een prima query:Values moeten altijd aangegeven worden als values. Er moeten dus altijd enkele/dubbele quotes omheen. Als die quotes er niet staan, denkt SQL dat de value een veld is, en gaat op zoek naar dit veld - wat hoogstwaarschijnlijk niet bestaat.
Dat het gebruik van quotes wel mag rond integers is iets anders, maar het is zeker niet verplicht! Strings daarentegen zijn natuurlijk wel weer een ander verhaal, daar zijn (net als in PHP) de enkele quotes verplicht...
het velt type van poll_id en van vote_number is allebei int(11), dat moet het toch zijn?