Stránka 3 z 3

Re: chyba v php

Napsal: 04 zář 2015 13:21
od pajacz17
Odstranil jsem czech_ci a nyní diakritika ok. Děkuji

Jak jste mi posílal poslední zápis, tak již to ověřovalo email, ale když jsem zadal jmeno, prijmeni, a email co není v databázi, tak to psalo "musí být vyplněna všechna pole". Bohužel jsem to nedokázal upravit, tak jsem použil proměnou $sqlprikaz a příkaz mysql_db_query.
Myslel jsem, že když na začátku je použito:

Kód: Vybrat vše

 mysql_select_db("sprava")or die("Databáze neexistuje"); 

tak že pak stačí pro provedení akce

Kód: Vybrat vše

 mysql_query("INSERT INTO odberatele (id, jmeno, prijmeni, email, datum) VALUES ('', '$jmeno', '$prijmeni', '$email', '',)") or die("Data se nezapsala do databáze");  
, ale to mi nefungovalo a byl výpis data se nezapsala do databáze.

Re: chyba v php

Napsal: 04 zář 2015 13:38
od Petr Hnátek
A měl jste zápis podmínky přesně jak jsem napsal?

Tzn.:

Kód: Vybrat vše

if (!empty($jmeno && $prijmeni && $email)){ } 


Jen upozorním, že je tam negace:

Kód: Vybrat vše

!empty 

Re: chyba v php

Napsal: 04 zář 2015 14:27
od pajacz17
Ano, negace tam byla. Celý Váš příklad jsem zkopíroval k sobě, ale právě to psalo že pole nejsou vyplněna i když byla. Vůbec jsem to nechápal, tak jsem si to upravil bez té negace, kde mi to funguje.

Kód: Vybrat vše


<?php
  $spojeni 
= mysql_connect("localhost","root","")or die("Žádné spojení s MySQL");
  mysql_select_db("newsletter")or die("Databáze neexistuje");
  MySQL_set_charset('utf8_czech_ci');
  
  mysql_query
("SET NAMES 'utf8_czech_ci'");
  
  $jmeno 
= $_POST['jmeno'];
  $prijmeni = $_POST['prijmeni'];
  $email = $_POST['email'];
  
  $sqlprikaz 
= "INSERT INTO odberatele (id, jmeno,prijmeni,email, datum) VALUES ( '', '$jmeno', '$prijmeni', '$email', '')";
  
  $email_form 
= $_POST['email'];
  $email_data = mysql_query("SELECT email FROM odberatele WHERE email='$email_form'");
  $email = mysql_fetch_array($email_data);
  
  

  
  if 
(empty($_POST['jmeno'] && $_POST['prijmeni'] && $_POST['email'])) 
     
{
     echo "Je potreba vyplnit všechny pole! <br /> 
     <a href='http://localhost'>Zpět na formulář:</a>"
;
     }
     
  elseif 
($email_form == $email['email'])
     {
     mysql_close($spojeni);
     echo "Tento email je již zaregistrován. Použijte prosím jiný email.";
     }
     
  elseif 
(mysql_db_query("newsletter",$sqlprikaz,$spojeni)or die ("Data nejsou zapsána do databáze"))  
         
{
         mysql_close($spojeni) or die ("Není uzavřeno");
         echo "Děkujeme za registraci";
         }   
                           
  else   
           
{
            mysql_close($spojeni) or die ("Nepodařilo se zavřít databázi");
            echo "Registrace se nepovedla";
           }
  
  ?>
 


Já mám asi guláš v těch sql příkazech.
Zkoušel jsem si pak napsat příklad na vymazání emailu z databáze.

Kód: Vybrat vše


<?php
  $spojeni 
mysql_connect("localhost","root","")or die("Žádné spojení s MySQL");
  
mysql_select_db("newsletter")or die("Databáze neexistuje");
  
mysql_set_charset('utf8') or die("Nelze nastavit znakovou sadu");
  
  
mysql_query("SET NAMES 'utf8_czech_ci'");
  
  
  
$smazat_email $_POST['delete_email'];
  
  
  
$email_delete $_POST['delete_email'];
  
$email_data mysql_query("SELECT email FROM odberatele WHERE email='$email_delete'");
  
