Diskuze: Update MYSQL nefuguje
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, na řádku
$update = "UPDATE web_Novinky SET author = '$edit_Author' WHERE id='$idRequest'";
používáš proměnou $idRequest, která v tu chvíli není definovaná, protože její definice je v if bloku a ty se nyní nacházíš v jeho else bloku, takže se nikdy nemůže stát, že by byli vykonány oba tyto řádky.
A i kdyby jsi tento řádek vyndal z té podmínky, tak to nebude fungovat, protože tento kód nyní nemá ponětí o tom, kterou novinku chceš upravovat. To $_REQUEST['id'] byl předpokládám GET parametr, ale ten jsi nastavením action="edit.php" smazal.
POZOR, TVŮJ KÓD OBSAHUJE ZRANITELNOST SQL INJECTION!! Vždy používej prepared statement! Doporučuji místo mysqli používat raději PDO.
Btw. Odesílací tlačítko není sumbit, ale submit
+20 Zkušeností
+2,50 Kč
Doporucuji si vzdy vypsat sql dotaz na obrazovku, kdyz ti neco nejde a vsechny promenne, ktere se tam vyskytuji. Casto je tam prave chyba v obsahu promenne, ze tam neni, co ocekavas.
$update = "UPDATE web_Novinky SET author = '$edit_Author' WHERE id='$idRequest'";
var_dump ($update);
V tom kodu mas mnoho takovych zajimavych, rekneme, chyb
- ja bych si na volani sql dotazu udelal vlastni funkci, abych mohl hromadne povolit nebo zakazat vypis chy.
- nemas tam error_reporting(), aby ti to zobrazovalo chyby v php kodu
- ne kazdy sql dotaz vypisuje chybu pri selhani, treba ten prvni SELECT
- $vysledek->num_rows - na tom ti muze cely program zhavarovat, pokud dojde k selhani sql dotazu, vysledek se bude rovnat false. Podminka se nevykona, ok, ale na spouste serveru se program zastavi, protoze mas v php kodu chybu. Nejsem si ale upne ijsty, co to udela, mozna to mas precijen ok, leta uz pouzivam pdo misto mysqli.
- nemas osetrene promenne, ktere vkladas do sql dotazu, mysqli real_escape_string()
- nemas osetrenou pres isset() existenci hodnot z requestu $_REQUEST['edit_Author']. Prvne se zeptas, zda existuje isset($_REQUEST['edit_Sumbit']), ale potom uz se dal neptas a spolehas na to, ze ano.
//$edit_Author = $_REQUEST['edit_Author'];
$edit_Author = isset($_REQUEST['edit_Author']) ? $_REQUEST['edit_Author'] : '';
A kdyz by to nebylo vubec nastaveno, tak do sql dotazu posilas prazdna data, to take neosetrujes, neptas se, zda to neni prazdne a mohlo by se ti stat, ze ti to ulozi do databaze prazdne radky. Ty mozna selectem jidne sice nevyberes, takze o tom nevis, ale v db jsou a zabiraji misto.
- proc pouzivas odlisny zapis pro sql connect? Jednou jako vytvoreni tridy, podruhe jako vytvoreni connection. Nasledne pak volas sql dotaz take ruznymi zpusoby. Odpovida to zpusobu, ktery jsi zvolil pro connection, ale chtelo by to sjednotit.
$conn = new mysqli($server, $username, $password, $database);
$link = mysqli_connect("localhost", "root", "Heslo", "web");
$vysledek = $conn->query($sql);
mysqli_query($link, $update))
- a co je pomerne zarazejici...
$update = "UPDATE web_Novinky SET author = '$edit_Author' WHERE id='$idRequest'";
mysqli_query($link, $update) // ok
echo "ERROR: $sql // vzdyt $sql vubez neexistuje
- A jak zminil kolega, pro sql dotaz ti mozna neexistuje promenna
if(isset($_REQUEST['id'])) {
$idRequest = $_REQUEST['id'];
...
} else
...
// $idRequest = $_REQUEST['id']; tento radek tam nikde nemas
$update = "UPDATE web_Novinky SET author = '$edit_Author' WHERE id='$idRequest'";
Ja bych zacal tim, ze si sjednotim to volani sql.
// https://www.php.net/manual/en/mysqli.connect-error.php - a opravil bych si to podle php manualu
// https://www.php.net/manual/en/mysqli.query.php
// sql connect
$mysqli = @new mysqli($server, $username, $password, $database);
//$conn = new mysqli($server, $username, $password, $database);
if ($mysqli->connect_error) {
die('Connect Error: ' . $mysqli->connect_error); // kdyz selze pripojeni k db, vypis chybu; die zastavi program
}
// sql query
function sql($query='', $line='')
{
global $mysqli;
$result = $mysqli->query($query);
if(!$result)
{
$err = "line = "$line ."<br>query = ". $query ."<br>error = ". $mysqli->error;
die($err); // kdyz dotaz selze, vypis chybu
// echo $err; // nebo chces, aby program pokracoval, tak misto die() pouzijes echo
// $result->close();
// return false;
}
//return $result;
// nebo by to slo rovnou fetchnout do array
$list = array();
if ($result->num_rows > 0)
{
while($row = $result->fetch_assoc()!==false)
{
$list[] = $row;
}
$result->close();
return $list;
}
$result->close();
return true;
}
// potom muzes spoustu radku z dalsiho kodu odstranit
//$conn = new mysqli($server, $username, $password, $database);
// if($conn->connect_error) {
// die('Chyba s připojením na server');
// } else {
// $sql = "SELECT * FROM web_Novinky WHERE id = '$idRequest'";
// $vysledek = $conn->query($sql);
// if ($vysledek->num_rows > 0) {
// while($query = $vysledek->fetch_assoc()) {
$query = "SELECT * FROM web_Novinky WHERE id = '$idRequest'";
$list = sql($query, __LINE__); // count($list) je pocet radku
foreach($list as $row) {
// $id = $row['id'];
// //Tu jsem byl uz zoufaly a udelal novy connect
// $link = mysqli_connect("localhost", "root", "Heslo", "web");
// // Check connection
// if($link === false){
// die("ERROR:" . mysqli_connect_error());
// }
// $update = "UPDATE web_Novinky SET author = '$edit_Author' WHERE id='$idRequest'"; // jako, muzes to nazvat $update, ale musis to dal pouzivat stejne a ne jako $sql, ja osobne davam prednost $query nebo $novinky_update
// if(mysqli_query($link, $update)){
$query = "UPDATE web_Novinky SET author = '$edit_Author' WHERE id='$idRequest'";
$result = sql($query, __LINE__);
if ($result!==false) {
// else {
// echo "ERROR: $sql. " . mysqli_error($link);
// }
Maty:22.4.2021 21:25
Děkují, za rady. Něco jsem se i přiučil, jinak do DB se nevklada prazdny zapis. (Ošetřil jsem to cca za 1h od přidani semka.)
Zobrazeno 4 zpráv z 4.