Autor Zpráva
Kleciss
Profil
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
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
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
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
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
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.
Kleciss
Profil
Děkuji, vše funguje.
NoxOne
Profil
To že vše funguje ale neznamená že je to správně. :)
Kleciss
Profil
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
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>
je jen změna pro větší uživatelskou přívětivost. Na bezpečnost to nemá žádný vliv. Tedy ta předtím zmíněná ochrana se musí provádět i tak.
NoxOne
Profil
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
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
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. :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0