Potwierdzenie od Użytkownika skasowania rekordu?

0

[dotyczy MariaDB, Apache, PHP7]
Napisałam sobie kod odpowiedzialny za tworzenie rekordu, potem za jego zmianę i opracowałam wersję kasowania rekordu w postaci guzika w dodatkowej formatce, która po prostu kieruje do strony, która wywołuje kasowanie w bazie danych rekordu. (tak naprawdę to zmienia tylko jedną wartość w kolumnie).
Jest to jednak mało eleganckie i daje duże możliwości pomyłki. Szperałam przez kilka dni po necie jednak nie znalazłam nic co by działało. Wszelkiego rodzaju wstawki JS w skryptach do pliku PHP mi nie odpalają, w dodatku na tym etapie swojej edukacji wolałabym pozostać jeszcze przy samym PHP.
Kod: (próba stworzenia formatki z dwoma guzikami submit)

    <form class="login-form" method="post" action="savemod_pacjent.php?id='.$id.'">
      <tr><td>&nbsp;Id Pacjenta:</td><td><input required type="text" size="4" maxlength="4" name="id" readonly="readonly" color=grey onfocus="this.blur();" value="'.$id.'" /></td></tr>
      <tr><td>&nbsp;Imię Pacjenta:</td><td><input required type="text" size="15" maxlength="20" name="name" value="'.$name.'" /></td></tr>
      <tr><td>&nbsp;Drugie imię:</td><td><input type="text" size="25" maxlength="35" name="secname" value="'.$secname.'" /></td></tr>
[...]
      <tr><td colspan="2" align="center">
        <input class="buttonred" type="submit" name="guzik" value="Skasuj" />
        <input class="button" type="submit" name="guzik" value="Zapisz" />
      </form>';

savemod.....

    $id = $POST['id'];

    echo $id;
    echo $req;
    switch ($_POST['guzik']) {
    case "Skasuj":
        echo '<center>
        <div class="ramka">
        <div class="title">
        Proszę o potwierdzenie
        </div>
        </div>
        <table width="580px"><tr><td align="center">Czy na pewno chcesz usunąć dane tego Pacjenta?</td>
        </tr>
        <tr><td align="center">
        <form class="login-form" action="del_pacjent.php?id='.$id.'" method="post">
        <input class="buttonred" type="Submit" name="guzik" value "Skasuj">
        <input class="button" type="Submit" name="guzik" value="Anuluj">
        </td></tr></table></form>
        </center>';
    break;
    case "Zapisz":
    
    $id = trim($_POST['id']);
    $name = trim($_POST['name']);
    $secname = trim($_POST['secname']);
[ ...i potem zapis do bazy danych]

I tu w tej probie mam problem z przesłaniem id pacjenta wobec którego ma zostać podjęta akcja.
Link wygląda tak:

"http://localhost/testsec/del_pacjent.php?id="

A ja dostaję błąd z serwery bazy danych o próbie dostępu do czegoś czego nie ma:

"Error :SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1 "

Ewentualnie zastanawiam się nad użyciem gotowego komponentu działającego z uzyciem JS/AJAX czy cokolwiek takiego, jednak nie lubię korzystać w swoich źródłach z twórczości innych.

0

No ale problem dotyczy zapytania SQL, to pokaż to zapytanie, bo nikt zgadywać nie będzie...

1

Jest też prostszy sposób na confirm boxa

<form action="https://4programmers.net/Forum/Off-Topic/335063-co_dac_na_dach">
	<input type="submit" value="Przejdź na forum budowlane i zapytaj co dać na dach" onclick="return confirm('Czy na pewno? Tej decyzji nie da się cofnąć');"> 
</form>
0

Tu jest co ma pobrać:

$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbpass);
    $mysqli -> query ("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");
    if(isset($_REQUEST['id'])) {
        $postid = $_REQUEST['id'];
    }
    $query = "select * from pacjent WHERE id=".$postid;

To jest query do bazy danych co ma zrobić po.

        $query = "update pacjent set del=true WHERE id=$req";
        $db->exec($query);

Wkleiłam do swojego pliku tą formatkę ale nie pokazuje ona żadnego komunikatu tylko od razu po kliknięciu na przycisk przenosi na stronę WWW.
Przeglądarka FF 72.0.1 z uBlock, Adblock Plus i włączonym JS (mam plugina do wyłączania ale na tej jest włączony).
Na Operze z uBlock Origin również to nie działa.
Co jest nie tak?

0

Błąd pojawia się, gdy ID jest puste? Bo jeśli nie masz zabezpieczenia, że ID ma być wysłane, to wtedy zapytanie będzie takie:

update pacjent set del=true WHERE id=;

I wtedy wywali błąd.

Poczytaj sobie też o parametryzacji zapytań.

0

Dokładnie - mam błąd zawszer bo ID nie jest przekazywane i nie wiem już jak je przekazać. Requestem? Postem? post jest chyba przy formach, wiec chyba powinnam zmodyfikować wywoływane zapytanie aby wysyłało gotowego linka z doklejonym idem? Tylko w jakiej postaci to ma być ten link?

  • delete.php?id=444
    czy - delete.php?444
    ?
0

Jak już to delete.php?id=444. Ale wtedy jest to wysyłanie za pomocą GET. Jeśli zapytanie ma za zadanie zmiany w bazie danych, to powinno się używać POST. Wtedy np. nie masz informacji z uzupełnionych pól wysłanych danych w url.

