ugrás a tartalomhoz

Tárolt eljárás ha nem kap paramétert

aspirany · 2008. Aug. 6. (Sze), 22.14
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
 
1

nem pontosan értem, de...

virág · 2008. Aug. 7. (Cs), 07.12
Szia, figyeld az értékeket amit kapsz, például van egy ilyen tárolt eljárásod:
DELIMITER $$
DROP PROCEDURE IF EXISTS teszt$$
CREATE PROCEDURE teszt( IN szam INT )
BEGIN
  IF szam IS NOT NULL THEN 
   SELECT "vanszám";
  END IF;
END$$
DELIMITER;
ezt meghívhatod többféle képpen:

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

nem fogalmazok jól

aspirany · 2008. Aug. 7. (Cs), 07.26
a lényeg az.

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

Miért SP

janoszen · 2008. Aug. 7. (Cs), 09.07
Kérdés, hogy miért szeretnél erre SP-t használni? SP-nek akkor van értelme, ha legalább két queryt szeretnél úgy lefuttatni, hogy egymástól függenek. Persze, lehet absztrakciós rétegnek használni, de mivel a paraméterek listája úgyis ott figyel az alkalmazásban is, ezért csak mérsékelten van értelme.

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?
4

0000-00-00

Szekeres Gergő · 2008. Aug. 7. (Cs), 09.43
nem írtad milyen adatbázisról van szó.

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

tökéletes

aspirany · 2008. Aug. 7. (Cs), 09.57
igen mysql, azt szeretném hogy ne keljen ill meglehet-e oldani ne keljen a dátumhoz '0000-00-00' ill integerhez '0' átadni

DECLARE cnt INT;

 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


function ajanlat_mentes()
{
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('
}
6

sztem nem, de..

Szekeres Gergő · 2008. Aug. 7. (Cs), 11.04
..ha ellenőríznéd a bejövő adatokat akkor nem lenne ilyen hiba. ha pl 2008-02-31et írsz be akkor is ezt a hibát fogja dobni. ezeket le kell kezelni phpban.
7

rendben

aspirany · 2008. Aug. 7. (Cs), 11.33
okés ellenőrzöm. mondjuk a dátum az '', nem szertném kitölteni '0000-00-00' adattal,mert a lekérdezkor
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
8

Mindenképp átadni

Poetro · 2008. Aug. 7. (Cs), 11.40
Ha mindenképpen át akarsz adni valami paramétert, és nincs NOT NULL megkötés akkor adj át NULL-t és ne ''-t.
9

nem ok

aspirany · 2008. Aug. 7. (Cs), 11.49
Incorrect datetime value: 'NULL' for column 'date' at row 1

pl:insert into table1 (date) value ('NULL');
10

nem 'NULL'

Poetro · 2008. Aug. 7. (Cs), 13.44
hanem NULL.
11

Köszönöm

aspirany · 2008. Aug. 7. (Cs), 14.17
CALL sp_szerzodes_update(".$_GET['szerzodoID'].",".$_GET['biztositottID'].",".$_SESSION['partnerID'].",".$_GET['sorszam'].",".$statusz."',".$_GET['osszdij'].",".$_SESSION['Username'].",".$_SESSION['userID'].",".$_GET['szerzodesID'].")";

tehát a GET-nel vizsgáljam ha nincs érték akkor NULL
12

SQL injection

Poetro · 2008. Aug. 7. (Cs), 16.43
Gondolom nem félsz tőle, hogy semmit nem escape-elsz.
13

mysqli_real_escape_string

aspirany · 2008. Aug. 8. (P), 09.04
Köszi hogy felhívtad a figyelmet