Autor | Zpráva | ||
---|---|---|---|
Kleciss Profil |
#1 · Zasláno: 15. 1. 2021, 12:03:32
Ahoj, neví někdo kde by mohl být problém? Objevuje se mi hláška Could not update data: No database selected
Děkuji Kod: <?php if(isset($_POST['update'])) { $dbhost = 'localhost'; $dbuser = 'kalendar20'; $dbpass = 'xxxx'; $conn = mysql_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('Could not connect: ' . mysql_error()); } $id = $_POST['id']; $prvni = $_POST['prvni']; $sql = "UPDATE leden ". "SET prvni = $prvni ". "WHERE id = $id" ; mysql_select_db('kalendar20'); $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not update data: ' . mysql_error()); } echo "Updated data successfully\n"; mysql_close($conn); }else { ?> <form method = "post" action = "<?php $_PHP_SELF ?>"> <table width = "400" border =" 0" cellspacing = "1" cellpadding = "2"> <tr> <td width = "100">ID1</td> <td><input name = "id" type = "text" value"1" id = "id"></td> </tr> <tr> <td width = "100">První</td> <td><input name = "prvni" type = "text" id = "prvni"></td> </tr> <tr> <td width = "100"> </td> <td> </td> </tr> <tr> <td width = "100"> </td> <td> <input name = "update" type = "submit" id = "update" value = "Update"> </td> </tr> </table> </form> <?php } ?> |
||
NoxOne Profil |
#2 · Zasláno: 15. 1. 2021, 12:50:26
Já bych to změnil takto: (ps: ale bezpečnost ti nic neříká ... osobně používám pro DB "bindování" )
<?php if(isset($_POST['update'])) { $dbhost = 'localhost'; $dbuser = 'kalendar20'; $dbpass = 'xxxx'; $dbname = 'kalendar20'; $conn = mysql_connect($dbhost, $dbuser, $dbpass, $dbname); if(! $conn ) { die('Could not connect: ' . mysql_error()); } $id = $_POST['id']; $prvni = $_POST['prvni']; $sql = "UPDATE leden SET prvni = ".$prvni." WHERE id = ".$id." ; $retval = mysql_query( $sql, $conn ); if(! $retval ) { die('Could not update data: ' . mysql_error()); } echo "Updated data successfully\n"; mysql_close($conn); }else { ?> <form method = "post" action = "<?php $_PHP_SELF ?>"> <table width = "400" border =" 0" cellspacing = "1" cellpadding = "2"> <tr> <td width = "100">ID1</td> <td><input name = "id" type = "text" value"1" id = "id"></td> </tr> <tr> <td width = "100">První</td> <td><input name = "prvni" type = "text" id = "prvni"></td> </tr> <tr> <td width = "100"> </td> <td> </td> </tr> <tr> <td width = "100"> </td> <td> <input name = "update" type = "submit" id = "update" value = "Update"> </td> </tr> </table> </form> <?php } ?> |
||
breeta Profil |
Já bych hlavně nevytahoval databázi přes mysql_connect, které je zastaralé www.php.net/manual/en/function.mysql-connect.php požij raději PDO.
|
||
NoxOne Profil |
#4 · Zasláno: 15. 1. 2021, 14:27:59
Tak myslím že o to tu nešlo, a když by chtěl "bindovat" tak snad použije mysqli.
Dle všeho chce uložit jeden formulář a použití PDO by bylo jako vzít rotačák na komára. |
||
breeta Profil |
#5 · Zasláno: 15. 1. 2021, 15:15:54
NoxOne:
PDO je základ k připojení databází, nevím proč by to měl být rotačák, neradím mu ORM. Napsal jsem že to je zavrženo a měl by to přespat, nech to na něm Pomocí (MySQLi Procedural) <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDB"; // Create connection $conn = mysqli_connect($servername, $username, $password, $dbname); // Check connection if (!$conn) { die("Connection failed: " . mysqli_connect_error()); } $sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2"; if (mysqli_query($conn, $sql)) { echo "Record updated successfully"; } else { echo "Error updating record: " . mysqli_error($conn); } mysqli_close($conn); ?> PDO <?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = "myDBPDO"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "UPDATE MyGuests SET lastname='Doe' WHERE id=2"; // Prepare statement $stmt = $conn->prepare($sql); // execute the query $stmt->execute(); // echo a message to say the UPDATE succeeded echo $stmt->rowCount() . " records UPDATED successfully"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?> |
||
Kleciss Profil |
#6 · Zasláno: 15. 1. 2021, 16:47:57
NoxOne:
Po vložení tvého kodu vypise chybu Parse error: syntax error, unexpected 'Updated' (T_STRING) in /home/users/kubin/hasicibutovice.hys.cz/web/event/test.php on line 33 |
||
Firibix Profil |
#7 · Zasláno: 15. 1. 2021, 17:52:56
Reakce na Klecisse:
Na řádku 18 není ukončený řetězec, stačí používat nějaké PHP IDE, které na případné syntaktické chyby v kódu upozorní a zvýrazní je. Navíc v SQL dotazu chybí uvozovky okolo řetězce $prvni (pokud to má být řetězec).
Ten kód je psán nejen zastaralým ( mysql_ * funkce) způsobem, jak píše breeta, ale hlavně obsahuje bezpečnostní díru ve formě SQL injection. Kdokoliv ti tak může celou databázi smazat. Veškeré proměnné v SQL dotazu je třeba escapovat pomocí funkce mysql_real_escape_string .
|
||
Časová prodleva: 3 dny
|
|||
Kleciss Profil |
#8 · Zasláno: 18. 1. 2021, 10:25:49
Děkuji, vše funguje.
|
||
NoxOne Profil |
#9 · Zasláno: 18. 1. 2021, 11:46:51
To že vše funguje ale neznamená že je to správně. :)
|
||
Kleciss Profil |
#10 · Zasláno: 18. 1. 2021, 17:02:40
NoxOne:
Pro kontrolu: Jen mi funkce update přepisuje všechny sloupce v řádku, když zanechám políčko z formuláře prázdné, nevíte jak tohle vyřešit? Děkuji <?php $prvni = (isset($_POST['prvni'])) ? $_POST['prvni'] : ''; $druhy = (isset($_POST['druhy'])) ? $_POST['druhy'] : ''; $treti = (isset($_POST['treti'])) ? $_POST['treti'] : ''; $ctvrty = (isset($_POST['ctvrty'])) ? $_POST['ctvrty'] : ''; $id = (isset($_POST['id'])) ? $_POST['id'] : ''; ?> <form method="POST"> <table> <tr> <td>Měsíc číslo:</td> <td><input name = "id" type = "text" id = "id"></td> </tr> <tr> <td>První víkend:</td> <td><input name = "prvni" type = "text" id = "prvni"></td> </tr> <tr> <td>Druhý víkend</td> <td><input name = "druhy" type = "text" id = "druhy"></td> </tr> <tr> <td>Třetí víkend</td> <td><input name = "treti" type = "text" id = "treti"></td></td> </tr> <tr> <td>Čtvrtý víkend</td> <td><input name = "ctvrty" type = "text" id = "ctvrty"></td></td> </tr> <br /> <input type="submit" value="Přidat událost" > </table> </form> <?php $servername = "localhost"; $username = "kubin"; $password = "xxxx"; $dbname = "kalendar20"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "UPDATE leden SET prvni='$prvni' , druhy='$druhy' , treti='$treti' , ctvrty='$ctvrty' WHERE id='$id'"; if ($conn->query($sql) === TRUE) { echo "Přidání bylo úspěšné."; } else { echo "Error updating record: " . $conn->error; } $conn->close(); ?> <?php include 'ukaz.php'; ?> |
||
anonym_ Profil * |
Kleciss:
Může za to podmínka na 8. řádku samozřejmě. Pokud není ID zadané, vůbec SQL dotaz nevolej. Otázkou zůstává, proč bych měl vyplňovat ID, to bys měl znás z URL, ne? Pokud musí z nějakého důvodu být vyplňované ručně, tak pokud není, nenastavuj $id prázdnou hodnotu, ale zastav zpracování.
|
||
NoxOne Profil |
#12 · Zasláno: 19. 1. 2021, 11:14:43
Kleciss:
anonym má pravdu. Ale není to tak jednoduché. Podle toho co vidím se to učíš a děláš základní chyby. Chce to si něco přečíst. Když chceš mít vše v jedné stránce tak to musí mít nějakou logiku chodu. Tvoje logika: 1. zjisti co je v $_POST ... když tam nic není tak to vyplníš prázdným znakem 2. formulář kde vyplníš $_POST 3. $_POST nacpeš bez nějaké ochrany do SQL 4. $_POST je prázdná a tak SQL přepíše vše protože si myslí že to tak chceš Jiný postup: 1. logika "byl vyplněn formulář ?" = $_POST něco obsahuje 2. $_POST ošetři a pošli na zpracování SQL 3. $_POST nic neobsahuje = zobraz formulář 4. protože $_POST nic neobsahuje zakaž volání SQL dobrá rada ... na začátek si dej print_r($_POST); ať vidíš co ti přijde z formuláře. Předpokládám že "id" je číslo řádku v DB tak si před tím než spustíš update udělej jednoduchou kontrolu if($id>0) předpokladem je že jsi na začátku provedl kontrolu nebo přetypování na "int" $id=(int)$_POST['id'];
Proto by bylo vhodné změnit <td><input name = "id" type = "text" id = "id"></td> na <td><input name = "id" type = "number" id = "id"></td>
|
||
Keeehi Profil |
Protože to z předchozího příspěvků není jasné, tak raději doplním že změna na
<td><input name = "id" type = "number" id = "id"></td> |
||
NoxOne Profil |
#14 · Zasláno: 19. 1. 2021, 17:52:25
Pravdu máš .... ale když se koukneš na to co Kleciss vypotil tak je ti jasné že tam není ani známka po ošetření proměnných.
|
||
Keeehi Profil |
#15 · Zasláno: 20. 1. 2021, 02:36:24
NoxOne:
Je mi to naprosto jasné. Také doufám že se s tím pokusí něco udělat. No a jelikož tomu evidentně moc nerozumí přišlo mi vhodné na to upozornit. Aby si nemyslel že stačí změnit typ inputu a má vyřešeno. To by se s úrovní zabezpečení dostal asi tak na úroveň registračního systému pro očkování. A jak víme, ten moc bezpečný nebyl. |
||
NoxOne Profil |
#16 · Zasláno: 20. 1. 2021, 11:16:10
Pravda pravdoucí bratře. Asi jako dálniční známky a WP. Šílenosti za xxx milionů a přitom spoustu lidí tady by to dalo lépe a za méně. :) Asi nechodí mezi normální lidi ani na netu. :)
|
||
Časová prodleva: 3 roky
|
0