• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego nic się nie wypisuje?

VPS Starter Arubacloud
0 głosów
256 wizyt
pytanie zadane 9 września 2021 w PHP przez Huberti Gaduła (4,500 p.)

Dlaczego poniższy kod nie dostaje się do instrukcji echo "I'm here 1"; oraz echo "I'm here 2";? Z logicznego punktu widzenia powinno być to nie możliwe. Przecież jest if z GET, który się nie wykona, więc powinna użyć się klauzula else, natomiast u mnie nic się nie wypisuje.

<?php
session_start();
?>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Question</title>
    <link rel="stylesheet" href="style.css">
</head>

<body>
    <div>
        <a href="index.php">
            <img id="logo" src="logo.png" width="100px" height="100px" style="margin-left: 400px;">
        </a>
    </div>
    <?php
    $connection = mysqli_connect("XXX", "XXX", "XXX", "XXX");
    if (isset($_POST['answer'])) {
        $stmt = mysqli_prepare($connection, "INSERT INTO `answers`(`questionId`, `dateAndTime`, `answer`) VALUES (?,(SELECT now()),?");
        $stmt->bind_param("ss", $a, $b);
        $a = $_SESSION['id'];
        $b = $_POST['answer'];
        $stmt->execute();
        $result = $stmt->get_result();
        if (!$result) {
            echo mysqli_error($connection);
        }
        else{
            echo "Done";
        }
    }
    if (isset($_GET['id'])) {
        echo "I'm here 1";
        $stmt = mysqli_prepare($connection, "SELECT posts.title,posts.body FROM posts WHERE posts.id=?");
        $stmt->bind_param("s", $id);
        $id = $_GET['id'];
        $_SESSION['id'] = $id;
        $stmt->execute();
        $result = $stmt->get_result();
        while ($row = mysqli_fetch_assoc($result)) {
            echo '<div style="font-size: 42px;">', $row['title'], "</div><div>", $row['body'], "</div>";
        }
    } else {
        echo "I'm here 2";
        $stmt = mysqli_prepare($connection, "SELECT posts.title,posts.body FROM posts WHERE posts.id=?");
        $stmt->bind_param("s", $id);
        $id = $_SESSION['id'];
        $stmt->execute();
        $result = $stmt->get_result();
        while ($row = mysqli_fetch_assoc($result)) {
            echo '<div style="font-size: 42px;">', $row['title'], "</div><div>", $row['body'], "</div>";
        }
    }
    ?>
    <form action="question.php" method="POST" style="display: flex; flex-direction: column;">
        <textarea name="answer" style="margin-top: 100px; width: 25%; height: 200px;"></textarea>
        <button type="submit" class="btn" style=" width: 5%; text-align: center;">Answer</button>
    </form>
</body>

</html>

 

1 odpowiedź

0 głosów
odpowiedź 9 września 2021 przez radek024 Szeryf (77,180 p.)
Zapytanie typu GET działa na zasadzie adresstrony.pl?id=1 - wówczas działa $_GET['id']. Czy sprawdziałeś takie coś? Ponadto, w echo nie powinienes wypuszczać kodu html. Wystarczy zamknąć klauzulę PHP i napisać normalny kod. Nie sprawdzasz też połączenia z bazą danych.
komentarz 9 września 2021 przez Huberti Gaduła (4,500 p.)

Zapytanie typu GET działa na zasadzie adresstrony.pl?id=1 - wówczas działa $_GET['id']. Czy sprawdziałeś takie coś?

Tak, sprawdzałem. Po ręcznym wpisaniu ?id=1 działa (wyświetla się I'm here 1 oraz po usunięciu jest I'm here 2). Problem polega na tym, że po naciśnięciu przycisku nic się nie pokazuje. Wiesz może dlaczego?

Ponadto, w echo nie powinienes wypuszczać kodu html. Wystarczy zamknąć klauzulę PHP i napisać normalny kod.

 To musi być w PHP, przecież wyświetlam dane z bazy danych.

Nie sprawdzasz też połączenia z bazą danych.

Dobry pomysł. Dzięki. 

komentarz 9 września 2021 przez radek024 Szeryf (77,180 p.)

Tak, sprawdzałem. Po ręcznym wpisaniu ?id=1 działa (wyświetla się I'm here 1 oraz po usunięciu jest I'm here 2). Problem polega na tym, że po naciśnięciu przycisku nic się nie pokazuje. Wiesz może dlaczego?

To wynika z faktu, że wysyłasz dane przez POST, a dalej - nie ma żadnego pola z [name=id]. Nic się nie pojawi, bo nie dość, że nie obsługujesz prawidłowej metody, to i bez ustawionego pola. 

 

Druga kwestia: czym się różni ten kod

$result = $stmt->get_result();
        while ($row = mysqli_fetch_assoc($result)) {
            echo '<div style="font-size: 42px;">', $row['title'], "</div><div>", $row['body'], "</div>";
        }

od tego?

$result = $stmt->get_result();
        while ($row = mysqli_fetch_assoc($result)) { ?>
            <div style="font-size: 42px;"><?php $row['title']; ?></div><div><?php $row['body']; ?></div>";
<?php
        }

Ano tym, że przynajmniej częściowo oddzielasz warstwę generowania strony przez serwer od gotowego kodu HTML, który jest tylko powtarzany. Idąc za dokumentacją:

echo — Output one or more strings

echo służy do wypychania tekstu, nie HTMLa.

komentarz 9 września 2021 przez radek024 Szeryf (77,180 p.)
No, zrobiłem babola :D jakiego - zagadka dla Ciebie. Kod w każdym razie nie wyświetli danych.
komentarz 10 września 2021 przez Huberti Gaduła (4,500 p.)

To wynika z faktu, że wysyłasz dane przez POST, a dalej - nie ma żadnego pola z [name=id]. Nic się nie pojawi, bo nie dość, że nie obsługujesz prawidłowej metody, to i bez ustawionego pola. 

Nie rozumiem. O jakie pole [name=id] Ci chodzi? Jaką metodę powinienem obsłużyć? No i o co chodzi w "to i bez ustawionego pola"? Jak dla mnie po naciśnięciu przycisku powinno wyświetlić się I'm here 2, a nic się nie pokazuje.

Podobne pytania

0 głosów
1 odpowiedź 140 wizyt
pytanie zadane 17 maja 2018 w C i C++ przez Hiskiel Pasjonat (22,830 p.)
0 głosów
2 odpowiedzi 192 wizyt
pytanie zadane 31 sierpnia 2015 w C i C++ przez Avernis Nałogowiec (27,400 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...