Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: update in php

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Neaktivní uživatel:21.4.2018 15:43

Ahojte mám pronlém, keďže som začiatoční s php a neviem si dať rady už.... Potrebujem urobiť updste mojej databázy na základe php formu... kde potrebujem zadať id=sledovacie číslo a zmeniť stav objednávky....

vyzerá to nejak takto

<body>

<DIV class="hlavna" >
<form action="update.php" method="post">
Sledovacie číslo,ktoré ideme aktualizovať:

<input type="number" name="id" required id="id" value="<?php $_POST['id']?>" placeholder="Sle­dovacie číslo">

Nový stav:

<input type="text" name="stav" required id="stav" value="<?php $_POST['stav']?>" placeholder="Stav">

<button type="submit" class="btn btn-primary" data-toggle="modal"> Odoslané </button> Späť
</form>
</DIV>
<?php

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "skola";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$id = mysqli_real_es­cape_string($con­n, $_POST['id']);
$stav = mysqli_real_es­cape_string($con­n, $_POST['stav']);

if(isset($_POS­T['submit'])){
$sql = "UPDATE používatelia SET stav='$stav' WHERE id=$id";
if($conn->query($sql) === true ){

echo " pridané ";
}
else
{
echo "Error
" . $conn->error;
}
$conn->close();
}
?>

Odpovědět
21.4.2018 15:43
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Peter Schoeller:21.4.2018 23:10

Ten tvoj kod je velmi neprehladny a hrozi riziko chyby, kedze robis prakticky "na slepo".
V principe najprv by si si mal vybrat z databazy s akym $id chces pracovat.
tzn, najprv si vytvor formular <form> kde zadas do jednotlivych vsupnych poli hodnoty, ktore uz v databaze mas. ID bude nemenne a menit budes len to Sledovacie číslo.
Alebo chces menit aj id? Ak ano, kvoli comu?

 
Nahoru Odpovědět
21.4.2018 23:10
Avatar
Peter Schoeller:21.4.2018 23:26

a este jedna vec - ak mozes, nepouzivaj v nazve tabulky (používatelia) diakritiku.

 
Nahoru Odpovědět
21.4.2018 23:26
Avatar
Odpovídá na Neaktivní uživatel
Peter Schoeller:22.4.2018 2:17

Tak som sa s tym trochu pohral a tu je riesenie.
Nazov tejto stranky je update.php
Predpokladam, ze na zmenu stavu ides odkazom z nejakej stranky, takze ID dostavas zo stavoveho riadku.
Napr:

nejaka_stranka.php?id=1

kde cislo "1" prezentuje id pri ktorom chces zmenit stav.
Ak je moj prepoklad spravny, tu je kompletny kod.
(budes musiet len nastavit header na riadku 26, aby sa ti vratil na predchadzajucu stranku. Rovnako tak si nastav aj header uplne na konci a nezabudni ho aktivovat.

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "skola";
$conn = mysqli_connect($servername, $username, $password, $dbname);
?>
<?php
$id = isset($_GET['id']) ? $_GET['id'] : '';
$sql_get = mysqli_query($conn, "SELECT * FROM pouzivatelia WHERE id = $id");
if (!$sql_get) {
    printf("Error: %s\n", mysqli_error($conn));
    exit();
}
        if (isset($_POST['id'])) {
                $id = $_POST['id'];
                $stavNew = mysqli_real_escape_string($conn,($_POST['stavNew']));

                $sql_edit = "UPDATE pouzivatelia SET stav = '$stavNew' WHERE id = '$id'";
                $sql_get = mysqli_query($conn, $sql_edit) or die('Could not update'.mysqli_error($conn));
                if (!$sql_get) {
                        echo '<div style="background-color:#ff9999;padding:5px;width:250px;border: 1px solid black;text-align:center;">Chyba - nezmenené.</div>';
                        header( "Refresh:3; url='update.php?id=".$id );
                        } else {
                echo '<div style="background-color:#e6ffe6;padding:5px;width:250px;border: 1px solid black;text-align:center;">Zmenené.<br />Nový stav: <span style="font-weight:bold;">'.$_POST['stavNew'].'</span></div>';
                header( "Refresh:3; url='update.php?id=".$id );
                        }
        } else if ($row = mysqli_fetch_array($sql_get)) {

        echo '<form method="post" name="update" />';
        echo '<table style="border: 1px solid black;">';
                        // head table
                echo '<tr>
                        <td style="border: 1px solid black;background-color:#ffffcc"></td>
                        <td style="border: 1px solid black;"><span>Pôvodný stav</span></td>
                        <td style="border: 1px solid black;"><span>Zmena</span></td>
                        </tr>';
                        // read ID
                echo '<tr>
                        <td style="border: 1px solid black;">ID:&nbsp;</td>
                        <td style="border: 1px solid black;"><input type="text" style="background-color:#ffcccc;" value="'.$row['id'].'"  readonly /></td>
                        <td style="border: 1px solid black;"><input type="text" style="background-color:#e6ffe6;" name="id" placeholder="'.$row['id'].'" readonly /></td>
                        </tr>';
                                // edit Stav
                echo '<tr>
                        <td style="border: 1px solid black;">Stav:&nbsp;</td>
                        <td style="border: 1px solid black;"><input type="text" style="background-color:#ffcccc;" name="stavNew" value="'.$row['stav'].'" readonly /></td>
                        <td style="border: 1px solid black;"><input type="text" name="stavNew" value="'.$row['stav'].'" placeholder="Stav" /></td>
                        </tr>';
                                // UPDATE
                echo '<tr>
                        <td colspan="3" style="background-color:#e6ffe6; border: 1px solid black;">
                        <input type="hidden" name="id" value="' .$row['id']. '">
                        <div style="text-align:center;padding: 10px 0;"><button type="submit"><span style="color:#ff4c4c; font-size:large; font-weight:bold;">Update data</span></button></div>
                        </td>
                        </tr>';
        echo '</table><br>';
                echo '</form>';
        } else {
                echo '<div style="background-color:#ff0000;padding:5px;width:250px;border: 1px solid black;text-align:center;">ID neexistuje</div>';
                sleep(5);
                //      header( "Refresh:3; url='nejaka_stranka.php'" );
        }
mysqli_close($conn);
?>
 
Nahoru Odpovědět
22.4.2018 2:17
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Peter Schoeller
Jan Lupčík:22.4.2018 8:30

Ahoj,
tvůj kód je nebezpečný a obsahuje MySQL injekci, viz:
https://www.itnetwork.cz/…ion-a-obrana
I do $_GET se dá dosadit část dotazu, což by fungovalo u toho ID. Nejlepší by bylo používat PDO, které je popsané v místním tutoriálu:
https://www.itnetwork.cz/…sql-ovladace

Nahoru Odpovědět
22.4.2018 8:30
TruckersMP vývojář
Avatar
Odpovídá na Jan Lupčík
Peter Schoeller:22.4.2018 10:28

Ahoj.
Predpokladam, ze k uprave databaze bude pristupovat len administrator, takze on nebude mat zaujem si mazat databazu. Ale OK.....
ten riadok moze upravit na:

$sql_get = mysqli_query($conn, "SELECT * FROM pouzivatelia WHERE id = $id LIMIT " . (int)$id );

Skusal som si vymazat tabulku "pouzivatelia" ale dostal som tuto hlasku:

Error: 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 ''; TRUNCATE TABLE pouzivatelia;--' at line 1

Moze to byt tym, ze uz v samotnej databaze mam id ako int a autoincrement?
Vies mi poslat akym zapisom by som si mohol vymazat tabulku pouzivatelia?
Samozrejme si pri pokuse zmenim v DB typ riadku id z int na varchar a aj necham ten povodny riadok ako som napisal v noci.

 
Nahoru Odpovědět
22.4.2018 10:28
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Peter Schoeller
Jan Lupčík:22.4.2018 11:27

Taky se mi to nepodařilo napodobit. Napadá mě, že to je kvůli těm uvozovkám, co jsi tam dal.
Každopádně já furt pracuji s PDO a tak jsem to nikdy nezkoušel. Ale byl jsem zde na přednášce, kde se mluvilo o bezpečnosti a tam to bylo pěkně ukázaný a i funkční. Přikládám článek:
https://www.itnetwork.cz/…vou-aplikaci
Možná je to verzí PHP. Prostě se ten druhý dotaz nespustí. Ale spoléhat na to je taky blbost. Mohu ti někam hodit pak obrázek, kde by byla adresa na tvojí administraci a i s tím dotazem v URL. Což je taky napsané v tom článku v podkapitole CSRF.

Nahoru Odpovědět
22.4.2018 11:27
TruckersMP vývojář
Avatar
Odpovídá na Jan Lupčík
Peter Schoeller:22.4.2018 14:16

Ahoj.
Pouzivam verziu PHP 7.2.4
Na tejto stranke som vytvoril testovaciu databazu.

 
Nahoru Odpovědět
22.4.2018 14:16
Avatar
Odpovídá na Peter Schoeller
Neaktivní uživatel:22.4.2018 21:06

id sa meniť nebude.... id ostane .. tam ide len o to že id je priradený určitý stav objednávky ktorý sa musí dať zmeniť

Nahoru Odpovědět
22.4.2018 21:06
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Peter Schoeller:22.4.2018 21:12

Pozri si tu stranku co som dal odkaz. O riadok vyssie. ;-)

 
Nahoru Odpovědět
22.4.2018 21:12
Avatar
Neaktivní uživatel:22.4.2018 21:16