EDIT:
Widzę, że formularz masz wysyłany za pomocą POST. Tylko informacje o ID są jako GET. W sumie może tak zostać, tylko poprawić trzeba troszkę:

  1. Sprawdzasz, czy istnieje $_POST['nazwa_przycisku'].
  2. Jeśli istnieje, to pobierasz $_GET['id']. i wykonujesz zapytanie. W kodzie robisz to za pomocą $_POST, dlatego tego nie wykrywa.

POST - dla danych wysyłanych formularzem, jeśli w formularzu wysyłasz dane za pomocą POST
GET - dla danych, które są widoczne w adresie url

0

@serek - dziękuję, działa. :)
Dla potomnych poprawiony kod:

<?php
echo '
<html>
<head>
<title>Zapis zmodyfikowanych danych Pacjenta</title>
<meta charset="utf-8"></meta>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="stylemod.css" />
</head>
<body>
';
    session_start();
    require_once "cfgdb.php";
    if(!isset($_POST['guzik'])) {
        die('Coś chyba poszło nie tak jak powinno');
    } else {
        $id = $_POST['id'];
        echo $id;
        switch ($_POST['guzik']) {
            case "Skasuj":
            echo '<center>
            <div class="ramka">
            <div class="title">
                Proszę o potwierdzenie
            </div>
            </div>
            <table width="580px"><tr>
            <form class="login-form" action="del_pacjent.php?id='.$id.'" method="post">
                <input type="submit" value="Skasuj" onclick="return confirm("Czy na pewno? Tej decyzji nie da się cofnąć");"> 
                <input class="buttonred" type="Submit" name="guzik" value="Skasuj">
                <input class="button" type="Submit" name="guzik" value="Anuluj">
            </form>
            <td align="center">Czy na pewno chcesz usunąć dane tego Pacjenta?</td>
            </tr>
            <tr><td align="center"></td></tr></table>
            </center>';
            break;
        case "Zapisz":
            $id = trim($_POST['id']);
            $name = trim($_POST['name']);
            $secname = trim($_POST['secname']);
            $surname = trim($_POST['surname']);
            $birthday = trim($_POST['birthday']);
            $pesel = trim($_POST['pesel']);
            $telefon = trim($_POST['telefon']);
            $tellokalny = trim($_POST['tellokalny']);
            $adres1 = trim($_POST['adres1']);
            $adres2 = trim($_POST['adres2']);
            $kod_pocztowy = trim($_POST['kod_pocztowy']);
            $miastoz = trim($_POST['miastoz']);
            $adresko1 = trim($_POST['adresko1']);
            $adresko2 = trim($_POST['adresko2']);
            $kod_pocztowy_ko = trim($_POST['kod_pocztowy_ko']);
            $miastoko = trim($_POST['miastoko']);
            $_SESSION['sess_user_id'] = $id;
            $_SESSION['sess_user_name'] = $name;
            $_SESSION['sess_name'] = $pesel;
            $msg = "";
            if($name == "" OR $surname == "" OR $birthday == "" OR $pesel == ""){
                echo "Proszę o wpisanie wszystkich danych - <a href='modify_pacjent.php'>Powrót do strony modyfikowania danych Pacjenta</a>.";
                header("refresh:5;url=modify_pacjent.html");
                die();
            }
            try {
                $query = "update pacjent set id=?,name=?,secname=?,surname=?,birthday=?,pesel=?,telefon=?,tellokalny=?,adres1=?,adres2=?,kod_pocztowy=?,miastoz=?,adresko1=?,adresko2=?,kod_pocztowy_ko=?,miastoko=? WHERE id=$id";
                $stmt = $db->prepare($query);
                $stmt->bindParam(1, $id, PDO::PARAM_STR);
                $stmt->bindParam(2, $name, PDO::PARAM_STR);
                $stmt->bindParam(3, $secname, PDO::PARAM_STR);
                $stmt->bindParam(4, $surname, PDO::PARAM_STR);
                $stmt->bindParam(5, $birthday, PDO::PARAM_STR);
                $stmt->bindParam(6, $pesel, PDO::PARAM_STR);
                $stmt->bindParam(7, $telefon, PDO::PARAM_STR);
                $stmt->bindParam(8, $tellokalny, PDO::PARAM_STR);
                $stmt->bindParam(9, $adres1, PDO::PARAM_STR);
                $stmt->bindParam(10, $adres2, PDO::PARAM_STR);
                $stmt->bindParam(11, $kod_pocztowy, PDO::PARAM_STR);
                $stmt->bindParam(12, $miastoz, PDO::PARAM_STR);
                $stmt->bindParam(13, $adresko1, PDO::PARAM_STR);
                $stmt->bindParam(14, $adresko2, PDO::PARAM_STR);
                $stmt->bindParam(15, $kod_pocztowy_ko, PDO::PARAM_STR);
                $stmt->bindParam(16, $miastoko, PDO::PARAM_STR);
                $stmt->execute([$id, $name, $secname, $surname, $birthday, $pesel, $telefon, $tellokalny, $adres1, $adres2, $kod_pocztowy, $miastoz, $adresko1, $adresko2,     $kod_pocztowy_ko, $miastoko]);
                $color = "<div align='center' style='background-color:green;color:white;padding:1%;'><font size=4px><b>";
                $msg = "<a href=lpacjents.php>Dane Pacjenta zostały zmodyfikowane</a>";
                $endcolor = "</b></font></div><br />";
                echo $color,$msg,$endcolor;
                header ("refresh:6, url=lpacjents.php");
            } catch (PDOException $e) {
                echo "Error :".$e->getMessage();
            }
            break;
        }
    echo '
    </body>
    </html>';
    }
?>

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