2
votes

SELECT COUNT (*) renvoie un objet au lieu d'un entier

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 commentaires

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.


4 Réponses :


3
votes

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'];


0 commentaires

0
votes

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'];


3 commentaires

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. :-)



0
votes
$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

0 commentaires

1
votes

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;


0 commentaires