hej hej pozerám len mi vyhadzuje .. Error: 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 :D

Nahoru Odpovědět
22.4.2018 21:16
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Peter Schoeller:22.4.2018 21:31

??? Ja to skusam skoro cele poobedie a funguje....A pozeram ze si menil riadok 1 a 3 :-D

 
Nahoru Odpovědět
22.4.2018 21:31
Avatar
Nahoru Odpovědět
22.4.2018 21:32
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Peter Schoeller:22.4.2018 21:34

A kedy sa ti objavila ta chyba?
Ukazal sa ti aj odkaz, v zelenom ramceku, ze zmena sa vykonala?

 
Nahoru Odpovědět
22.4.2018 21:34
Avatar
Neaktivní uživatel:22.4.2018 22:17

ani ma tam nepusti...

Nahoru Odpovědět
22.4.2018 22:17
Neaktivní uživatelský účet
Avatar
Roman Havránek:22.4.2018 23:24

Zbytečně složitý kod, řešil bych pomocí dvou funkcí v OOP.
A jak jsem proti OOP kdysi bojoval, teď na něj nedám dopustit.

Btw. chci se zeptat, ty chceš pouze dle nějakého VYBRANÉHO ID změnit stav objednávky z hodnoty x na y?
Jednoduché. Co máš za problém? Chce to jen aby jsi více přemýšlel a hlavně nekopíroval zdrojáky!
Způsobů jak to udělat je několik, každopádně bych neřešil způsobem, který prenzentuje Peter, obsahuje nebezpečnou SQL Injection.

Doporučuji se doučit PDO a OOP a bude všechno jednodušší! :-P :-P :-D

Mohlo by to vypadat třeba takto:

public function zpracujZmenu($zmena)
{

//zde bude načtená hodnota $id z konstruktoru a také parametr $zmena,která bude určovat požadovanou změnu nebo stav objednávky.Dle těchto hodnot, odešlu SQL dotaz, pomocí PDO a returnu si výsledek pro index.

}
Nahoru Odpovědět
22.4.2018 23:24
sleep();
Avatar
Odpovídá na Roman Havránek
Peter Schoeller:23.4.2018 1:49

Roman, pre mna su OOP a Wrapery doteraz spanielska dedina. A uz sa ich ako 54 rocny asi nebudem ucit a hlavne ich pochopit. :-D
Som samouk aj na PHP a vsetko si robim len pre vlastne potesenie, a aj to len preto ze ma bavia databazy. ;-) Ale mozno objavim caro PDO a OOP... Kto vie....
Mimochodom, vies mi napisat nejaku tu injekciu aby som si mohol nasimulovat vymazanie tejto databazy? Nech sa potrapim s vylepsenim kodu potom, ked si tu skusobnu databazu zmazem.... :-D

 
Nahoru Odpovědět
23.4.2018 1:49
Avatar
Roman Havránek:23.4.2018 8:29

Tak třeba pěkné video jak to ošetřit je tady od Michala Špačka: https://www.youtube.com/watch?…

Vyzkoušej si, co ukazuje ve videu.

Editováno 23.4.2018 8:30
Nahoru Odpovědět
23.4.2018 8:29
sleep();
Avatar
Odpovídá na Roman Havránek
Peter Schoeller:23.4.2018 12:50

Pekne video, diky ;-)
Z tych troch veci, co spominal, dve standardne na svojej stranke mam. bdrypt a v php.ini nastavene session.cooki­e_httponly=1.
Len to OOP naucit sa pochopit :-D

 
Nahoru Odpovědět
23.4.2018 12:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 19 zpráv z 19.