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 |
#2 · Zasláno: 25. 9. 2016, 13:22:06
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'].")"; $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 |
#3 · Zasláno: 25. 9. 2016, 13:24:27
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 |
#4 · Zasláno: 25. 9. 2016, 13:31:27
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 |
#5 · Zasláno: 25. 9. 2016, 13:33:36
pak ale budu tedy muset udělat dvě podmínky pro INSERT, pokud budu vkládat datum a pokud nikoliv?
|
||
juriad Profil |
#6 · Zasláno: 25. 9. 2016, 14:09:56
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 |
#9 · Zasláno: 26. 9. 2016, 03:37:17
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í? |
||
Časová prodleva: 8 let
|
0