$email mysql_fetch_array($email_data);
  
  
$sqlprikaz "DELETE email FROM odberatele WHERE email = $smazat_email";
  
  
  
  if (empty(
$smazat_email))
     {
     
mysql_close($spojeni) or die ("Není uzavřena databáze");
     echo 
"Musíte zadat emailovou adresu!";
     }
     
  elseif (
$email['email'] !== $_POST['delete_email'])  
         {
         
mysql_close($spojeni) or die ("Není uzavřeno");
         echo 
"Tento email není registrován.";
         }
     
  elseif (
mysql_db_query("newsletter",$sqlprikaz,$spojeni) or die ("Data nejsou vyhledána v databázi"))  
         {
         
mysql_close($spojeni) or die ("Není uzavřeno");
         echo 
"Email byl vymazán.";
         }  
         
  else 
         {
         
mysql_close($spojeni) or die ("Není uzavřeno");
         echo 
"Nepodařilo se vymazat email";
         } 
                          
  
  
?>


První dvě podmínky fungují, ale u třetí, kde se to má vymazat to opět píše "Data nejsou vyhledána v databázi". Takže se to zase nepřipojilo. Prosím, kde dělám chybu? Snad se mi pak už rozsvítí. :oops:

Re: chyba v php

Napsal: 04 zář 2015 14:53
od Petr Hnátek
V SQL dotazu jsou chyby.

Kód: Vybrat vše

mysql_query("DELETE email FROM odberatele WHERE email = '$smazat_email')"; 


"Data nejsou vyhledána v databázi" - tuto hlášku máte kde?

Re: chyba v php

Napsal: 04 zář 2015 19:43
od CZechBoY
V empty nelze používat výrazy do verze 5.5. Navíc potom to empty nedává smysl - je k ničemu, protože tam stejně nakonec přijde boolean.

Kód: Vybrat vše

<?php
mysql_connect
('localhost', 'root', '') or die('Žádné spojení s MySQL');
mysql_select_db('newsletter') or die('Databáze neexistuje');
mysql_set_charset('utf8_czech_ci') or die('Nepodařilo se nastavit kodování');

$email_form = mysql_real_escape_string($_POST['email']);    // escapuj proti sql injection!
$email_data = mysql_query('SELECT email FROM odberatele WHERE email = \'' . $email_form . '\'');
$email_exists = mysql_fetch_assoc($email_data); // obsahuje FALSE nebo celý řádek v poli

// kontrola na prázdnotu políček a jestli je požadována metoda POST (odeslání formuláře metodou POST)
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || empty($_POST['jmeno']) || empty($_POST['prijmeni']) || empty($_POST['email'])) {
    echo 'Je potreba vyplnit všechny pole! <br> 
     <a href="http://localhost">Zpět na formulář:</a>'
;

    return; // nevykonávat nic dál
}

// hodnoty k vložení do databáze si vložím do asociativního pole (klíče budou použity jako názvy sloupců)
$insert = array (
    'jmeno'    => $_POST['jmeno'],
    'prijmeni' => $_POST['prijmeni'],
    'email'    => $_POST['email'],
    'datum'    => '',
);

// escapovní proti sql injection
// array_map zavolá funkce mysql_real_escape string na každém prvku pole
$insert_escaped = array_map('mysql_real_escape_string', $insert);

$sqlprikaz = 'INSERT INTO odberatele' .
                ' (`' . implode('`, `', array_keys($insert)) . '`)' .    // spojit klice z pole a oddelit, bude: `jmeno`, `prijmeni`, `email`, `datum`
                ' VALUES (\'' . implode('\', \'', $insert_escaped) . '\')';  // spojit hodnoty pole a oddelit, bude něco jako: 'jmeno', 'prijmeni', 'email', 'datum'

if ($email_exists !== false) {
    echo 'Tento email je již zaregistrován.<br>' . 
         
'Použijte prosím jiný email.';
}
 elseif (mysql_query($sqlprikaz) === false) {
    echo 'Registrace se nepovedla<br>' .
         'Popis chyby: ' . mysql_error();
}
 else {
    echo 'Děkujeme za registraci';
}
 


Takhle nějak bych to udělal já a mělo by to být ok.
Pro tebe asi nebudou čitelný věci jako array_keys, array_map, implode a proč se tomu tak děje. Kdybys použil nějakou knihovnu pro lepší práci s databází tak by to nebylo nutné ;-)

