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

Člen

Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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?
a este jedna vec - ak mozes, nepouzivaj v nazve tabulky (používatelia) diakritiku.
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: </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: </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);
?>
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
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.
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.
Ahoj.
Pouzivam verziu PHP 7.2.4
Na tejto stranke som vytvoril testovaciu databazu.
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ť
Pozri si tu stranku co som dal odkaz. O riadok vyssie.
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
??? Ja to skusam skoro cele poobedie a funguje....A pozeram ze si menil
riadok 1 a 3
A kedy sa ti objavila ta chyba?
Ukazal sa ti aj odkaz, v zelenom ramceku, ze zmena sa vykonala?
ani ma tam nepusti...
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šší!
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.
}
Roman, pre mna su OOP a Wrapery doteraz spanielska dedina. A uz sa ich ako 54
rocny asi nebudem ucit a hlavne ich pochopit.
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....
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.
Pekne video, diky
Z tych troch veci, co spominal, dve standardne na svojej stranke mam. bdrypt a v
php.ini nastavene session.cookie_httponly=1.
Len to OOP naucit sa pochopit
Zobrazeno 19 zpráv z 19.