Určite máte túto banalitu už dávno vyriešenú, no ja sa nemôžem dopátrať nikde odpovede.
Ako prosím riešite ak máte formulár s prázdnou hodnotou, kde môže byť len číslo.
Z tohto formulára chcete zapísať hodnoty do databázy, ale niektoré polia sú prázdne.
Pri char to nie je problém, skrátka zostane v databáze prázdne políčko ale pri int to problém je, nakoľko sa z formulára posiela prázdna hodnota, ktorá je braná ako string. Ja by som potreboval, aby to tam dávalo NULL, no a nulové hodnoty mám povolené, ale skrátka, pretože to nie je int, tak sa zápis vôbec nestane.
#1pepko143
no bylo by dobré ukázat kousek kodu, hlavně to vkládací SQL, předpokládám že je to PHP a tomu je jedno jaký formát je proměnná, automaticky si je konvertuje dle potřeby, hlavní je správně formulovat SQL insert.
resp před použitím proměnných z formuláře je můžeš projít na prázdné hodnoty a ty nahradit podle pořeb defautni hodnotou.
případně se docela často dělá validace vyplnění formuláře ještě před odesláním na server, (např jestli jsou vyplněná primární pole, jestli jsou správné formáty např u emailu apod)
Aj tak mi príde divné, že musím takto ošetriť prázdne hodnoty.
Ide o to, že sa nemusia vyplniť všetky hodnoty vo formulári a budú sa môcť pridať, upraviť neskôr daným užívateľom. Doteraz som robil len formuláre, kde sa musia vyplniť všetky hodnoty, poprípade to neboli prázdne intiger hodnoty. Dúfal som v nejaké elegantnejšie riešenie, ako toto, čo som pridal ja.
Ak dám do formuálru hodnotu, tak to funguje, tiež ak pridám miesto: '$sovolne' NULL tak to ide.
Nefunguje mi to však tak, že sa snažím vložiť do premennej NULL a neviem prečo.
Už som skúšal všetko možné, tiež som hľadal na fórach, avšak v podstate tam písali len o tom čo som už skúsil. Prečo nemôže zobrať ten databázový UPDATE hodnotu NULL z tej premennej?
Skúšal som to aj cez pole, ale bez úspechu...
No a dole v tom UPDATE ich nemôžem odstrániť okolo premennej, potom by to nefungovalo.
Keby tam vložím NULL na priamo, bez apostrofov, tak áno, potom by to fungovalo, lenže to neplní účel.
Ja potrebujem aby sa tam doplnilo NULL len vtedy keď sa odošle v updatovacom formulári prázdna hodnota.
No a to mi jednoducho nechce vziať do premennej, keď to pozerám cez print_r(), tak mi nič nevypíše.
#14pepko143
Pokud máš na mysli $sql, tak to je Heredoc, který používám u víceřádkových stringů. Navíc u něho nemusím escapovat uvozovky, takže se hodí i pro kusy HTML, do kterých chci vkládat objekty. No vlastně ... HTML do PHP už nedávám.
Občas potřebuji udělat var_dump($sql), takže dotaz v proměnné se hodí.
Parametry metody execute() mohou být klíčové nebo neklíčové. Je dobré v aplikaci dodržovat jeden z těchto stylů, i když nutné to není.
Je fajn, že ti to funguje.
Nahlásit jako SPAM
IP: 46.135.93.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
UPDATE vstupnakontrola SET sovolne = NULL - toto je dotaz, jak to ma bys spravne s nul
UPDATE vstupnakontrola SET sovolne = '$sovolne'"; - to je tvuj php kod a vyrobi dotaz
UPDATE vstupnakontrola SET sovolne = 'NULL' - coz je retezec obsahujici text NULL nebo treba autobus
UPDATE vstupnakontrola SET sovolne = 'autobus'
Jenze text 'NULL' nebo 'autobus' je uplne neco jineho nez konstanta NULL.
Nemal som problém s rozoznaním stringu od konštanty.
Mal som problém, že som nevedel uložiť konštantu do premennej.
Skrátka mi ju vôbec nebralo, pritom pri INSERT na inej stránke mi to fungovalo.
Napokon sa to vyriešilo UPDATOM cez PDO.
PDO bolo koniec koncov použité aj pri INSERTE na inej stránke.
Neviem síce prečo to PDO vyriešilo, ale funguje to.
Ak by si vedel, prečo to v PDO ten NULL do premennej berie a klasické vloženie do db cez query nie, tak to by bolo zaujímavé vedieť. Pretože vloženie hodnôt mi fungovalo aj cez query, klasické vkladanie do db. No konštantu NULL to už nebralo, to až spôsob zápisu do db cez PDO.
$sovolne = null;
echo "SELECT * FROM vstupnakontrola WHERE sovolne='$sovolne'"
// vypíše string:
SELECT * FROM vstupnakontrola WHERE sovolne=''
Vidíš tam ty dva apostrofy na konci? Ty tam být nemají a místo nich má být NULL.
Když to děláš přes prepare(), tak se tam ty apostrofy nedostanou, protože znak ? je nahrazen slovem NULL. Bez apostrofů. Pokud místo NULL zadáš na vstupu nějaký string, tak ten se v execute() escapuje, obalí apostrofy a jako celek se vlepí místo toho otazníku.
Pro rejpaly: Ano, popsal jsem emulované prepared statements, které jsou u MySQL default. Pro většinu aplikací je to zcela vyhovující.
Nahlásit jako SPAM
IP: 46.135.95.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
$sovolne = null;
echo "SELECT * FROM tabulka WHERE prom='$prom'";
// SELECT * FROM tabulka WHERE prom='' -- string, protoze tam mas apostrofy
$sovolne = "null";
echo "SELECT * FROM tabulka WHERE prom='$prom'";
// SELECT * FROM tabulka WHERE prom='null' -- string, protoze tam mas apostrofy
$sovolne = "null";
echo "SELECT * FROM tabulka WHERE prom=$prom"; // smazane apostrofy
// SELECT * FROM tabulka WHERE prom=null -- null jako null
Jinymi slovy, ten dotaz mas spatne napsany, proto ti to nefungovalo.
Prepare tam ty apostrofy pridava samo, pokud je treba. Ono to zalezi natom, zda mas ve structure tabulky povolene, ze tam muze byt NULL. Kdyz ne, tak ti z toho udela normal string 'NULL'.
#19peter
Ono to zalezi natom, zda mas ve structure tabulky povolene, ze tam muze byt NULL. Kdyz ne, tak ti z toho udela normal string 'NULL'.
Nezáleží. Ve chvíli odesílání dotazu klient ještě neví nic o struktuře tabulky, nemůže tedy ani tušit o predikátu NOT NULL. Odešle tedy null, který je serverem nahrazen defaulní hodnotou (např. autoincrementem) nebo je dotaz odmítnut.
Nahlásit jako SPAM
IP: 46.135.86.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.