Preluare argumente prin POST sau GET

Ai o întrebare legată de PHP? Incercăm să îi găsim soluţie. Sau poate doar vrei să publici un cod interesant.

Moderatori: Zamolxe, Moderatori

matricks
Average Member
Mesaje: 90
Membru din: Sâm Oct 09, 2004 2:39 am
Localitate: Turda
Contact:

Preluare argumente prin POST sau GET

Mesajde matricks » Mar Aug 24, 2010 4:46 pm

De regula folosesc urmatoarea varianta pentru preluarea argumentelor functiilor trimise de ajax:

Cod: Selectaţi tot

if($_REQUEST){
   $function  = $_REQUEST["function"];
   $arg1 = $_REQUEST["arg1"];
   $arg2 = $_REQUEST["arg2"];
   $arg3 = $_REQUEST["arg3"];

   switch($function){
      case "nume_functie1": echo nume_functie1($arg1, $arg2); break;
      case "nume_functie2": echo nume_functie2($arg1); break;
      case "nume_functie3": echo nume_functie3($arg1, $arg2, $arg3); break;
      case "nume_functie4": echo nume_functie4($arg1,arg2); break;
   }
}


Sunt curios daca are cineva o idee mai practica decat aceasta, sau ce alternative mai folositi voi?


Pardus - For Freedom!

Avatar utilizator
boo
Senior Member
Mesaje: 267
Membru din: Mie Mar 24, 2004 8:16 pm
Localitate: Ploiesti
Contact:

Mesajde boo » Mie Aug 25, 2010 1:12 am

Uite cum fac eu:

Sa zicem ca am doua pagini: un index cu un formular si o pagina page.php incarcata cu ajax intr-un div din index:

index.php

Cod: Selectaţi tot

....
<script type="text/javascript" language="javascript">
   var http_request = false;
   function makePOSTRequest(url, parameters) {
      http_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/html');
         }
      } else if (window.ActiveXObject) { // IE
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }
      if (!http_request) {
         alert('Cannot create XMLHTTP instance');
         return false;
      }
     
      http_request.onreadystatechange = alertContents;
      http_request.open('POST', url, true);
      http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      http_request.setRequestHeader("Content-length", parameters.length);
      http_request.setRequestHeader("Connection", "close");
      http_request.send(parameters);
   }

   function alertContents() {
      if (http_request.readyState == 4) {
         if (http_request.status == 200) {
            //alert(http_request.responseText);
            result = http_request.responseText;
            document.getElementById('myspan').innerHTML = result;           
         } else {
            alert('There was a problem with the request.');
         }
      }
   }
   
   function get(obj) {
      var poststr = "mytextarea1=" + encodeURI( document.getElementById("mytextarea1").value ) +
                    "&mytextarea2=" + encodeURI( document.getElementById("mytextarea2").value ) +
            "&mytextarea3=" + encodeURI( document.getElementById("mytextarea3").value ) ;
      makePOSTRequest('post.php', poststr);
   }
</script>


...


<form action="javascript:get(document.getElementById('myform'));" name="myform" id="myform">
<input type="text" id="mytextarea3"><br>
<textarea id="mytextarea1">test
1
2
3
</textarea>
<textarea id="mytextarea2">test2
4
5
6</textarea>
<br>
<input type="button" name="button" value="Submit"
   onclick="javascript:get(this.parentNode);">
<input type="submit" name="button" value="Submit">
</form>


....

<div id="myspan"></div>

...


page.php

Cod: Selectaţi tot

<?php
print_r($_POST);
?>


Vezi ca pentru fiecare form trebuie sa faci o functie de genul celei existente get() prin care sa preiei valorile care le introduci sau selectezi.
sper sa iti fie de ajutor.

matricks
Average Member
Mesaje: 90
Membru din: Sâm Oct 09, 2004 2:39 am
Localitate: Turda
Contact:

Mesajde matricks » Mie Aug 25, 2010 9:29 am

Poate e cazul sa fiu eu mai explicit, deoarece se pare ca nu am formulat destul de clar intrebarea.

Eu lucrez cu jquery. Codul js este separat, intr-un fisier. In acest fisier am functiile js.

Folosind $.post, $.get, $.getJSON in cadrul functiei js, fac apel la o functie anume din php care imi returneaza o valoare. Ceva de genul:

Cod: Selectaţi tot

function functia1(tip, mod){
$.post(ajax.php, 'function=nume_functie1&arg1='+tip+'&arg2='+mod, function(rezultat){
        //fa ceva cu rezultat
})

}



in acest moment se face cererea catre fisierul ajax.php, setand parametri din POST cu urmatoarele valori $_POST["function"]=functie1, $_POST["arg1"]=valoarea lui tip, $_POST["arg2"]=valoarea lui mod.


In fisierul ajax.php se afla codul de care am vorbit in primul post, adica:

Cod: Selectaţi tot

