Autor Zpráva
JardaB
Profil
Zdravím, u jistého hostingu jsem narazil na následující problém, pravděpodobně při změně verze MySQL

Tohle mi fungovalo ještě včera
$values="('$klient','$k_mail','$jmeno','$hash','$datum','$ip','9','3000','')";

Dnes pokud neuvedu i hodnotu poslední položky, tak se neuloží, tedy:
$values="('$klient','$k_mail','$jmeno','$hash','$datum','$ip','9','3000','0')";

Jde o položku typu integer. Dříve když nebylo uvedeno, tak se použila výchozí hodnota dle zadání struktury tabulky. Vysvětlí mi prosím někdo tuto problematiku?
Radek9
Profil
JardaB:
1) Proč zapisuješ čísla do apostrofů?
2) Pro tyhle účely by se mělo používat klíčové slovo DEFAULT. Tvůj způsob (prázdné apostrofy) je dost pofidérní.
3) Řešíš SQL injection?
JardaB
Profil
Mno někdy se mi na téhle diskusi líbí to, že místo odpovědi na kterou se ptám dostanu otázky na mou otázku, nicméně to beru :)
Neřeším tu nyní zápis a ani SQL injection, ale důvod, proč se to tak stalo. Jde navíc o kod, který spravuji klientovi a ten jsem já nevytvářel.

Radek9:
1) Proč zapisuješ čísla do apostrofů?
když ručně vložím do dtb data tak to samo generuje následující: VALUES ('10', '20', '', '', '', '', '', '', '') - proč to tedy tak generuje, když je to chybně?
TomášK
Profil
Viz nastavení strict mode: dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-strict

proč to tedy tak generuje, když je to chybně?
Protože je chybný generátor, ať už je to cokoliv.
Keeehi
Profil
JardaB:
proč to tedy tak generuje, když je to chybně?
Tak možnosti jsou dvě. Buď ty sloupce jsou v tabulce opravdu textového a ne číselného typu a pak by si pravděpodobně zasloužily opravu. Nebo jsou sloupce správně ale používáš pro vkládání dat nějaký program který si práci ulehčuje a nezjišťuje si datový typ sloupce, protože předpokládá, že si databáze případnou konverzi prostě udělá.

Podle dokumentace jsou v MySQL dvě možnosti, jak vložit defaultní hodnotu do databáze. Buď tu hodnotu vynecháš (v takovém případě ale musíš vypsat do dotazu sloupce) nebo jako hodnotu použiješ klíčové slovo DEFAULT.
JardaB
Profil
Keeehi:
Podle dokumentace jsou v MySQL dvě možnosti, jak vložit defaultní hodnotu do databáze. Buď tu hodnotu vynecháš (v takovém případě ale musíš vypsat do dotazu sloupce) nebo jako hodnotu použiješ klíčové slovo DEFAULT.

Ano tohle mi došlo, nicméně pár dnů zpět to fungovalo i když se hodnota nevynechala a nebylo uvedeno DEFAULT.. Chápu že to je špatně, ale klientovi to šlapalo 5 let.. Hosting tvrdí, že neměnili žádné nastavení ani verzi

Tak možnosti jsou dvě. Buď ty sloupce jsou v tabulce opravdu textového a ne číselného typu a pak by si pravděpodobně zasloužily opravu. Nebo jsou sloupce správně ale používáš pro vkládání dat nějaký program který si práci ulehčuje a nezjišťuje si datový typ sloupce, protože předpokládá, že si databáze případnou konverzi prostě udělá

generuje to přímo phpmyadmin a datové typy těch sloupců jsou opravdu integer

Problém chápu a vyřeším jej, jen mne zajímaly věci kolem...
Radek9
Profil
JardaB:
Mno někdy se mi na téhle diskusi líbí to, že místo odpovědi na kterou se ptám dostanu otázky na mou otázku
Já ti odpověděl, jestli sis nevšiml. (Viz bod 2.) Ty doplňující otázky sem nepíšu proto, abych si rejpnul, ale proto, že jsou ve většině případů vhodné. Kór tady, když opravdu neexistuje důvod zapisovat čísla do apostrofů. Nebo obecně vkládat hodnoty do SQL tímto způsobem. Podívej se na prepared statements, ulehčíš si život.
Kajman
Profil
JardaB:
generuje to přímo phpmyadmin a datové typy těch sloupců jsou opravdu integer
Tak jim to nahlašte, ať si to opraví. Např. adminer nezadané hodnoty v insertu vynechá, ale čísla také dává do apostrofů.

Zkontroloval jste si tedy, v jakém sql módu je databáze, zda je to tím? Lze ji nastavovat i pro session, nemusí to být změnou nastavení serveru.

Obecně je u mysql lepší mít při vývoji ten sql mód nastavený přísnější. Ale i u povolnějšího by předchozí insert měl vracet varování.

Edit: ještě se můžete podívat, kdy byla naposledy mysql restartována, jestli Vám hosting nelže
show status like 'uptime%'

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