chyba v php

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

pajacz17
Level 3
Level 3
Příspěvky: 592
Registrován: 22 bře 2014 22:31

Re: chyba v php

Příspěvek 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.
Uživatelský avatar
Petr Hnátek
Level 3.5
Level 3.5
Příspěvky: 654
Registrován: 13 lis 2013 20:48

Re: chyba v php

Příspěvek 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 
pajacz17
Level 3
Level 3
Příspěvky: 592
Registrován: 22 bře 2014 22:31

Re: chyba v php

Příspěvek 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:
Uživatelský avatar
Petr Hnátek
Level 3.5
Level 3.5
Příspěvky: 654
Registrován: 13 lis 2013 20:48

Re: chyba v php

Příspěvek 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?
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: chyba v php

Příspěvek 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é ;-)
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
pajacz17
Level 3
Level 3
Příspěvky: 592
Registrován: 22 bře 2014 22:31

Re: chyba v php

Příspěvek 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.";
         }  
          
pajacz17
Level 3
Level 3
Příspěvky: 592
Registrován: 22 bře 2014 22:31

Re: chyba v php

Příspěvek 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?
Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: 20 srp 2008 14:02
Bydliště: Brno
Kontaktovat uživatele:

Re: chyba v php

Příspěvek od CZechBoY »

Např. pdo nebo nějakou abstraktnější vrstvu dibi, atd.

Možná přehlednější, ale ne moc ošetřený stavy.
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Uživatelský avatar
Petr Hnátek
Level 3.5
Level 3.5
Příspěvky: 654
Registrován: 13 lis 2013 20:48

Re: chyba v php

Příspěvek od Petr Hnátek »

Já jsem pouze odpovídal na dotaz tázajícího a ten se netýkal zabezpečení.
Odpovědět
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Chyba CPU na desce
    od petan320 » » v Problémy s hardwarem
    16 Odpovědi
    14684 Zobrazení
    Poslední příspěvek od petr22
  • Sqlite - systémová chyba
    od cindy the skull » » v Vše ostatní (sw)
    6 Odpovědi
    14848 Zobrazení
    Poslední příspěvek od atari
  • Chyba příkazový řádek
    od zik9 » » v Windows 11, 10, 8...
    4 Odpovědi
    5870 Zobrazení
    Poslední příspěvek od zik9
  • prohližeč událostí id 1796 chyba
    od walderan » » v Problémy s hardwarem
    9 Odpovědi
    8916 Zobrazení
    Poslední příspěvek od walderan
  • Windows Update nelze stáhnout, chyba 0x80070246
    od Rewqa » » v Windows 11, 10, 8...
    11 Odpovědi
    11672 Zobrazení
    Poslední příspěvek od Rewqa

Zpět na „Programování a tvorba webu“