IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.
Avatar
Maty
Člen
Avatar
Maty:20.4.2021 19:29

Mám editační formulař, více kód, chtěl jsem udělat že po odeslani pomoci tlačitka z edituju text, jak jinak. Jenže narazil jsem an problém, neuklada se mi to do databáze.

Zdrojak : https://www.itnetwork.cz/…lighter/1414

Zkusil jsem: Nový link kód, hledát na internetu

Chci docílit: Aby fungoval editačni formulař.

 
Odpovědět
20.4.2021 19:29
Avatar
Jan Kerhart
Člen
Avatar
Jan Kerhart:22.4.2021 0:25

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 :)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.4.2021 0:25
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:22.4.2021 10:08

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_strin­g()
  • nemas osetrenou pres isset() existenci hodnot z requestu $_REQUEST['edit_Au­thor']. Prvne se zeptas, zda existuje isset($_REQUES­T['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);
//    }
Editováno 22.4.2021 10:10
 
Nahoru Odpovědět
22.4.2021 10:08
Avatar
Maty
Člen
Avatar
Odpovídá na Peter Mlich
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.)

 
Nahoru Odpovědět
22.4.2021 21:25
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 4 zpráv z 4.