Prázdny string pre int – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Prázdny string pre int – MySQL – Fórum – Programujte.comPrázdny string pre int – MySQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
pepko1430
Newbie
26. 7. 2019   #1
-
0
-

Ahojte

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.

Nahlásit jako SPAM
IP: 213.151.235.–
MilanL+1
Grafoman
26. 7. 2019   #2
-
0
-

#1 pepko143
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)

Nahlásit jako SPAM
IP: 193.165.115.–
pepko1430
Newbie
29. 7. 2019   #3
-
0
-

#2 MilanL

Ahoj Milan, ďakujem za odpoveď. Napokon som to vyriešil takto:

<?php include '../_inc/config.php' ?>

<?php

/*príjem hodnôt z formulára*/

$nadoba 	 = htmlspecialchars($_POST['nadoba']);
$odroda     	 = htmlspecialchars($_POST['odroda']);
$faza       	 = htmlspecialchars($_POST['faza']);
$sovolne    	 = htmlspecialchars($_POST['sovolne']);

if (empty($sovolne)) {
	$sovolne = NULL;
}


$db = DB();
$data = $db->prepare("
			INSERT INTO vstupnakontrola
			(nadoba, odroda, faza, sovolne)
			VALUES 
			(:nadoba,:odroda,:faza,:sovolne)
                    ");
												                    
$data->execute(array(          
                     ":nadoba"          => $nadoba,
                     ":odroda"          => $odroda,
                     ":faza"         	=> $faza,                       
                     ":sovolne"   	=> $sovolne
                     ));				                   
?>

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.

Nahlásit jako SPAM
IP: 213.151.235.–
Paja
~ Anonymní uživatel
25 příspěvků
30. 7. 2019   #4
-
0
-

#3 pepko143
Elegantnější řešení má řešit framework.

htmlspecialchars by mělo být až při výpisu, ne při ukládání dat.

Pak lze (v PHP 7) použít:

$data->execute(array(          
                     ":nadoba"          => $_POST["nadoba"]??null,
                     ":odroda"          => $_POST["odroda"]??null,
                     ":faza"         	=> $_POST["faza"]??null,                    
                     ":sovolne"   	=> $_POST["sovolne"]??null
                     ));			

Pro starší PHP (které už by neměl nikdo používat), pak delší zápis: 

":nadoba" => isset($_POST["nadoba"]) ? $_POST["nadoba"] : null;
Nahlásit jako SPAM
IP: 84.42.247.–
gna
~ Anonymní uživatel
1891 příspěvků
30. 7. 2019   #5
-
0
-

#4 Paja
Problém je, že tam má prázdný string. A kdyby tam měl null, tak se tam místo něj vloží null. To je hodně užitečné.

Nahlásit jako SPAM
IP: 213.211.51.–
pepko1430
Newbie
6. 8. 2019   #6
-
0
-

Ahojte

Prosím Vás, začal som mať tento problém pri UPDATE.

Pri INSERT mi to funguje tak ako som uviedol vyššie, inak ďakujem za rady.

Ale pri UPDATE mi to nechce fungovať ani za svet.

Tu je kód:

<?php require_once "../_inc/config.php" ?>
<?php 

        $id 		= trim($_POST['id']);
	$nadoba 	 = trim($_POST['nadoba']);
	$odroda     	 = trim($_POST['odroda']);
	$faza       	 = trim($_POST['faza']);
	$sovolne    	 = trim($_POST['sovolne']);

if (empty($sovolne)) { $sovolne = NULL; }


	$db = DB();
	$edit_item = $db->query("
				UPDATE vstupnakontrola 
				SET nadoba = '$nadoba',
				odroda 	   = '$odroda',
				faza	  = '$faza',
				sovolne	  = '$sovolne'
				WHERE id_vstupnakontrola = '$id'
						");    
					
	if ($edit_item ) {
		die(header("Location: ../pages/zaznam.php"));
	} else {
		echo 'Nastala chyba, skúste to prosím neskôr';
		echo '<a class="menu_button" href=" <?php echo BASE_URL; ?>../pages/profile.php ">Domov</a>';
		   }

 ?>

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...

Nahlásit jako SPAM
IP: 213.151.235.–
Kit+15
Guru
6. 8. 2019   #7
-
0
-

#6 pepko143
NULL nesmí být v apostrofech.

BTW: je mi divné, že jsi přestal používat prepared statements.

Nahlásit jako SPAM
IP: 46.135.92.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
pepko1430
Newbie
6. 8. 2019   #8
-
0
-

#7 Kit
Veď nie je v apostrofoch.

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.

Nahlásit jako SPAM
IP: 213.151.235.–
Kit+15
Guru
6. 8. 2019   #9
-
0
-

#8 pepko143
Ten NULL máš v apostrofech. Zkus si tohle:

$sovolne = NULL;
$sql = "UPDATE vstupnakontrola SET sovolne = '$sovolne'";
var_dump($sql);

// výstup:           string(39) "UPDATE vstupnakontrola SET sovolne = ''"
// jenže potřebuješ: string(41) "UPDATE vstupnakontrola SET sovolne = NULL"

Použitím prepared statements tento problém sám zmizí.

Nahlásit jako SPAM
IP: 46.135.92.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
pepko1430
Newbie
6. 8. 2019   #10
-
0
-

#9 Kit
Neviem či ti rozumiem.

Ja nechcem defaultne nastaviť sovolne na NULL.
Keby tam dám NULL ako to tu píšeš, tak by to prešlo.

	$db = DB();
	$edit_item = $db->query("
				UPDATE vstupnakontrola 
				SET nadoba = '$nadoba',
				odroda 	   = '$odroda',
				faza	  = '$faza',
				sovolne	  = NULL
				WHERE id_vstupnakontrola = '$id'
						");

Lenže ja potrebujem aby sa nastavilo NULL iba v prípade, že sa pošle prázdna hodnota vo formuláry.

Ideálne keby funguje tento príkaz:

if (empty($sovolne)) { $sovolne = NULL; }
Nahlásit jako SPAM
IP: 178.40.210.–
Kit+15
Guru
7. 8. 2019   #11
-
+1
-
Zajímavé

#10 pepko143
Psal jsem, že máš použít prepared statement, že ten problém sám zmizí. No nic, dohnal jsi mne k nejhoršímu: 

$id = trim($_POST['id']);
$nadoba = trim($_POST['nadoba']);
$odroda = trim($_POST['odroda']);
$faza = trim($_POST['faza']);
$sovolne = trim($_POST['sovolne']);
if (empty($sovolne)) {
    $sovolne = NULL;
}

$db = DB();

$sql = <<<SQL
UPDATE vstupnakontrola
    SET nadoba = :nadoba,
        odroda = :odroda,
        faza = :faza,
        sovolne = :sovolne
    WHERE id_vstupnakontrola = :id
SQL;

$update = $db->prepare($sql);
$result = $update->execute([
    "nadoba" => $nadoba,
    "odroda" => $odroda,
    "faza" => $faza,
    "sovolne" => $sovolne,
    "id_vstupnakontrola" => $id,
]);
Nahlásit jako SPAM
IP: 46.135.92.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
pepko1430
Newbie
7. 8. 2019   #12
-
0
-

#11 Kit
Ďakujem za obsiahlejšiu odpoveď Kit!

Nepomohlo mi to síce v tejto formulácii, ale ma to nasmerovalo.

Fungovalo mi až toto:

$db = DB();
$data = $db->prepare("

UPDATE vstupnakontrola
    SET nadoba = ?,
        odroda = ?,
        faza = ?,
        sovolne = ?
    WHERE id_vstupnakontrola = ? ");

$vysledok = $data->execute(array( 				
					
				$nadoba,
				$odroda,
				$faza,
				$sovolne,
				$id
			));

Čerpal som z: https://jecas.cz/pdo

Nahlásit jako SPAM
IP: 213.151.235.–
Kit+15
Guru
7. 8. 2019   #13
-
0
-

#12 pepko143
Netestoval jsem to. Co tam bylo špatně?

Normálně také používám jen otazníky, ale chtěl jsem to udělat ve stejném stylu jako máš svůj insert.

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.
pepko1430
Newbie
7. 8. 2019   #14
-
0
-

#13 Kit
Tak podľa mňa ten začiatok zápisu.

Máš to poňaté v takom inom štýle.
Asi v tom... neviem, ty si skúsenejší, ja som šťastný, že to ide :-).

Nahlásit jako SPAM
IP: 213.151.235.–
Kit+15
Guru
7. 8. 2019   #15
-
+1
-
Zajímavé

#14 pepko143
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.
peter
~ Anonymní uživatel
4016 příspěvků
8. 8. 2019   #16
-
0
-

Zkusim objasnit, co psal uz kit driv o tom null.

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.
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
pepko1430
Newbie
8. 8. 2019   #17
-
0
-

#16 peter
Ahoj Peter

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.

Nahlásit jako SPAM
IP: 213.151.235.–
Kit+15
Guru
8. 8. 2019   #18
-
0
-

#17 pepko143
Tak názorně: 

$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.
peter
~ Anonymní uživatel
4016 příspěvků
9. 8. 2019   #19
-
+1
-
Zajímavé

   

$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'.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
Kit+15
Guru
9. 8. 2019   #20
-
0
-

#19 peter
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.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

Podobná vlákna

String << int — založil Kenvelo

INT se mení na string — založil Foukr

Přetypování string na int — založil Kenvelo

Delka int, string — založil Lukas

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý