Tárolt eljárás ha nem kap paramétert
Sziasztok
Egy Újabb kérdés
van egy tárolt eljárás ami vár paraméterekt
A webes program a formról átadja azt majd meghívja a tárolt eljárást.
A tárolt eljárás paraméterei:
ID => integer(11),datum => datetime vagy date ,ar => integer(3)
a program átadott paraméterei:
CALL sp('1','','');
ez rollback-hez vezet + Invalid datetime value (datetime lehet 'Null')
hogyan lehet azt megoldani ha nem adok át adatot akkor is lefuuson az sp.
köszönöm
■ Egy Újabb kérdés
van egy tárolt eljárás ami vár paraméterekt
A webes program a formról átadja azt majd meghívja a tárolt eljárást.
A tárolt eljárás paraméterei:
ID => integer(11),datum => datetime vagy date ,ar => integer(3)
a program átadott paraméterei:
CALL sp('1','','');
ez rollback-hez vezet + Invalid datetime value (datetime lehet 'Null')
hogyan lehet azt megoldani ha nem adok át adatot akkor is lefuuson az sp.
köszönöm
nem pontosan értem, de...
1. CALL teszt();
ez természetesen hibát dob, mert a MySQL-ben egyelőre nincs default paraméter, tehát így ne hívd meg semmiképpen sem.
2. CALL teszt ('');
erre igazat fog mondani, hiszen a '' érték nem NULL.
3. CALL teszt(NULL);
ez az ami akkor kell ha NULL-t szeretnél átadni, vagyis ekkor lefut hiba nélkül, de nem teljesül a feltétel.
4. nem hívod meg. Vagyis egyszerűen nem hívod meg pl. a PHP-ból ha nincs rá szükség, hiszen már ott tisztában vagy azzal ha hibás vagy üres adatok érkeznek. A tárolt eljárásokat jobb minél tömörebbre és picibbre írni az optimalizálás miatt.
nem fogalmazok jól
Adatokat akarok termékekről bejuttatni sp-n keresztül; A felhasználó mentés gombbal elmenti az adatokat, DE lehet hogy nem minden adatot töltki (itt még nem kell figyelni az adatok meglétét, ha akarja üresen is menthet);
Az adatok tartalmaznak integer,verchar,datetime (nincs not null megszorítás).Ez azért kell, ha folytatni szeretné később a bevitelt,meghívja a bizonylatot, betöltődnek a már kitöltött adatok,vagy éppen az üres bizonylat.
amit te is írtál call teszt(''); valamiért (EMS mysqlmanager) a fentebb amlített hibával nem fut le.
Miért SP
Egyébként látni kellene a teljes tárolt eljárást és hogy hogy hívod meg ahhoz, hogy tudjunk segíteni, mert üres paramétert simán adhatnál át neki és nem kellene hibára futnia. Apropó, mi a pontos hibaüzenet?
0000-00-00
mysqlben nincs adatellenőrzés, így gondolom azt használsz. ha üres dátumot szeretnél beszúrni, akkor a '0000-00-00' formátumot kell használnod. Ha jól értem ez a probléma.
tökéletes
SELECT COUNT(*) FROM bizt_termekek WHERE bizttermekID = pbiztermekID INTO cnt;
IF cnt=0 THEN
INSERT INTO bizt_termekek (szerzodesID,termekkategoriaID,termekcsalad,termekID,
marka,referencia,gyariszam,
vasarlasido,fogyasztoi_ar,biztositas_dij,garanciaevek,gyartoigar,jotallas_utolso,
biztositas_kezdete,biztositas_vege,letrehozo)
VALUE (pszerzodesID,ptermekkategoriaID,ptermekcsalad,ptermekID,pmarka,preferencia,pgyariszam,pvasarlasido,
pfogyasztoi_ar,pbiztositas_dij,pgaranciaevek,pgyartoigar,pjotallas_utolso,
pbiztositas_kezdete,pbiztositas_vege,pletrehozo);
ELSE
UPDATE bizt_termekek SET szerzodesID=pszerzodesID,termekkategoriaID=ptermekkategoriaID,
termekcsalad=ptermekcsalad,termekID=ptermekID,marka=pmarka,
referencia=preferencia,gyariszam=pgyariszam,vasarlasido=pvasarlasido,
fogyasztoi_ar=pfogyasztoi_ar,biztositas_dij=pbiztositas_dij,garanciaevek=pgaranciaevek,
gyartoigar=pgyartoigar,jotallas_utolso=pjotallas_utolso,
biztositas_kezdete=pbiztositas_kezdete,biztositas_vege=pbiztositas_vege,modosito=pletrehozo,
modositas=NOW() WHERE bizttermekID=pbiztermekID;
END IF;
END
{
global $link;
$i=0;
//ha valami változott az ügyfél adataiban
//$sql="CALL sp_szerzodes_update()";
//sleep(10);
//végigmegyünk a terméken
if($_GET['biztositottID'] == '')
{
$biztositottID = '0';
}
else{
$biztositottID = $_GET['biztositottID'];
}
if($_GET['bizt_nev'] !=='')
{
$sql = "CALL sp_biztositott_insupd('".$biztositottID."','".$_GET['bizt_nev']."','".$_GET['bizt_szulhely']."','".$_GET['bizt_szuldatum']."','".$_GET['bizt_irsz']."','".$_GET['bizt_telepules']."','".$_GET['bizt_utca']."','".$_GET['bizt_hazszam']."','".$_GET['bizt_telefon1']."','".$_GET['bizt_telefon2']."','".$_GET['bizt_email']."','".$_GET['bizt_levnev']."','".$_GET['bizt_levirsz']."','".$_GET['bizt_levtelepules']."','".$_GET['bizt_levutca']."','".$_GET['bizt_levhazsam']."','".$_SESSION['Username']."')";
$result = mysqli_query($link,$sql);
if($result !== TRUE)
$i++;
}
$sql1 = "CALL sp_biztermek_rogzit('".$_GET['szerzodesID']."','".$_GET['tcsaladvalue']."','".$_GET['tcsaladselect']."','".$_GET['markavalue']."','".$_GET['markaselect']."','".$_GET['refszam']."','".$_GET['gyariszam']."','".$_GET['vasarlasido']."','".$_GET['ar']."','".$_GET['biztdij']."','".$_GET['garevek']."','".$_GET['gyartoigarancia']."','".$_GET['jotallasutolso']."','".$_GET['biztkezdete']."','".$_GET['biztvege']."','".$_GET['ugynoknev']."',";
if($_GET['bizttermekID']=='')
{
$sql1 .= "'0')";
}
else{
$sql1 .= "'".$_GET['bizttermekID']."')";
}
echo $sql1;
$result1 = mysqli_query($link,$sql1);
if($result1 !== TRUE)
$i++;
//statusz válltás ha sima 'ment' akkor függőben, ha 'lezar' akkor lezárt
if($_GET['statusz'] == 'ment')
{
$statusz="függőben";
}
if($_GET['statusz'] == 'lezar')
{
$statusz='lezárt';
}
//miután elmentettük a termékeket rögziteni kell az új státuszt üres => függőben, rögzítjük az összdíjat is
//összeáljtjuk a sorszámot
echo $sql2 = "CALL sp_szerzodes_update('".$_GET['szerzodoID']."','".$_GET['biztositottID']."','".$_SESSION['partnerID']."','".$_GET['sorszam']."','".$statusz."','".$_GET['osszdij']."','".$_SESSION['Username']."','".$_SESSION['userID']."','".$_GET['szerzodesID']."')";
$result2 = mysqli_query($link,$sql2);
if($result2 !== TRUE)
$i++;
if($i > 0)
{
mysqli_rollback($link);
echo "<script>alert('a muvelet nem került végrehajtásra! ROLLBACK');</script>";
}
else{
mysqli_commit($link);
mysqli_close($link);
}
//átirányítjuk az oldalt hogy lezárás után új műveletet ezdhessnünk
//header('
}
sztem nem, de..
rendben
a dátumhoz beírja '0000-00-00' és azt nem szeretném.ill lehet csak lekérdezéskor 0 adatokat => "" konvertálni
hogy a form value = "" és ne "0" vagy "0000-00-00";
remélem így érthető voltam.
Vagy sp-nek mindenféleképpen át kell adni adatot? tehát nem lehet ''
pl: az sp vár integert,varchart és datetime
az átadott értékek call sp('','','') tehát ez nem lehet?
vagy mindenféleképpen sp('0','a','0000-00-00)
Köszönöm a segítséget.
ui: nálunk a postgres adatbázisban a dátum értéke lehet Null
Mindenképp átadni
nem ok
pl:insert into table1 (date) value ('NULL');
nem 'NULL'
Köszönöm
tehát a GET-nel vizsgáljam ha nincs érték akkor NULL
SQL injection
mysqli_real_escape_string