Wyświetlenie formy, kiedy warunek jest spełniony

0

Cześć,

Mam niewielki problem z wyświetleniem formularza, kiedy spełniony jest określony warunek. Wyświetlane jest wszystko poza nią :/

<?php if (isset($_GET['edit'])) { 
$sql = 'SELECT * FROM loginpage WHERE id=' . $_GET['edit'];
$result = mysqli_query($conn, $sql);
$rowCount = mysqli_num_rows($result);
if ($rowCount == 1) {
  $selectedUser = $result->fetch_assoc(); ?>
  <form class="editForm" action="index.php" method="POST" name="editUser">
    <h1>EDYCJA: <u><?php echo $selectedUser['USERNAME']; ?></u></h1>
  </form>
<?php } } ?>

Efekt, jaki otrzymuję, to:
screenshot-20220414225228.png![screenshot-20220414225328.png](https://4programmers.net/uploads/113514/K2p40qoxAU1tmw6isT7b1yB3b7FDTFRZrxCHWUAn.png
Kod z inspecta wygląda tak:
screenshot-20220414225354.png

Cała struktura struktura klasy content:

<div class="content">
        <table>
            <tr>
                <th rowspan="2">ID</th>
                <th rowspan="2">NAZWA UŻYTKOWNIKA</th>
                <th rowspan="2">UPRAWNIENIA</th>
                <th colspan="2">OSTATNIA WIZYTA</th>
                <th rowspan="2">MAIL</th>
                <th rowspan="2">AKCJE</th>
            </tr>
            <tr>
                <th aria-colindex="4">DATA</th>
                <th aria-colindex="5">GODZINA</th>
            </tr>
            <?php while ($row = $res->fetch_assoc()) { 
                   $time = new DateTime(sprintf($row['LAST_VISITATION']));
                   $date = $time->format('d.m.Y');
                   $hour = $time->format('H:i') 
            ?>
                <tr>
                    <td> <?php echo $row['ID'] ?></td>
                    <td> <?php echo $row['USERNAME'] ?></td>
                    <td> <?php echo $row['PERMISSION_LEVEL'] ?></td>
                    <td> <?php echo $date ?></td>
                    <td> <?php echo $hour ?></td>
                    <td> <?php echo $row['MAIL'] ?></td>
                    <td title="EDYTUJ"> <a class="fa-solid fa-pen" href="?edit=<?php echo $row['ID']; ?>"></a> </td>
                </tr>
            <?php } ?>


            <?php if (isset($_GET['edit'])) { 
                $sql = 'SELECT * FROM loginpage WHERE id=' . $_GET['edit'];
                $result = mysqli_query($conn, $sql);
                $rowCount = mysqli_num_rows($result);
                if ($rowCount == 1) {
                    $selectedUser = $result->fetch_assoc(); ?>
                    <form class="editForm" action="index.php" method="POST" name="editUser">
                        <h1>EDYCJA: <u><?php echo $selectedUser['USERNAME']; ?></u></h1>
                    </form>
            <?php } } ?>
        </table>
    </div>
1

Kompletnie nie wiem po co jest ten formularz, skoro i tak dodajesz tylko <h1>.

<form class="editForm" action="index.php" method="POST" name="editUser">
   <h1>EDYCJA: <u><?php echo $selectedUser['USERNAME']; ?></u></h1>
</form>

Wytłumacz co chcesz osiągnąć, a na razie zostawię Cię z wyjaśnieniem dlaczego form jest puste

Formularz nie może być elementem potomnym tabeli, tbody lub tr. HTML 5 wprowadza atrybut formularza. Dzięki temu można podać jeden formularz w wierszu poza tabelą, a następnie powiązać wszystkie kontrolki formularza w danym wierszu z jednym z tych formularzy przy użyciu jego identyfikatora.

Użyj atrybutu form=, jeśli chcesz zapisać swój znacznik:

<form method="GET" id="formularz"></form>

<table>
    <tr>
        <td>
            <input type="text" name="przykład" form="formularz" />
            <button type="button" form="formularz">ok</button> //Jak nie chcesz mieć przycisku w tabeli to dodaj go gdzieś indziej 
        </td>
    </tr>
</table>
1

Przy okazji:

$sql = 'SELECT * FROM loginpage WHERE id=' . $_GET['edit'];

Doczytaj sobie o takiej fajnej sprawie, jaką jest SQL Injection.

0

I właśnie tu jest błąd. Formularz miał być poza tabelą(wyświetlać się "przed" nią na stronie). Docelowo maja się w nim znajdować pola dotyczące edycji profilu użytkownika.

Co do SQL injection, mam taką świadomość, ale na razie się tym nie zajmowałem.

0

No to proste:

  • wywal z tabeli formularz
  • wpisz sobie go poza tabelą
  • pola do edycji zrób tak jak Ci przykład podesłałem <input type="text" form="nazwa_form"> zakładam, że będziesz chciał edytować każdą linijkę tej tabeli osobno więc dodaj <button type="submit" form="nazwa_form">

'Formularz miał być poza tabelą(wyświetlać się "przed" nią na stronie).' - W tym przypadku formularz nie będzie wyświetlany, tylko pełnił swoją funkcje skierowania danych $_POST[], jedynymi rzeczmi wyświetlanymi będą inputy wklejone poza formularzem, które będą się do niego odnosić.

Jak wykonasz te kroki osiągniesz to co chcesz. Warto jeszcze rozważyć, najpierw dodanie przycisku [Edytuj], po czym jak w niego klikniesz, pola do edycji się odblokują, a w jego miejsce pojawi się [Zapisz zmiany], takie małe zabezpieczenie, żeby przypadkiem nie zmodyfikować różnych tabel.

0

@ZeuberO: już to zrobiłem, dzięki. Co do przycisków, zrobiłem to na razie w taki sposób, oczywiście poglądowo, bo nie mam czasu na zmienienie przycisków na dole(głównie kolejność, ale też rozmieszczenie) screenshot-20220417194200.png.

Podczas tworzenia tego "panelu", napotkałem jeszcze jeden problem. Chciałem wyświetlić poziom uprawnień nie w postaci liczby, a rangi wczytywanej z bazy danych, w taki sposób: screenshot-20220417195146.png
No i wszystko działa, ale ładuje się strasznie wolno, jak na filmie niżej (wcześniej efekt był natychmiastowy):
Działa to ogólnie w taki sposób, że na samej górze pliku ładowana jest komenda:

$getPermissionData = $conn->prepare('SELECT * FROM loginpage_permissions WHERE id=:id');

a w pętli:

$getPermissionData->bindParam(':id', $permissionLevel);
$getPermissionData->execute();
$getPermissionDataFetch = $getPermissionData->fetch(PDO::FETCH_ASSOC);

No i niżej po prostu pobieram wartości kolumny z $getPermissionDataFetch.
Wydaje mi się, że dzieje się tak przez zbyt dużą liczbę zapytań, co jest bardzo możliwe. Prawdopodobnie wystarczyłoby załadowanie całej tabelki na samej górze, a w pętli pobierającej dane, po prostu wyszukiwanie odpowiedniego wiersza pod ID, ale nie wiem jak to zrobić :/

0

'Podczas tworzenia tego "panelu", napotkałem jeszcze jeden problem. Chciałem wyświetlić poziom uprawnień nie w postaci liczby, a rangi wczytywanej z bazy' - Jak zapisujesz dane w bazie? Bo na zdjęciu widać [3]ADM, mam rozumieć, że rekord zwracany z bazy to [3]ADM? Czy może [3] i ADM to osobne tabelki?

'Prawdopodobnie wystarczyłoby załadowanie całej tabelki na samej górze, a w pętli pobierającej dane, po prostu wyszukiwanie odpowiedniego wiersza pod ID, ale nie wiem jak to zrobić :/' - Załadować całą tabele możesz za pomocą array(); a potem szukać gdzie znajduje się ID, które potrzebujesz: https://www.php.net/manual/en/pdostatement.fetchall.php

Przedstaw dokładnie co chcesz zrobić, co i jak ma działać, bo na obecną chwilę to nie za bardzo wiem jak pomóc, oprócz takich ogólników.

A co do wolnego pobierania, to wątpię żeby przez dużą liczbę zapytań, bo to co masz obecnie nie powinno posiadać więcej jak 2-3 zapytania:
php $getPermissionData = $conn->prepare('SELECT * FROM loginpage_permissions WHERE id=:id'); - Pierwsze zapytanie prawdopodobnie określające rolę konta, jakie pełni na stronie, oraz zapewne jakie mają się informacje wyświetlić z tego tytułu.
Drugie zapytanie o całą listę klientów i ewentualnie trzecie o jakieś dodatkowe info przy edycji. Jak masz więcej to prawdopodobnie coś dziwnego robisz.

0

udało się już naprawić, dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1