PDO Rowcount check
Ik heb even een vraag. Ik gebruik nu sinds enige tijd PDO voor het ophalen van gegevens uit database, alleen nu heb ik het volgende probleem, bij deze code:
functions.php
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
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
<?PHP
public function addPetition($name,$email,$club,$date,$ip,$mobile = 0)
{
$query = "INSERT INTO db_petitie (petitie_id, petitie_name, petitie_email, petitie_club, petitie_hash, petitie_status, petitie_date, petitie_mobile, petitie_ip) VALUES (DEFAULT,:name,:emailadres,:club,:hash,0,:date, :mobile, :ip)";
if(empty($_GET['admin'])) { if(!empty($_COOKIE['PetitionCookie']))
throw new InvalidPetitionException ('U heeft dit formulier onlangs ingevuld.'); }
if(strlen(trim($name)) < 3)
throw new InvalidPetitionException ('Uw naam moet 3 tekens of meer bevatten.');
if (!preg_match("/^[a-zA-Z ]*$/",$name))
throw new InvalidPetitionException ('Uw naam heeft niet het juiste formaat.');
if(strlen(trim(empty($club))))
throw new InvalidPetitionException ('U heeft geen club geselecteerd.');
if(strlen(trim($email)) < 6)
throw new InvalidPetitionException ('E-mailadres moet 6 tekens of meer bevatten.');
if(isValidEmail($email) != 'goed')
throw new InvalidPetitionException ('E-mailadres heeft een onjuist formaat.');
$hash = md5($name.$email.$club.$date.$ip);
$stmt = $this->db->prepare($query);
$stmt->bindValue(':name', (string)ucwords(strtolower($name)));
$stmt->bindValue(':emailadres', (string)$email);
$stmt->bindValue(':club', (string)$club);
$stmt->bindValue(':mobile', (int)$mobile);
$stmt->bindValue(':hash', (string)$hash);
$stmt->bindValue(':date', (string)$date);
$stmt->bindValue(':ip', (string)$ip);
$stmt->execute(); ?>
public function addPetition($name,$email,$club,$date,$ip,$mobile = 0)
{
$query = "INSERT INTO db_petitie (petitie_id, petitie_name, petitie_email, petitie_club, petitie_hash, petitie_status, petitie_date, petitie_mobile, petitie_ip) VALUES (DEFAULT,:name,:emailadres,:club,:hash,0,:date, :mobile, :ip)";
if(empty($_GET['admin'])) { if(!empty($_COOKIE['PetitionCookie']))
throw new InvalidPetitionException ('U heeft dit formulier onlangs ingevuld.'); }
if(strlen(trim($name)) < 3)
throw new InvalidPetitionException ('Uw naam moet 3 tekens of meer bevatten.');
if (!preg_match("/^[a-zA-Z ]*$/",$name))
throw new InvalidPetitionException ('Uw naam heeft niet het juiste formaat.');
if(strlen(trim(empty($club))))
throw new InvalidPetitionException ('U heeft geen club geselecteerd.');
if(strlen(trim($email)) < 6)
throw new InvalidPetitionException ('E-mailadres moet 6 tekens of meer bevatten.');
if(isValidEmail($email) != 'goed')
throw new InvalidPetitionException ('E-mailadres heeft een onjuist formaat.');
$hash = md5($name.$email.$club.$date.$ip);
$stmt = $this->db->prepare($query);
$stmt->bindValue(':name', (string)ucwords(strtolower($name)));
$stmt->bindValue(':emailadres', (string)$email);
$stmt->bindValue(':club', (string)$club);
$stmt->bindValue(':mobile', (int)$mobile);
$stmt->bindValue(':hash', (string)$hash);
$stmt->bindValue(':date', (string)$date);
$stmt->bindValue(':ip', (string)$ip);
$stmt->execute(); ?>
pagina.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
try
{
$petition = new PetitionController($db);
$overall = $petition->getPetition('petitie_club, COUNT(*) as aantal','WHERE petitie_status=1','GROUP BY petitie_club','ORDER BY aantal DESC, petitie_club ASC','LIMIT 0,50');
foreach($overall as $rowOverall)
{
echo "<tr class='statsContent'>";
echo "<td>".$rowOverall['petitie_club']."</td><td>".number_format($rowOverall['aantal'],0,",",".")."</td>";
echo "</tr>";
}
}
catch(Exception $e)
{
$error = $e->getMessage();
}
?>
try
{
$petition = new PetitionController($db);
$overall = $petition->getPetition('petitie_club, COUNT(*) as aantal','WHERE petitie_status=1','GROUP BY petitie_club','ORDER BY aantal DESC, petitie_club ASC','LIMIT 0,50');
foreach($overall as $rowOverall)
{
echo "<tr class='statsContent'>";
echo "<td>".$rowOverall['petitie_club']."</td><td>".number_format($rowOverall['aantal'],0,",",".")."</td>";
echo "</tr>";
}
}
catch(Exception $e)
{
$error = $e->getMessage();
}
?>
Nu kan het zijn dat de query een aantal van 0, 1 of meer dan 1 geeft. Bij aantallen meer dan 1, gaat de foreach lus goed. Echter, bij een aantal van 0 (toon "geen resultaten") of 1 (fetch ipv fetchall?) moet er wat anders gebeuren. Hoe bouw ik dat hier in? Ik kom er niet meer uit.
Als dat zo is, kan je count($overall) gebruiken om in te zien hoeveel "rows" er geprint moeten gaan worden en alleen de foreach lus uitvoert als deze groter is dan #.
Zelf ben ik wel eens tegen de muur aangelopen met SELECT niet kan bekijken met "rowCount" aangezien dit alleen werkt op: DELETE, INSERT en UPDATE, affected_rows() met een nieuwe naam >.>
Gewijzigd op 29/08/2015 01:00:10 door Johan K
Verder zou ik de validatie en de query niet in één functie stoppen.
En getPetition zou je ook zo kunnen maken dat deze altijd een array teruggeeft (desnoods een lege) of een exception gooit.
@ Frank, graag zou ik voor je laatste optie kiezen, maar hoe regel ik dit in?
Johan K op 29/08/2015 00:51:18:
Ik zie niet echt wat petitioncontroller doet, maar ik neem aan dat "$petition->getPetition()" een fetchAll op je tabel doet?
Als dat zo is, kan je count($overall) gebruiken om in te zien hoeveel "rows" er geprint moeten gaan worden en alleen de foreach lus uitvoert als deze groter is dan #.
Zelf ben ik wel eens tegen de muur aangelopen met SELECT niet kan bekijken met "rowCount" aangezien dit alleen werkt op: DELETE, INSERT en UPDATE, affected_rows() met een nieuwe naam >.>
Als dat zo is, kan je count($overall) gebruiken om in te zien hoeveel "rows" er geprint moeten gaan worden en alleen de foreach lus uitvoert als deze groter is dan #.
Zelf ben ik wel eens tegen de muur aangelopen met SELECT niet kan bekijken met "rowCount" aangezien dit alleen werkt op: DELETE, INSERT en UPDATE, affected_rows() met een nieuwe naam >.>
Wat Johan zegt, hoe ziet getPetition() eruit? Misschien haal je per ongeluk al 1 resultaat op ofzo? Je zou prima door een array met 1 element heen moeten kunnen loopen?
@Johan je kunt rowCount() gebruiken voor "num_rows" functionaliteit als je in je DSN de instelling PDO::MYSQL_ATTR_USE_BUFFERED_QUERY op true zet. De waarde van de instelling PDO::MYSQL_ATTR_FOUND_ROWS (die eigenlijk voor deze functionaliteit bedoeld is) lijkt niet uit te maken. Blijkbaar heb je impliciet ondersteuning voor "num_rows" als gebufferde queries aan staan, wat op zich wel logisch is.
Ik heb wel het idee dat de default waarden van dit soort instellingen per PHP versie nogal verschillen, dus je zult even moeten kijken wat voor jouw versie werkt, YMMV (Your Mileage May Vary).
Gewijzigd op 29/08/2015 14:59:43 door Thomas van den Heuvel
Roeltje M op 29/08/2015 14:34:49:
Ozzie PHP, bedankt voor deze optie.
@ Frank, graag zou ik voor je laatste optie kiezen, maar hoe regel ik dit in?
@ Frank, graag zou ik voor je laatste optie kiezen, maar hoe regel ik dit in?
// zoiets? (niet getest)
Thanks, fetchAll() werkt dus ook wanneer er maar 1 resultaat is? Dat wist ik niet, vandaar!
Zelfs als er geen resultaten gevonden zijn. Je krijgt dan een lege array terug.
Gelukt, bedankt!