Autor Zpráva
fandax17
Profil
ahoj, začínám s php a sql a snažím se pomocí php vkládat a zobrazovat data z sql databáze. mám 3 tabulky jedna z nich má referenční integritu na 2 zbývající tabulky a to takto:
<?php
mysql_query ("create table p_s(
id_pivo int NOT NULL,
id_stupen int NOT NULL, 
primary key (id_pivo,id_stupen), 
FOREIGN KEY (id_pivo) references pivo (id_pivo),
FOREIGN KEY (id_stupen) references stupen (id_stupen)) ")
or die('nejde vytvorit tabulku PS!').mysql_error() ;
echo "record added";
?>

data se snažím vkládat formulářem takto:
<form method="POST" action="">
Zadejte název piva a stupne...
    <input type="text" size="3" name=id1>  <BR>
    <input type="text" size="3" name=id2>  <BR>
<input type="submit" value="zadat">
<?php
    {
if (empty($_POST)) {echo "Žádná data nebyla odeslaná, nyní se zobrazí formulář"; }
else { echo  "Uživatel už formulář odeslal, nyní proběhne odeslání formuláře";
mysql_connect..........
  mysql_query ("insert into p_s values    ('$_POST[id1]','$_POST[id2]')")
  or die('AJ! CHYBA - špatný dotaz!').mysql_error();
  }}
?>

při zprovoznění na localhostu vše funguje (tj. do formuláře se píšou čísla a musí se vyplnit obě kolonky), ale když vše nahraju na web (webzdarma.cz nebo hostuju) tak referenční integrita nefunguje a not null taky ne, takže do formuláře můžu psát co a chci a stačí vyplnit jen jedno políčko a formulář se odešle... proč to na localhostu funguje a při nahrání na web ne?
nemeja
Profil
Proč dáváš do int sloupců 'string'?
Nezapomeň si ošetřit vstupy a přetypovat proměnnou napevno na int
....((int)$_POST[id1],(int)$_POST[id2])
Tori
Profil
Chybí tam hlavně určení typu tabulky. Možná na localhostu máte jako výchozí nastavený InnoDB, ale na wz.cz dost pravděpodobně bude výchozí MyISAM.
mysql_query ("create table p_s(
id_pivo int NOT NULL,
id_stupen int NOT NULL, 
primary key (id_pivo,id_stupen), 
FOREIGN KEY (id_pivo) references pivo (id_pivo),
FOREIGN KEY (id_stupen) references stupen (id_stupen))
ENGINE = InnoDB")



Jinak pokud je sloupec NOT NULL, tak do něj nemůžete ukládat hodnotu NULL, nic míň, nic víc. Prázdný řetězec (= nevyplněné políčko formuláře) tam uložíte v pohodě.
fandax17
Profil
děkuju mockrát, pomohla změna
ENGINE = InnoDB
a vše funguje. tedy ta referenční intergita.

zajímavé je, že na hostuju to funguje, ale na wz.cz ne, ono si tam víc lidí stěžuje na foru že to tam mají nějaké zastaralé...

jinak do int sloupců dávám string protože nevím co jiného, chci vyplnovací formulář, ale zapisovat jen čísla..
to not null je pravda, klidně to povolí zapsat prázdný formulář, jak toto ošetřit?pomocí if (empty($_POST)) ?
Tori
Profil
Vyberte si podle toho, co potřebujete. Jestli chcete umožnit zadávat čísla včetně nuly, tak bych empty nepoužívala.

if (!empty($_POST['neco'])) - neprojde prázdný řetězec a nula, mezeru pustí dál
if ($_POST['neco'] !== '') - neprojde prázdný řetězec, nulu a mezeru pustí dál
if ($_POST['neco'] !== '' && !preg_match('~^\s+$~', $_POST['neco'])) - neprojde prázdný řetězec ani libovolný počet mezer, nulu pustí dál
fandax17
Profil
hmmm když na to koukám, doufal jsem, že to už vlastně ošetřené mám, akorát to nefunguje jak bych si představoval...
viz 8 řádek v mém prvním postu
{ if (empty($_POST)) {echo "Žádná data nebyla odeslaná, nyní se zobrazí formulář"; } 
else { echo  "Uživatel už formulář odeslal, nyní proběhne odeslání formuláře";
 mysql_connect..........  
  mysql_query ("insert into p_s values    ('$_POST[id1]','$_POST[id2]')")   
  or die('AJ! CHYBA - špatný dotaz!').mysql_error();   }}
doufal jsem, že to bude fungovat tak, že se zobrazí první text a druhý text se zobrazí po odeslání formuláře, což funguje, akorát že to povolí odeslat i prázdný formulář a to jsem myslel že je ošetřené práve tím if (empty($_POST))
Tori
Profil
fandax17:
$_POST je pole, empty ověří, že pole obsahuje nějaké prvky. Ale už nezjistí, jestli něco obsahují i ty prvky pole. To musíte ověřovat u jednotlivých prvků zvlášť.
fandax17
Profil
tak jsem to změnil na if (empty($_POST[id])) a funguje to, prázdný formulář se neodešle.
moc děkuju za pomoc!

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: