J'ai une table de base de données timestamps_sessions
contenant les horodatages du moment où un utilisateur commence un exercice sur ma page Web, et qui n'est mise à jour que lorsque l'utilisateur le termine. Par conséquent, chaque ligne a toujours une valeur dans la colonne started
, mais pas toujours dans la colonne done
. Ce dernier est NULL
par défaut.
Mon instruction SELECT COUNT ()
fonctionne parfaitement lorsque je l'interroge dans Sequel Pro, et renvoie l'entier correct de 11. C'est-à-dire à dire: il n'y a en effet que onze lignes qui ont des valeurs à la fois dans started
et finished
.
Pourtant, quand je l'exécute en PHP, il renvoie un objet contenant
$sql = "SELECT COUNT(finished) FROM timestamps_sessions"; $result = $conn->query($sql); $exercise['clears'] = $result;
L'instruction que j'ai interrogée avec succès dans Sequel Pro est la suivante:
SELECT COUNT(finished) FROM timestamps_sessions
L'instruction que j'utilise sans succès dans PHP est le suivant:
{ current_field: null, field_count: null, lengths: null, num_rows: null, type: null }
Il y a plusieurs autres requêtes SELECT
exécutées sur la même base de données et la même table sans problème. Seule l'instruction COUNT ()
semble ne pas fonctionner correctement.
Qu'est-ce que je fais mal, et comment dois-je le faire à la place?
Mon objectif consiste à compter le nombre de lignes avec une colonne finish
non vide, sans passer les données réelles afin de préserver la bande passante. Tout ce dont j'ai besoin est l'entier.
4 Réponses :
Tout d'abord, $ result
est un objet comme prévu. C'est le résultat renvoyé par la méthode mysqli :: query ()
. Avant de pouvoir accéder aux données de cette requête, vous devez les récupérer. Ce sera plus facile si vous donnez un alias au décompte, car il deviendra plus facile d'accéder au décompte.
$sql = "SELECT COUNT(finished) as cnt FROM timestamps_sessions"; $result = $conn->query($sql); $row = $result->fetch_assoc(); $exercise['clears'] = $row['cnt'];
il vous manque le code mysql_fetch_array
pour récupérer le premier enregistrement
$sql = "SELECT COUNT(finished) totals FROM timestamps_sessions"; $result = $conn->query($sql); $row = $result->fetch_assoc(); $total = $row['totals'];
Vous ne pouvez pas mélanger les bibliothèques MySQL et MySQLi.
oui je l'ai réparé désolé
De plus, lors de l'utilisation de l'interface orientée objet, fetch_assoc ()
est une méthode appelée sur l'objet sans aucun paramètre. :-)
$sql = "SELECT COUNT(finished) AS count_finished FROM timestamps_sessions"; $result = $conn->query($sql); $row = $result->fetch_assoc(); echo $exercise['clears'] = $row['count_finished']; Give the count an alias like count_finished. Then from the result object you need to fetch the row. The row has your data in it.Take a look at this https://www.w3schools.com/php/php_mysql_select.asp
L'argument passé à la fonction count peut être n'importe quoi, car vous voulez juste le nombre de lignes, pas leurs données.
SELECT COUNT(1) FROM timestamps_sessions WHERE finished IS NOT NULL;
Qu'est-ce que
$ conn
?Utilisez un alias comme
total
dans la clause SELECT et accédez à l'élément['total']
de la première ligne.Si
$ conn
est un objet PDO, voir stackoverflow.com/questions/883365/ nombre de lignes avec pdo@ MartinHeralecký C'est un objet MySQLi, comme vous pouvez le voir dans les propriétés de l'objet fourni dans la question -
num_rows
est une propriété de résultat MySQLi.