Aantallen tellen in tabel

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

P Dekker

P Dekker

25/10/2021 18:21:30
Quote Anchor link
Hallo,

Ik heb al meerdere topics op dit forum over dit onderwerp gevonden en uiteraard uitgeprobeerd, maar ik kom er maar niet uit, ik krijg geen (goed) resultaat te zien.

Ik heb nu het volgende:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// Make a MySQL Connection
require_once 'locatievanmijnphpfile.php';

$sql = "SELECT COUNT(id) FROM modellen";
    
$result = mysql_query($sql) or die(mysql_error());

// Print out result
while($row = mysql_fetch_array($result)){
    echo "Er zijn ". $row['COUNT(id)'] ." items.";
    echo "<br />";
}

?>


Mijn tabelnaam is "modellen" en bevat de volgende velden:
`id`, `automerk`, `type`, `startnummer`, `racetype`, `raceklasse`, `racejaar`, `racedatum`, `circuit`, `team`, `resultaat_algemeen`, `resultaat_klasse`, `fabrikant`, `schaal`, `artikelnummer`, `opmerkingen`, `land_coureur_1`, `land_coureur_2`, `land_coureur_3`

Ik wil als eerste het aantal id's / rijen tellen. Daarna het aantal automerken en het aantal verschillende landen (dezelfde landen kunnen voorkomen in 3 kolommen.


Hoop dat jullie mij kunnen helpen, bij voorbaat al enorm bedankt.
 
PHP hulp

PHP hulp

28/03/2024 13:52:44
 
- Ariën  -
Beheerder

- Ariën -

25/10/2021 19:05:09
Quote Anchor link
Oeh, gebruik je nog de verouderde mysql_xxxxx() functies?
Dan moet je blijkbaar nog een flink verouderde PHP draaien. Momenteel zitten we bij 7.3, 7.4 en 8.0

Opzich zou jouw query gewoon moeten werken. Maar het probleem lijkt mij eerder dat je over zou moeten stappen op de functie-bibliotheek van MySQLi.

Ik neem aan dat automerken een eigen tabel heeft? Want een 'Audi' is mogelijk in je database wat anders dan een 'audi'. Een typfout en je aantal klopt niet meer.
Gewijzigd op 25/10/2021 19:08:13 door - Ariën -
 
Ozzie PHP

Ozzie PHP

25/10/2021 21:00:20
Quote Anchor link
Probeer dit eens:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

echo "Er zijn ". $row[0] ." items.";

?>


De mysql-functies zijn verouderd zoals Ariën al zei. Dat kun je beter dan ook niet meer gebruiken.
 
Ivo P

Ivo P

26/10/2021 02:06:43
Quote Anchor link
De query zou kunnen zijn
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
  IF(GROUPING(automerk), 'Alle merken', automerk) AS automerk,
  IF(GROUPING(land_coureur_1), 'Alle landen', land_coureur_1) AS land,
  COUNT(1) AS aantal
FROM modellen
GROUP BY automerk, land WITH ROLLUP


maar dan mis je de landen van coureur 2 en 3.
Sowieso is dan de vraag of een equipe met 3 coureurs uit NL of 3x NL telt, of 1x
En hoe tel je dan als er 2 Belgen en een Duitser in een wagen zitten?

Zie ook https://dev.mysql.com/doc/refman/8.0/en/group-by-modifiers.html
 
P Dekker

P Dekker

26/10/2021 09:59:27
Quote Anchor link
- Ariën - op 25/10/2021 19:05:09:
Oeh, gebruik je nog de verouderde mysql_xxxxx() functies?
Dan moet je blijkbaar nog een flink verouderde PHP draaien. Momenteel zitten we bij 7.3, 7.4 en 8.0

Nee ik zit niet bij oude php, maar wellicht heb ik "oude" php code van tips opgepikt. Ze waren namelijk wel wat ouder op het web.

Ik ga de tips eens uitproberen



Toevoeging op 26/10/2021 21:33:21:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = 'verbinding.php';

$result = mysqli_query($mysqli, "SELECT COUNT(id) FROM modellen");

/* Get the number of rows in the result set */
$row_cnt = mysqli_num_rows($result);

printf("Result set has %d rows.\n", $row_cnt);
?>



Heb nu bovenstaande code geprobeerd, maar de uitkomst blijft 0
Gewijzigd op 26/10/2021 21:34:09 door P Dekker
 
Adoptive Solution

Adoptive Solution

26/10/2021 22:54:02
Quote Anchor link
In regel 3 krijgt $mysqli de waarde verbinding.php.

Probeer dit eens :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$mysqli= mysqli_connect("localhost","my_user","my_password","my_db");


Hier het origineel :

https://www.w3schools.com/Php/func_mysqli_num_rows.asp
 
Ivo P

Ivo P

26/10/2021 22:57:46
Quote Anchor link
om de verrassing vast te verklaren: het antwoord is altijd "1".

Ook als er in de tabel modellen 100 records zitten, is je antwoord 1.
Ook als de tabel leeg is, is het antwoord 1.

Dat komt omdat je het aantal opvraagt, en dus krijg je 1 antwoord terug. Dat antwoord is 0, 1 of 100, maar het is nog steeds maar 1 antwoord.
En dus is mysqli_num_rows() hier niet zo interessant.
 