if($_REQUEST){
   $function  = $_REQUEST["function"];
   $arg1 = $_REQUEST["arg1"];
   $arg2 = $_REQUEST["arg2"];
   $arg3 = $_REQUEST["arg3"];

   switch($function){
      case "nume_functie1": echo nume_functie1($arg1, $arg2); break;
      case "nume_functie2": echo nume_functie2($arg1); break;
      case "nume_functie3": echo nume_functie3($arg1, $arg2, $arg3); break;
      case "nume_functie4": echo nume_functie4($arg1,arg2); break;
   }
}

function nume_functie1($arg1, $arg2){
....
return $rezultat;
}
...
function nume_functie4($arg1,arg2){
....
return $rezultat;
}




Tot in ajax.php se afla si functiile apelate.
Formula folosita de mine, functioneaza excelent, insa ce nu imi place este ca trebuie ca pentru fiecare functie nou, sa adaug un rand si in switch, care sa faca redirectarea catre functia adecvata.

La un moment dat ma gandeam la o formula cu eval(), insa din cate am inteles nu e tocmai indicata folosirea lui eval() in aceste cazuri,
Cu eval as avea ceva de genul:

Cod: Selectaţi tot

if($_REQUEST){
   $function  = $_REQUEST["function"];
   $arg1 = $_REQUEST["arg1"];
   $arg2 = $_REQUEST["arg2"];
   $arg3 = $_REQUEST["arg3"];

  $functia = $_REQUEST["function"]."(".$_REQUEST["arg1"].", ".$_REQUEST["arg2"].", ".$_REQUEST["arg3"].")";
  eval("\$functia = $functia;");
  echo $functia;
}

function nume_functie1($arg1, $arg2){
....
return $rezultat;
}
...
function nume_functie4($arg1,arg2){
....
return $rezultat;
}


In acest caz nu ar mai fi necesar sa adaug nominal toate functiile care urmeaza sa fie returnate catre ajax.


Deci, in lumina noilor detalii, are cineva ceva comentarii si sfaturi?
Pardus - For Freedom!

dechim
Senior Member
Mesaje: 1486
Membru din: Mar Mai 10, 2005 11:53 pm
Localitate: Drobeta Turnu Severin

Mesajde dechim » Mie Aug 25, 2010 10:28 am

Am o idee.

Poti sa pui intr-un fisier separat

Cod: Selectaţi tot

<?php
$arrFct = array(
    1234=>array('nume_functie1', 10),
    1235=>array('nume_functie2', 3),
    ...
);
?>

- daca ai de adaugat noi functionalitati, adaugi la array
- incluzi fisierul la inceputul scriptului ajax.php
- $_REQUEST['function'] va fi 1234,1235 (cheia)
- din array obtii numele functiei si numarul de parametrii pe care-i asteapta (10 si 3)

Acum poti sa scrii codul in ajax.php astfel incat sa nu mai fie nevoie de modificari acolo. Merge eval pentru ca nu ai pe traseu numele functiei in clar, ea e tinuta in array si cred ca-i comod de modificat in acel fisier.

Ma gandesc ca ar merge mai multe elemente in array :

Cod: Selectaţi tot

$arrFct = array(
    cheia_care_se_transmite_AJAX => array('nume_functie', $numar_parametrii, $script_care_stie_sa_prelucreze_raspunsul),
...
)

matricks
Average Member
Mesaje: 90
Membru din: Sâm Oct 09, 2004 2:39 am
Localitate: Turda
Contact:

Mesajde matricks » Mie Aug 25, 2010 1:07 pm

dechim, mersi pentru raspuns, insa initial facusem chiar ceva asemanator apoi am simplificat la formula actuala, care isi face treaba excelent, insa trebuie sa adaug fiecare functie noua in lista lui case.

Ceea ce ma deranjeaza pe mine si as vrea sa evit este exact faptul de A ADAUGA fiecare functie noua (in array sau in case);

Ma gandeam ca cineva a gasit o modalitate de a face ceva de genul:

if(isset($_REQUEST)){
echo $_REQUEST["orice_functie"]($_REQUEST["orice_lant_de_parametri"]);
}
chiar daca initial ar fi o functie de conversie, etc

in acest mod nu ar mai trebui sa introduc toata lista de functii apelabile prin ajax.

Mai ai si alte idei?

edit:
Mda. Explicand ce vreau, am realizat ca practic in acest mod as ajunge tot la un soi de eval si as creea o bresa de securitate, orice functie putand fi apelata aiurea de oricine.

Raman la formula actuala.

Va multumesc pentru idei.
Pardus - For Freedom!

dechim
Senior Member
Mesaje: 1486
Membru din: Mar Mai 10, 2005 11:53 pm
Localitate: Drobeta Turnu Severin

Mesajde dechim » Mie Aug 25, 2010 11:33 pm

Pai undeva tot trebuie sa scrii. Daca vrei poti sa pui intr-o tabela pe care o citesti la prima accesare a site-ului si salvezi intr-un array al sesiunii pe care sa-l folosesti ulterior.
Tot mi se pare complicat, daca acceseaza cineva tabela !?!


Înapoi la “Cod PHP”

Cine este conectat

Utilizatori ce ce navighează pe acest forum: Niciun utilizator înregistrat și 35 vizitatori