Próbuję utworzyć stronę, na której mogę uzyskać wartości rekordów bazy danych. Moje zapytanie jest takie:

Więc muszę uzyskać liczbę wartości 1 na status (jako liczba) z tabeli przykład, jeśli istnieją i je policzyć, jeśli nie istnieją, muszę uzyskać z tego wartość jako 0. Aby uzyskać wartości, używam tego kodu i działa świetnie, ale nie wydaje mi się, aby wartość zwracała 0 w moim kodzie PHP, jeśli nie znaleziono wyników. Jestem trochę zagubiony.

$user = $_SESSION["user"];
$systems = mysqli_connect("localhost", "root", "", "testdatabase");
$query = "SELECT SUM(count) AS value_sum FROM tableexample WHERE user = '$user' AND status = '1'";
$request = mysqli_query($systems, $query);
if (mysqli_num_rows($request) > 0) {
    while ($row = mysqli_fetch_array($request)) {
        echo '' . $row["value_sum"] . '';
    }
} else {
    echo '0';
}

Więc ten kod pobiera wartości bez żadnego problemu, ale kiedy umieszczam „else”, powinien dać mi wartość 0, ale nic mi nie daje.

Masz jakiś pomysł, jak mogę rozwiązać ten problem, nie zmieniając do tej pory kodu?

-1
Pedro Carvalho 2 kwiecień 2020, 12:34

3 odpowiedzi

Najlepsza odpowiedź

Użycie PDO wyglądałoby następująco:

$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";

$pdo = new PDO($dsn, "username", "password", [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);

$stmt = $pdo->prepare('
    SELECT SUM(count)
    FROM `table_example` 
    WHERE `user` = :user 
    AND `status` = "1"'
);

$stmt->bindParam(':user', $_SESSION["user"], PDO::PARAM_STR);
$stmt->execute();
$sum = $stmt->fetchColumn();
echo $sum;

Nie musisz pisać żadnej pętli ani poprzedniego sprawdzenia, aby uzyskać wartość SUMA.

3
Chemaclass 6 kwiecień 2020, 10:50

Wykonujesz zapytanie SUM, które zawsze będzie miało wiersz wynikowy.

SELECT SUM(count) AS value_sum FROM tableexample WHERE user = '$user' AND status = '1'

Możesz sprawdzić SUM(count) = 0, gdzie możesz to zrobić w pętli while

while ($row = mysqli_fetch_array($request)) {
    if (!empty($row[0])) {
        echo $row[0]; // sum not 0
    } else {
        echo '0';
    }
}
1
Gihan 2 kwiecień 2020, 10:24

Używasz mysqli_fetch_array, który zwraca tablicę z zarówno indeksami numerycznymi, jak i asocjacyjnymi zamiast tylko tablicy asocjacyjnej. Powinieneś użyć mysqli_fetch_assoc lub mysqli_fetch_array z drugim parametrem resulttype, jak wspomniano w dokumentach.

resulttype Ten opcjonalny parametr jest stałą wskazującą, jaki typ tablicy powinien zostać utworzony na podstawie danych bieżącego wiersza. Plik możliwymi wartościami tego parametru są stałe MYSQLI_ASSOC, MYSQLI_NUM lub MYSQLI_BOTH.

Dzięki zastosowaniu stałej MYSQLI_ASSOC ta funkcja będzie zachowywać się identycznie jak mysqli_fetch_assoc (), podczas gdy MYSQLI_NUM będzie zachowywać się identycznie jak funkcja mysqli_fetch_row (). Ostatnia opcja MYSQLI_BOTH utworzy pojedynczą tablicę z atrybutami obu.

https://www.php.net/manual/en/mysqli-result.fetch-array.php

https://www.php.net/manual/en/mysqli-result.fetch-assoc.php

Zgodnie z prośbą OP. Oto Twój kod z kilkoma zmianami.

<?php
$user = $_SESSION["user"];
$systems = mysqli_connect("localhost", "root", "", "testdatabase");
$query = mysqli_real_escape_string($systems, "SELECT SUM(count) AS value_sum FROM tableexample WHERE user = '$user' AND status = '1'");
$request = mysqli_query($systems, $query) or die(mysqli_error($systems)); // Added die for dev env. You can choose how you want to deal with db query error.
if (mysqli_num_rows($request) > 0) {
    // Just replaced mysqli_fetch_array with mysqli_fetch_assoc
    while ($row = mysqli_fetch_assoc($request)) {
        echo '' . $row["value_sum"] . '';
    }
} else {
    echo '0';
}

Ponadto, gdy otrzymujesz 0, wygląda na to, że if (mysqli_num_rows($request) > 0) nie zwraca true. Może to być spowodowane błędem w zapytaniu db, możesz to sprawdzić ponownie.

Edytuj 04-04-2020:

  1. Zaktualizowane informacje o indexes z zwróconych array przez mysqli_fetch_array.
  2. Dodano mysqli_real_escape_string do $query.
-1
Umair Khan 4 kwiecień 2020, 05:27