| 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: 6 let
|
|||
0