Autor Zpráva
smiesek
Profil
Snažila jsem se najít řešení na foru, ale nic mi z toho nepomohlo.

Mám následující problém, kdy v jednom případě mi to funguje, ale ve druhém nikoliv ač jsem vše skopírovala podle fungujícího, akorát má sloupec date pro vkládání data jiný význam.

Jde mi o to, že do databáze vkládám datum, které není povinné vyplnit. Sloupec v databázi mám typu Date a výchozí hodnotu nastavenou na NULL.

Nyní však, pokud vložím do databáze datum, tak se mi do sloupce přenese v podobě 2016-09-25, to je v pořádku.
Pokud však datum nezadám, do sloupce se mi přenese hodnota 0000-00-00, což nechci, potřebuju tam dostat hodnotu NULL - je i nastavena jako datový typ sloupce v databázi.

Podmínku pro nastavení hodnoty NULL při nezadání data v php mám
if ($data['datum_v'] == "0-0-0") $data['datum_v'] = NULL;

Vložení do databáze probíhá následovně
$query = "INSERT INTO noviny (vydavatel_id, datum_v) VALUES ('".$data['vydavatel_id']."', '". $data['datum_v'] ."')";

Tohle mi funguje a pouze jsem to kopírovala pro osoby a přepsala proměnné a už mi to nefunguje.

Ano, dočetla jsem se tu i něco o těch uvozovkách apod. ale je mi divné, že v prvním případě mi to funguje a pro další nikoliv :(

Jak jsem psala výše, tohle je druhý příklad pro zadávání datumu, v prvním případě pro zadávání data vydání mi to funguje, ale když jsem chtěla stejný postup implementovat pro datum narození, tak prostě nemohu tam NULL vůbec dostat.

Tabulku jsem se pokoušela i nově vytvořit bez záznamů a následně vkládat záznamy - dříve jsem do současné tabulky již se záznamy přidala sloupec pro datum narození, ale situace je stejná.

Děkuju za pomoc
juriad
Profil
smiesek:
Pokud chceš do databáze vložit NULL, máš dvě možnosti:
1) nevložit hodnotu do takového sloupce:
$query = "INSERT INTO noviny (vydavatel_id) VALUES ('".$data['vydavatel_id'].")";
2) vložit NULL, nikoli řetězec 'NULL':
$query = "INSERT INTO noviny (vydavatel_id, datum_v) VALUES ('".$data['vydavatel_id']."', NULL)";

Které řešení je v tvém případě vhodnější si musíš rozhodnout sama. Poznámka: některé databázové knihovny toto umí automaticky - poznají, zda vkládáš string nebo NULL a podle toho sestaví dotaz.
smiesek
Profil
juriad:
vložit NULL, nikoli řetězec 'NULL':

ale právě jak jsem psala v tom výše uvedeném případě na příkladu mi to funguje a vkládá se do sloupce hodnota NULL, ale když jsem to nyní úplně stejně udělala pro osoby, tak mi to nefunguje
juriad
Profil
Pokud vkládáš řetězec 'NULL', tak se jedná o nevalidní literál pro DATE a podle dokumentace je vložen 0000-00-00. Tedy to nesmí fungovat.

Invalid DATE, DATETIME, or TIMESTAMP values are converted to the ‘zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').
dev.mysql.com/doc/refman/5.7/en/datetime.html

Nejspíš se ty dva případy liší víc než si myslíš.
smiesek
Profil
pak ale budu tedy muset udělat dvě podmínky pro INSERT, pokud budu vkládat datum a pokud nikoliv?
juriad
Profil
Ee. Můžeš to udělat třeba takto:

function dataTypeEscape($link, $value) {
  if ($value == NULL) {
    return 'NULL';
  } elseif (is_string($value)) {
    return "'" . mysqli_real_escape_string($link, $value) . "'"; # uprav podle sebe
  } elseif (is_int($value) || is_float($value)) {
    return "$value";
  } else {
    die("Unknown data type in dataTypeEscape"); # lépe asi zalogovat a vyhodit výjimku?
  }
}

$query = sprintf("INSERT INTO noviny (vydavatel_id, datum_v) VALUES (%s, %s)", 
  dataTypeEscape($link, $data['vydavatel_id']), 
  dataTypeEscape($link, $data['datum_v'])
);

Je to hodně primitivní, na toto existují hotová řešení.
smiesek
Profil
aha děkuju tak to je složité na mě a nerozumím zápisy, čekala jsem, tedy doufala, ještě jednodušší řešení pochopitelné pro blbečky

proč se ram pracuje s proměnnou $link?
Keeehi
Profil
smiesek:
ještě jednodušší řešení pochopitelné pro blbečky
Jednodušší řešení by bylo
$query = "INSERT INTO noviny (vydavatel_id, datum_v) VALUES ('".$data['vydavatel_id']."', ". ($data['datum_v'] === null ? 'NULL' : "'$data[datum_v]'" ) .")";

To proč je to od juriad složitější je proto, že tam přidal ochranu proti tomu, aby ti někdo rozbil svým vstupem SQL dotaz. Vzhledem k tomu, že tomu nerozumíš a tedy bude i zbytek kódu plný bezpečnostních děr, můžeš klidně použít tuto nezabezpečenou variantu*. Jen počítej s tím, že v budoucnu ti někdo tu stránku může "hacknout".

* Tiše předpokládám, že v poli data jsou hodnoty zadávané uživatelem, tedy plně pod jeho kontrolou.
smiesek
Profil
Keeehi:
přidal ochranu
děkuju tomu Tvému rozumím a určitě mi to zase usnadnilo o několik řádků, kdy jsem se snažila použít svou úpravu řešení, které mi funguje, ale nyní jej mohu zredukovat:
            if ($data['umrti'] !== "0-0-0") {
                $query = "INSERT INTO noviny (vydavatel_id, datum_v) VALUES ('". $data['vydavatel_id'] ."', '". $data['datum_v'] ."')";
            } else {
                $query = "INSERT INTO noviny (vydavatel_id, datum_v) VALUES ('". $data['vydavatel_id'] ."', NULL)";
            }

Ochranu vstupních dat formuláře používám již dříve v kódu:
$data['datum_v'] = MyDate((int)$_POST["datum_v"]);

pokud tím máš na mysli ochrana proti rozbití?

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