P Dekker

P Dekker

27/10/2021 09:09:31
Quote Anchor link
Wat is dan de truc om wel het juiste aantal te krijgen?
 
- Ariën  -
Beheerder

- Ariën -

27/10/2021 10:13:58
Quote Anchor link
De waarde van het record ophalen. Met een COUNT() query laat je SQL het aantal berekenen. En die geeft dat aan in een record. Probeer maar in phpMyAdmin.

Dus op zo'n query mysqli_num_rows() uitvoeren heeft geen nut, omdat je dan via PHP het aantal records telt. En.. hej... dat was dus 1.

Daarom moet je i.p.v mysqli_num_rows dus de waarde fetchen.

Beiden hebben dus een aparte werking waardoor je ze niet tegelijkertijd kan gebruiken.
Gewijzigd op 27/10/2021 10:16:42 door - Ariën -
 
Ozzie PHP

Ozzie PHP

27/10/2021 11:58:32
Quote Anchor link
P Dekker op 27/10/2021 09:09:31:
Wat is dan de truc om wel het juiste aantal te krijgen?

Had je mijn antwoord hierboven al getest?
 
Adoptive Solution

Adoptive Solution

27/10/2021 15:00:57
Quote Anchor link
Met behulp van deze database :

https://www.mysqltutorial.org/mysql-sample-database.aspx

En wat inspiratie hier :

https://mariadb.com/kb/en/select-with-rollup/

Krijg ik met deze query een overzicht van aantallen :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT
    CASE WHEN products.productLine IS NULL THEN 'Alle merken' ELSE products.productLine END AS Product,
    CASE WHEN products.productScale IS NULL THEN '---' ELSE products.productScale END AS Schaal,
    COUNT(1) AS Aantal
FROM products
GROUP BY
    products.productLine,
    products.productScale
WITH ROLLUP


Vervolgens :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
$db
= new mysqli('localhost','root','root','classicmodels');
$query = "SELECT
    CASE WHEN products.productLine IS NULL THEN 'Alle merken' ELSE products.productLine END AS Product,
    CASE WHEN products.productScale IS NULL THEN 'Totaal' ELSE products.productScale END AS Schaal,
    COUNT(1) AS Aantal
FROM
    products
GROUP BY
    products.productLine,
    products.productScale
WITH ROLLUP"
;

if ( $result = $db->query( $query ) )
{

    if ( $result->num_rows > 0 )
    {

    ?>

<table border="1">
    <thead>
        <tr>
            <th>Product</th>
            <th>Schaal</th>
            <th>Aantal</th>
        </tr>
    <thead>
    <tbody>
            <?php
            while ( $row = $result->fetch_object() )
            {

                ?>

                <tr>
                <td><?php echo $row->Product; ?></td>
                <td><?php echo $row->Schaal; ?></td>
                <td><?php echo $row->Aantal; ?></td>
                </tr>
                <?php
                if ($row->Schaal == 'Totaal') {
                    ?>

                    <tr>
                        <td colspan="3"></td>
                    </tr>
                    <?php
                }
            }

            ?>

    </tbody>
</table>
<?php
    }
}

?>
Gewijzigd op 27/10/2021 15:01:52 door Adoptive Solution
 
P Dekker

P Dekker

27/10/2021 17:32:39
Quote Anchor link
Ah bedankt voor de tips, die ga ik eens vertalen naar mijn eigen kolomnamen en wat verder uitzoeken.
Ik heb nu in elk geval een deel wat werkt om het aantal rijen te tellen en die een uitkomst laat zien:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$con
=mysqli_connect($servername,$username,$password,$dbname);

$sql="SELECT COUNT(id) AS total FROM modellen";
    $result=mysqli_query($con,$sql);
    $values=mysqli_fetch_assoc($result);
    $num_rows=$values['total'];
    echo $num_rows

?>
 
Ivo P

Ivo P

01/11/2021 14:45:31
Quote Anchor link
in het kader van logische namen voor variabelen: num_rows suggereert dat in deze variabel het aantal rijen is te vinden.

Het gaat echter om het aantal modellen....
 
Jan R

Jan R

02/11/2021 07:40:17
Quote Anchor link
Een test of je query gelukt is is ook niet overbodig
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if(!$result)


Zelfde ook voor je database. Mogelijks is er ergens een (tijdelijke) onderbreking en dan wil je toch je gebruiker waarschuwen
Gewijzigd op 02/11/2021 10:38:29 door Jan R
 
Ivo P

Ivo P

02/11/2021 10:03:23
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if($con=mysqli_connect($servername,$username,$password,$dbname)) {

  $sql="SELECT COUNT(id) AS total FROM modellen";
  if($result=mysqli_query($con,$sql)) {
    $values=mysqli_fetch_assoc($result);
    $num_models=$values['total'];
    echo 'aantal modellen: ' . $num_models;
   }

   else {
     echo 'de query is mislukt';
   }
}

else {
  echo 'Het verbinden met de db is mislukt';
}

?>


Toevoeging op 03/11/2021 09:49:55:

NB: in je productie-omgeving zorg je dat je dit soort foutmeldingen niet aan de gebruikers toont.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.