Вызов функции php при отправке без jQuery, если это возможно - PullRequest
0 голосов
/ 18 мая 2018

У меня есть база данных с данными о плотинах.У меня есть один данные для каждой плотины в год.Я звоню в свою базу данных, чтобы получить набор данных, и он работает.Но теперь я хотел бы выбрать данные только за один год.

У меня есть функция в php для подключения к моей базе данных.Я хотел бы позвонить, когда отправляю свою форму (с указанием года).

Полагаю, мне нужно использовать AJAX.Но моя строка "xhr.open ('GET', ...)" не выполняет функцию.И я не знаю, что добавить в addEventListener, так как мой php ничего не возвращает.

Я не использую jQuery, поэтому я ищу способ вызвать мою функцию php, без нее, если это возможно.

Вот мой код:

map.js

//AJAX pour appeler la fonction PHP connectBDD()
//envoie de la requête

var xhr = new XMLHttpRequest();
xhr.open('GET',"connexion.php?anneeSelectionnee='2016'");
xhr.send(null);

//reception des données
listAnnees = document.getElementById('annee');
if (listAnnees){
listAnnees.addEventListener('change',function(event){
  if (xhr.readyState == XMLHttpRequest.DONE) {
      alert(xhr.responseText);  //according to  Gerars Cuadras comment
    event.preventDefault();
    console.log("Oui oui je suis là");
    //supprimer_ouvrages();
}
});

Я не показываю свой php-файл «connexion.php», потому что это простое соединение с базой данных, которое затем вызывает функции javascript для построения плотин на карте.(изначально он был в функции connectBDD () в файле, но я не знал, как вызывать функцию в AJAX, а не в файле).

index.php
  <select name="annee" id="annee">
    <option value="2017">2017</option>
    <option value="2016">2016</option>
    <option value="2015">2015</option>
  </select>

Другая попытка

Я также пытался без AJAX, и это работало (вызывать функцию php), однако каждый раз была перезагрузка страницы, так что мой выборбыл потерян .. (с connectBDD () весь код в connectxion.php)

  <form action="index.php"> 
  <select name="annee" id="annee">
    <option value="2017">2017</option>
    <option value="2016">2016</option>
    <option value="2015">2015</option>
  </select>
  <input type="submit" id="envoyer" name="envoyer" value="Changement d'années">
</form>


if (isset($_POST['envoyer'])) {
  ?>
  <script type="text/javascript">
  supprimer_ouvrages();
  </script>
  <?php
    connectBDD('2016');
}

Извините, я знаю, что это не ясно, но это было показать, что я пытался.

Мой вопрос: Как я могу выполнить функцию php (или файл, если функция невозможна) при отправке моей формы, без перезагрузки страницы?

Буду признателен за любую помощь !!

EDIT

"xhr.open ('GET', ...)", кажется, называетсяпо сути моей сети.network

Второе редактирование Итак, вот мой файл connectxion.php.Я показываю это в функции (как во второй попытке), но при попытке ajax я просто подавляю функцию и выполняю код без функции.

<script type="text/javascript" src="l93_to_wgs84.js"></script>
<script type="text/javascript" src="dictionnaryFunctions.js"></script>

<?php
//script de connection à la base de données et de récupération des informations


function connectBDD($anneeSelectionnee){
  echo 'Code is executed !'

    //connexion a la base de donnees
   $host_bdd='localhost';
   $name_bdd='smthg';
   $user_bdd='smthg';
   $pass_bdd='smthg';

   try{
      $bdd = new PDO ("pgsql:host=".$host_bdd.";dbname=".$name_bdd."", "".$user_bdd."", "".$pass_bdd."") or die(print_r($bdd->errorInfo()));
      $bdd->exec("SET NAMES utf8");
      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    }

   catch(Exeption $e){
      die("Erreur!".$e->getMessage());
   };

   //connexion réussie
   ?>
   <script type="text/javascript">
    attenteConnexion(1);
    </script>
    <?php


  // On récupère les données
  //on ne prend que les données du cours d'eau qui nous intéresse
   $reponse = $bdd->query('SELECT * FROM ouvrages');

  //On affiche chaque entrée une à une
  while ($donnees = $reponse->fetch())
  {
    //on remplace les "_" par des espaces pour une meilleure lisibilité
    $donnees = str_replace("_"," ",$donnees);
    //coordonnees de l'ouvrage
    $latitude = $donnees['xl93'];
    $longitude = $donnees['yl93'];

    $impact = $donnees['impact'];

    //toutes les informations que l'on souhaite afficher dans la fiche d'identité
    //si on veut afficher une informations supplémentaire, c'est dans ce tableau qu'il faut ajouter une ligne
    $identite = array(
      'Nom' => $donnees['nom'],
      'ROE' => $donnees['idroe'],
      'Commune' => $donnees['commune'],
      'Syndicat' => $donnees['syndicat'],
      'Projet' => $donnees['projet'],
      'Type d\'ouvrage' => $donnees['typeouvr'],
      'Sous-type d\'ouvrage' => $donnees['sstypeouvr'],
      'Passe à poisson' => $donnees['passepoiss'],
      'Système de montaison' => $donnees['systmont'],
      'Système de dévalaison' => $donnees['systdev'],
      'Usage' => $donnees['usage'],
      'Présence d usage' => $donnees['presenceus'],
      'Etat' => $donnees['etat'],
      'Mort par dévalaison (%)' => $donnees['mortdeval'],
      'Franchissabilité à la montaison' => $donnees['franchiss'],
      'Année' => $donnees['anneemaj']);

    $courseau = $donnees['courseau'];
    $espece = $donnees['espece'];
    $annee = $donnees['anneemaj'];

    ?>
    <script type="text/javascript">
    creation_ouvrage(lambert93toWGPS('<?PHP echo $latitude;?>','<?PHP echo $longitude;?>')['latitude'],lambert93toWGPS('<?PHP echo $latitude;?>','<?PHP echo $longitude;?>')['longitude'],'<?PHP echo $impact;?>',<?PHP echo json_encode($identite);?>,'<?PHP echo $courseau;?>','<?PHP echo $espece;?>','<?PHP echo $annee;?>','<?PHP echo $anneeSelectionnee;?>');
    </script>

    <?php
  }
  ?>
  <script type="text/javascript">
  creation_liste();
  </script>
  <?php

  $reponse->closeCursor(); // Termine le traitement de la requête
  echo $anneeSelectionnee;

}
    ?>

Если я могу использовать 'xhr.open ('GET', ..) 'с функцией PHP вместо php-файла, я хотел бы знать хитрость:)

1 Ответ

0 голосов
/ 22 мая 2018

Вот решение, если кому-то нужно:

Моя функция PHP ничего не возвращала, так как вызывала функции Javacript напрямую.Это было проблемой для AJAX, а также довольно плохо, поскольку я выполнял все вычисления на стороне сервера.

@ Лу предложил разделить работу.Затем я использовал свою функцию PHP только для подключения к базе данных и возврата данных.Затем я вызываю нужную мне функцию javascript.

С этим методом мой вызов AJAX работает нормально:

функция javascript, которая группирует все:

function afficherDonnees(anneeSelectionnee){
  //on récupère les données de la table ouvrages dans la BDD
  var xmlhttp = new XMLHttpRequest();
  xmlhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      console.log("connexion réussie ");
      var tableOuvrages = JSON.parse(this.responseText);

      //here I do all the treatments I need on my dataset

};

  xmlhttp.open("GET", "connexion.php", true);
  xmlhttp.send();

}

В моем файле подключения к PHP я сохраняю только подключение:

   $host_bdd='something';
   $name_bdd='something';
   $user_bdd='something';
   $pass_bdd='something';

   try{
      $bdd = new PDO ("pgsql:host=".$host_bdd.";dbname=".$name_bdd."", "".$user_bdd."", "".$pass_bdd."") or die(print_r($bdd->errorInfo()));
      $bdd->exec("SET NAMES utf8");
      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
    }

   catch(Exeption $e){
      die("Erreur!".$e->getMessage());
   };


   $reponse = $bdd->query('SELECT * FROM ouvrages');

   $outp = array();
   $outp = $reponse->fetchAll();
   echo json_encode($outp); //here I return my result as JSON

Надеюсь, это кому-нибудь поможет:)

...