Apelare functie php din Ajax

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

guttuso
PHPRomania Supporter
Mesaje: 27
Membru din: Joi Apr 08, 2010 5:36 pm

Apelare functie php din Ajax

Mesajde guttuso » Dum Noi 20, 2016 5:21 pm

Salutare,

Am urmatorul cod Ajax:

Cod: Selectaţi tot

function fetch_select(){
  val_name = $('#name').val();
  $.ajax({
    type: 'POST',
   url: 'include/get_db.inc.php',
   data: {
           name: val_name,
   },
   success: function (response) {
     document.getElementById('higtchart_medie_gen').innerHTML=response;
     columnChart( JSON.parse(response));
    }
  });
}

function columnChart(data_v){
  if(data_v.length >0){
    $(function () {
     $('#higtchart_medie_gen').highcharts({
       chart: {
        type: 'column'
       },
......


fisierul get_db.inc.php si contine urmatoarea functie, tin sa precizez ca in fisier mai sunt functii:

Cod: Selectaţi tot

<?php
function test_name () {
  $ret = [];
  if(isset($_POST['name'])){
    $name = $_POST['name'];
    $sql = "SELECT
            ......
            WHERE ID = $name ";
    $result = $conn->query($sql);
    if($result->num_rows > 0){
      while($row = $result->fetch_assoc()) {
        $ret [] = [$row['NAME'] . ' ' . $row['LASTN'], floatval($row['AVGG'])];
      }
    }
  }
  if(count($ret) >1) echo json_encode($ret);
  else echo 'Not working';
}
?>

Cum pot apela in codul Ajax functia din php?

Multumesc!



takedown
Average Member
Mesaje: 153
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Apelare functie php din Ajax

Mesajde takedown » Dum Noi 20, 2016 6:07 pm

Trebuie sa apelezi functia din fisierul PHP, astfel aceasta functie va "emite" un rezultat, ce este preluat ca raspuns in Javascript folosind Ajax.

Mai poti face o chestie tare, cand trimiti cererea carre fisierul PHP, poti face la URL ceva de genul include/get_db.inc.php?action=nume_functie , unde nume_functiei este numele functiei pe care doresti sa o apelezi.Apoi, in php, preiai cu $_GET['action'];, verifici daca aceasta functie exista, apoi o apelezi, ceva de genul

Cod: Selectaţi tot

if (isset($_GET['action']) && is_string($_GET['action']) && function_exists($_GET['action']))) {
    call_user_func($_GET['action']);
}


Este doar o idee.

guttuso
PHPRomania Supporter
Mesaje: 27
Membru din: Joi Apr 08, 2010 5:36 pm

Re: Apelare functie php din Ajax

Mesajde guttuso » Dum Noi 20, 2016 7:21 pm

am incercat varianta propusa de tine, insa nu functioneaza.

Am uitat sa precizez functia mea are si un parametru si am transofrmat in include/get_db.inc.php?action=test_name($conn) Acum nu stiu daca este de vina acel parametru.

Multumesc!

takedown
Average Member
Mesaje: 153
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Apelare functie php din Ajax

Mesajde takedown » Dum Noi 20, 2016 7:46 pm

Introduce aceasta variabila ca parametru pentru functia call_user_funct(), acel URL trebuie sa aiba doar numele functiei apelate.

include/get_db.inc.php?action=nume_functie

Cod: Selectaţi tot

if (isset($_GET['action']) && is_string($_GET['action']) && function_exists($_GET['action']))) {
    call_user_func($_GET['action'], $conn);
}

guttuso
PHPRomania Supporter
Mesaje: 27
Membru din: Joi Apr 08, 2010 5:36 pm

Re: Apelare functie php din Ajax

Mesajde guttuso » Dum Noi 20, 2016 7:52 pm

work, multumesc mult de ajutor!

takedown
Average Member
Mesaje: 153
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Apelare functie php din Ajax

Mesajde takedown » Dum Noi 20, 2016 8:05 pm

Incerca sa-ti "modularizezi" codul folosindu-te de aceasta tehnica, impartirea componentelor aplicatiei tale in functii.Mai mult decat atat, poti crea functii si pentru lucru cu baza de date.Am vazut ca tu verifici si chestii ce tin de cererile trimise catre server in aceeasi functie, incerca sa separi si aici codul.

https://micul-programator.ro/blog/artic ... -codului-1
https://micul-programator.ro/blog/artic ... ului-2-mvc

Sunt niste article destul de mari, dar daca te pasioneaza, o sa inveti o groaza de chestii din ele.

guttuso
PHPRomania Supporter
Mesaje: 27
Membru din: Joi Apr 08, 2010 5:36 pm

Re: Apelare functie php din Ajax

Mesajde guttuso » Dum Noi 20, 2016 8:25 pm

Am un proiect destul de stufos, l-am reluat de 3 ori pana acum pentru ca intapin probleme de organizare.
Am aproximativ o luna de cand ma documentez in ceea ce priveste php, sql, html, css si js. (mai putin js, inca nu pot memora atata informatie, incep sa incurc mersul cu php)
Codul de mai sus este realizat in urma studiului meu si caut de ceva vreme cum sa imi structurez codul.
Am vazut ca tu verifici si chestii ce tin de cererile trimise catre server in aceeasi functie, incerca sa separi si aici codul.

Nu m-a indrumat nimeni ca este bine sau rau sa procedez asa, am vazut in modul de lucru al altor programatori si am zis sa adaptez codului meu. Dar daca spui ca este bine sa separ si aceste lucruri ma voi documenta in aceasta privinta.

Poate din experienta ta ma poti ajuta cu o parere si cu o indrumare:
Proiectul meu este un chestionar anonim unde sunt prezentate cateva intrebari simultan. Partea de introduce a valorilor in BD am realizat-o si functioneaza ok.
In urma acestor date stranse in BD, urmeaza sa scot cateva grafice care sunt afisate simultan pe o pagina (undeva la 5-6 grafice).

Am pus un grafic de la Highcharts si a functionat perfect, problema a aparut cat a trebuit sa il pun pe al doilea. Initial aveam:
- index.php unde imi este afisat graficul si tag-ul select ce face graficul dinamic (aici m-am folosit de ajax)
- get_db.inc.php unde imi sta codul sql pentru extragerea datelor din BD
- ajax.js care imi afiseaza graficul si face legatura cu get_db.inc.php.
Ca sa fac al doilea grafic a trebuit sa dublez fisierle cu exceptia lui index.php lucru care pentru doua grafice nu m-ar incomoda, dar pentru 5-6 grafice ar fi obositor sa le urmaresc.
De aici mi-a venit idea ca fiecare cod sql pentru grafic sa il pun intr-o functie, dar cum sa apelez functia? si aici m-ai ajutat tu (ceea ce iti multumesc mult).

Inca am probleme de organizare a folderelor, de modulare a codului si asa mai departe, pana termin proiectul cred ca il mai modific de 4-5 ori.

Multumesc mult takedown!

guttuso
PHPRomania Supporter
Mesaje: 27
Membru din: Joi Apr 08, 2010 5:36 pm

Re: Apelare functie php din Ajax

Mesajde guttuso » Dum Noi 20, 2016 8:50 pm

takedown scrie:Introduce aceasta variabila ca parametru pentru functia call_user_funct(), acel URL trebuie sa aiba doar numele functiei apelate.

include/get_db.inc.php?action=nume_functie

Cod: Selectaţi tot

if (isset($_GET['action']) && is_string($_GET['action']) && function_exists($_GET['action']))) {
    call_user_func($_GET['action'], $conn);
}


in timp ce am postat aici, am postat si pe un al forum problema mea. Dupa care ti-am citat rezolvarea pentru a se putea folosii si altii de raspuns in cazul in care intampina aceasi problema.

Cineva spune acolo ca miroase a gaura de securitate si ce se intampla cand userul solicita restart server (asta ce mai presupune nu stiu) :)

takedown
Average Member
Mesaje: 153
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Apelare functie php din Ajax

Mesajde takedown » Dum Noi 20, 2016 9:53 pm

Da, este o gaura de securitate si asta, m-am gandit ca faci acest lucru ca sa inveti, exemplul fiind perfect.

Poti sa faci o chestie intersanta, scrie intr-un array numele tuturor functiilor si apoi verifici daca valoarea variabilei $_GET['action'] se afla in acel array.

Este o gaura de securitate deoarece un utilizator rau intentionat poate folosi numele unei functii din PHP, functie ce iti va strica serverul sau cine stie ce, dar solutia de mai jos este buna.

Cod: Selectaţi tot


$actions = ['nume_functie_1', 'nume_functie_2'];

if (isset($_GET['action']) && is_string($_GET['action']) && in_array($_GET['action'], $actions))) {
    $func = htmlspecialchars($_GET['action']);
    call_user_func($_GET['action'], $conn);
}


Am rescris codul mai sus.Sfatul meu este sa folosesti un framework, cauta informatii despre Codeigniter sau Laravel.

Daca le ai cu engleza, uitate la tot cursul asta https://laracasts.com/series/php-for-beginners vei invata o groaza de chestii.

guttuso
PHPRomania Supporter
Mesaje: 27
Membru din: Joi Apr 08, 2010 5:36 pm

Re: Apelare functie php din Ajax

Mesajde guttuso » Dum Noi 20, 2016 10:30 pm

Cel care s-a autosesizat cu privire la cod a spus urmatoarele:
Pui un switch ($_GET['action']) si listezi explicit actiunile permise, iar in ramura default a lui switch iti trimiti un e-mail cu datele posibilului atacator care tocmai a incercat sa iti sparga site-ul, apoi ii adaugi adresa IP in fail2ban.
nu inteleg, despre ce actiuni vorbeste?

Multumesc mult, am invatat astazi ceva foarte bun!

takedown
Average Member
Mesaje: 153
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Apelare functie php din Ajax

Mesajde takedown » Dum Noi 20, 2016 10:53 pm

Pai acel utilizator vrea sa faci ceva de genul:

Cod: Selectaţi tot

switch($_GET['action']) {
   case "nume_functie_1":
       call_user_func($_GET['action'], $conn);
       break;
   case "nume_functie_2":
        call_user_func($_GET['action'], $conn);
        break;
   // etc.
   default:
   // banezi utilizatorul.
   break;
}


Mai bine faci cum ti-am spus eu mai sus.

Actiuni, se refera la toate functiile carora tu le perimiti accesul folosind acel $_GET['action']

guttuso
PHPRomania Supporter
Mesaje: 27
Membru din: Joi Apr 08, 2010 5:36 pm

Re: Apelare functie php din Ajax

Mesajde guttuso » Dum Noi 20, 2016 11:12 pm

takedown ai un blog, un canal pe youtube unde te mai pot gasi?
voi merge pe varianta ta!
multumesc mult de ajutor!

takedown
Average Member
Mesaje: 153
Membru din: Joi Feb 07, 2013 8:50 pm
Contact:

Re: Apelare functie php din Ajax

Mesajde takedown » Dum Noi 20, 2016 11:17 pm

Iti las un mesaj aici cu o adresa de skype unde ma poti contacta si alte detalii despre mine.
Gata, ti-am lasat mesajul.


Înapoi la “Cod PHP”

Cine este conectat

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