Re: chyba v php

Napsal: 06 zář 2015 16:18
od pajacz17
Petr Hnátek píše:V SQL dotazu jsou chyby.

Kód: Vybrat vše

mysql_query("DELETE email FROM odberatele WHERE email = '$smazat_email')"; 


"Data nejsou vyhledána v databázi" - tuto hlášku máte kde?


Tu hlášku mám v podmínce, když se nepodaří spojit s databází.

Kód: Vybrat vše

elseif (mysql_db_query("newsletter",$sqlprikaz,$spojeni) or die ("Data nejsou vyhledána v databázi"))  
         {
         
mysql_close($spojeni) or die ("Není uzavřeno");
         echo 
"Email byl vymazán.";
         }  
          

Re: chyba v php

Napsal: 06 zář 2015 16:23
od pajacz17
CZechBoY píše:V empty nelze používat výrazy do verze 5.5. Navíc potom to empty nedává smysl - je k ničemu, protože tam stejně nakonec přijde boolean.

Kód: Vybrat vše

<?php
mysql_connect
('localhost', 'root', '') or die('Žádné spojení s MySQL');
mysql_select_db('newsletter') or die('Databáze neexistuje');
mysql_set_charset('utf8_czech_ci') or die('Nepodařilo se nastavit kodování');

$email_form = mysql_real_escape_string($_POST['email']);    // escapuj proti sql injection!
$email_data = mysql_query('SELECT email FROM odberatele WHERE email = \'' . $email_form . '\'');
$email_exists = mysql_fetch_assoc($email_data); // obsahuje FALSE nebo celý řádek v poli

// kontrola na prázdnotu políček a jestli je požadována metoda POST (odeslání formuláře metodou POST)
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || empty($_POST['jmeno']) || empty($_POST['prijmeni']) || empty($_POST['email'])) {
    echo 'Je potreba vyplnit všechny pole! <br> 
     <a href="http://localhost">Zpět na formulář:</a>'
;

    return; // nevykonávat nic dál
}

// hodnoty k vložení do databáze si vložím do asociativního pole (klíče budou použity jako názvy sloupců)
$insert = array (
    'jmeno'    => $_POST['jmeno'],
    'prijmeni' => $_POST['prijmeni'],
    'email'    => $_POST['email'],
    'datum'    => '',
);

// escapovní proti sql injection
// array_map zavolá funkce mysql_real_escape string na každém prvku pole
$insert_escaped = array_map('mysql_real_escape_string', $insert);

$sqlprikaz = 'INSERT INTO odberatele' .
                ' (`' . implode('`, `', array_keys($insert)) . '`)' .    // spojit klice z pole a oddelit, bude: `jmeno`, `prijmeni`, `email`, `datum`
                ' VALUES (\'' . implode('\', \'', $insert_escaped) . '\')';  // spojit hodnoty pole a oddelit, bude něco jako: 'jmeno', 'prijmeni', 'email', 'datum'

if ($email_exists !== false) {
    echo 'Tento email je již zaregistrován.<br>' . 
         
'Použijte prosím jiný email.';
}
 elseif (mysql_query($sqlprikaz) === false) {
    echo 'Registrace se nepovedla<br>' .
         'Popis chyby: ' . mysql_error();
}
 else {
    echo 'Děkujeme za registraci';
}
 


Takhle nějak bych to udělal já a mělo by to být ok.
Pro tebe asi nebudou čitelný věci jako array_keys, array_map, implode a proč se tomu tak děje. Kdybys použil nějakou knihovnu pro lepší práci s databází tak by to nebylo nutné ;-)


Děkuji za názorný příklad. Php se teprve učím. Samozřejmě jsem pole prošel, ale praxe je druhá věc. Jinak určitě zápis od Petr Hnátek je pro mě zatím srozumitelnější. Výše uvedené příklady jsou teprve moje první. S tou knihovnou to bylo myšleno jak?

Re: chyba v php

Napsal: 10 zář 2015 11:17
od CZechBoY
Např. pdo nebo nějakou abstraktnější vrstvu dibi, atd.

Možná přehlednější, ale ne moc ošetřený stavy.

Re: chyba v php

Napsal: 10 zář 2015 11:53
od Petr Hnátek
Já jsem pouze odpovídal na dotaz tázajícího a ten se netýkal zabezpečení.