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: březen 14
Pohlaví: Muž
Stav:
Offline

Re: chyba v php

Příspěvekod pajacz17 » 04 zář 2015 13:21

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.

Reklama
Uživatelský avatar
Petr Hnátek
Level 3.5
Level 3.5
Příspěvky: 654
Registrován: listopad 13
Pohlaví: Muž
Stav:
Offline

Re: chyba v php

Příspěvekod Petr Hnátek » 04 zář 2015 13:38

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: březen 14
Pohlaví: Muž
Stav:
Offline

Re: chyba v php

Příspěvekod pajacz17 » 04 zář 2015 14:27

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: listopad 13
Pohlaví: Muž
Stav:
Offline

Re: chyba v php

Příspěvekod Petr Hnátek » 04 zář 2015 14:53

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: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: chyba v php

Příspěvekod CZechBoY » 04 zář 2015 19:43

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: březen 14
Pohlaví: Muž
Stav:
Offline

Re: chyba v php

Příspěvekod pajacz17 » 06 zář 2015 16:18

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: březen 14
Pohlaví: Muž
Stav:
Offline

Re: chyba v php

Příspěvekod pajacz17 » 06 zář 2015 16:23

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: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: chyba v php

Příspěvekod CZechBoY » 10 zář 2015 11:17

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: listopad 13
Pohlaví: Muž
Stav:
Offline

Re: chyba v php

Příspěvekod Petr Hnátek » 10 zář 2015 11:53

Já jsem pouze odpovídal na dotaz tázajícího a ten se netýkal zabezpečení.


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • chyba 0xc0000142
    od Culter » 24 říj 2023 21:59 » v Windows 11, 10, 8...
    1
    1830
    od Roman Tyčka Zobrazit poslední příspěvek
    25 pro 2023 18:41
  • chyba na webu
    od teichmann.ondrej » 04 zář 2023 15:45 » v Programování a tvorba webu
    1
    1967
    od petr22 Zobrazit poslední příspěvek
    04 zář 2023 16:09
  • Kritická chyba Kernel Příloha(y)
    od Domoo27 » 07 úno 2024 00:58 » v Problémy s hardwarem
    9
    1464
    od Domoo27 Zobrazit poslední příspěvek
    12 úno 2024 23:54
  • Windows 98 chyba při startu ......VXD Příloha(y)
    od Radovan-kocour » 24 říj 2023 18:49 » v Windows 11, 10, 8...
    5
    1428
    od Radovan-kocour Zobrazit poslední příspěvek
    25 říj 2023 15:24
  • Chyba po zapnutí notebooku. Příloha(y)
    od paolov » 17 říj 2023 10:52 » v Problémy s hardwarem
    9
    1724
    od petr22 Zobrazit poslední příspěvek
    21 říj 2023 13:29

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

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti