AJAX Json / récupérer une bdd sql

[Fermé]
Signaler
-
Messages postés
33695
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 octobre 2021
-
Bonjour,

Je suis en grosse galère. J'ai besoin d'utiliser en javascript ma BDD SQL, et après m'être renseigné j'ai décidé de tenter l'aventure JSON. Seul problème.. je ne trouve pas vraiment d'aide à ce niveau. J'ai un niveau débutant en Ajax et j'espérais un tuto qui me permettrait de faire ce que je veux, qui ne semble pas trop compliqué...

Niveau théorie, je souhaite simplement récupérer via Json ma BDD, pour ensuite m'en servir dans du javascript (plus précisément pour générer des markers sur une map googlesmap).

Sauf que bah je ne vois pas du tout comment faire, et je n'ai pas trouvé de tuto / d'aide sur le net...

Si quelqu'un peut m'apporter conseil !

Merci d'avance.

3 réponses

Messages postés
33695
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 octobre 2021
3 764
Merci de l'aide !

Alors je comprend pas vraiment tout le code, surement parce-que nos demandes sont différentes. Du coup je me suis intéressé et penché que sur le script (que j'ai directement inclus à ma page pour le moment vu que je suis encore en "phase de test" et j'attend de voir si ça fonctionne pour en faire un vrai script).

J'ai du coup modifier le code pour tenter de l'adapter à ma BDD et à mes "besoins" et j'en suis venu à ça :
<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>45° imagery</title>
    <style>
html { height: 100% }
body { height: 100%; margin: 0px; padding: 0px }
#map { width: 100%; height: 100% }
    </style>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>
  </head>
  <body>
  <?php 
//affichage des erreurs PHP
error_reporting(E_ALL);

//connexion à la BDD
$host = "localhost";
$dbname = "points_interet";
$user = "root";
$pwd = "";
try {
 $bdd = new PDO("mysql:host=$host;dbname=$dbname", $user, $pwd);
 }
 catch (PDOException $e)
 {
 echo "<br>".$e."<br>";
 printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
 exit('Impossible de se connecter à la base de données.');
 }
 
 //récupération "propre" des variables
 $ID = !empty($_POST['ID']) ? $_POST['ID'] : NULL;
 $ACTION = !empty($_POST['ACTION']) ? $_POST['ACTION'] : NULL;
 
 //je défini une variable de retour :
 $result=array();

 //Choix de l'action à réaliser :
 switch($ACTION){ 
 case "GET_LIEUX":
 $sql = "SELECT * FROM points_interet ORDER BY ID";
 try{
  $prepare = $bdd->prepare($sql)
  $res = $prepare->execute();
  //on stocke le résultat dans un ARRAY
  $result['RESULT'] = $prepare->fetchAll();
  }catch(Exception $e) {
   $result['ERROR'] = $e->getMessage();
   }
   break;
   
 default: // si aucune action correspondante !
 $result['RESULT'] = $_POST
 $result['ERROR'] = "Aucune Action ne correspond";
 }

 // envoi du résultat au succes
 echo json_encode($result);

?>
</body>
</html>


Globalement, j'ai retiré une des deux "case" parce que je ne voyais pas trop à quoi ça "servait" d'en mettre deux... surement lié à la demande de la personne, je ne sais pas.

En tout cas j'ai droit à une belle erreur : ( ! ) Parse error: syntax error, unexpected '$res' (T_VARIABLE) in C:\wamp\www\test\json2test.php on line 47

J'ai surement fait une belle merde qui doit être honteuse... Je m'en excuse d'avance, j'ai vraiment honte de mon niveau là... x_x


EDIT : Ajout du LANGAGE dans les balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.
Messages postés
33695
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 octobre 2021
3 764
Que vient faire du code HTML dans le fichier PHP appellé par ton script AJAX ?
Tu ne dois pas le mettre !!!!

Et pour ce qui est du message d'erreur... il manque un point-virgule
$prepare = $bdd->prepare($sql)
  $res = $prepare->execute();

A corriger par :
$prepare = $bdd->prepare($sql);
  $res = $prepare->execute();
>
Messages postés
33695
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 octobre 2021

Désolé de mes erreurs. J'ai appris Ajax "à la va vite" et je ne l'utilise que depuis plusieurs jours à cause d'un manque de temps de dernière minute (sans aller dans les détails, je ne comptais pas l'utiliser pour ce que j'ai besoin de faire, mais j'ai eu droit à une magnifique demande de dernière minute m'obligeant à passer par ça... Et je n'ai pas le temps de passer des semaines à l'apprendre et faire des tests... x_x Du coup quand je dis être débutant c'est VRAIMENT débutant, je connais à peine les bases et pas par coeur... )

Point virgule corrigé. D'ailleurs, il y en avait un autre pour le $_POST; plus bas. Les deux manques sont présents sur ton code de base.

retiré le HTML aussi, je pensais inclure directement le script à ma page "de base" pour corriger le tout plus facilement quand j'incluerai le reste sans avoir à tout le temps change d'onglet, je ne pensais pas que ça serait si.. dérangeant =/

Et désolé aussi pour la balise code.

  <?php 
//affichage des erreurs PHP
error_reporting(E_ALL);

//connexion à la BDD
$host = "localhost";
$dbname = "points_interet";
$user = "root";
$pwd = "";
try {
	$bdd = new PDO("mysql:host=$host;dbname=$dbname", $user, $pwd);
	}
	catch (PDOException $e)
	{
	echo "<br>".$e."<br>";
	printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
	exit('Impossible de se connecter à la base de données.');
	}
	
	//récupération "propre" des variables
	$ID = !empty($_POST['ID']) ? $_POST['ID'] : NULL;
	$ACTION = !empty($_POST['ACTION']) ? $_POST['ACTION'] : NULL;
	
	//je défini une variable de retour :
	$result=array();

	//Choix de l'action à réaliser :
	switch($ACTION){ 
	case "GET_LIEUX":
	$sql = "SELECT * FROM points_interet ORDER BY ID";
	try{
		$prepare = $bdd->prepare($sql);
		$res = $prepare->execute();
		//on stocke le résultat dans un ARRAY
		$result['RESULT'] = $prepare->fetchAll();
		}catch(Exception $e) {
			$result['ERROR'] = $e->getMessage();
			}
			break;
			
	default: // si aucune action correspondante !
	$result['RESULT'] = $_POST;
	$result['ERROR'] = "Aucune Action ne correspond";
	}

	// envoi du résultat au succes
	echo json_encode($result);
?>


Le code fonctionne mais au lieu d'avoir le résultat, cela me renvoit à : {"RESULT":[],"ERROR":"Aucune Action ne correspond"}. Donc au fait qu'il n'y a aucune action correspondante... wat ?

J'ai fait des recherches et j'ai essayé ce code là :
	 <?php
	 
$reponse = $bdd->query('SELECT * FROM points_interet');

while ($donnees = $reponse->fetch())
{$data = array();
$data["longitude"]  = $donnees['Longitude'];
$data["latitude"]  = $donnees['Latitude'];
$data["titre"] = $donnees['Titre'];
$datacode = json_encode( $data );
echo $datacode;
}

?>


Qui lui me renvoit par contre les bonnes données... je commence vraiment à m'embrouiller, plus je recherche plus j'ai l'impression que chacun a sa méthode que lui même comprend.. xD
Messages postés
33695
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 octobre 2021
3 764 > Mihai
Quel code JAVASCRIPT as tu écris pour faire appel à l'ajax ?
As tu bien mis un variable ACTION comme dans l'exemple que j'ai donné ?

J'ai l'imporession que tu essayes juste de faire du PHP directement dans ta page... et aucunement d'utiliser de l'ajax.... me trompes-je ?
>
Messages postés
33695
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 octobre 2021

Je n'ai actuellement pas encore travaillé sur le côté Ajax. Si le script Php ne renvoi pas la BDD j'aurai beau l'inclure dedans ça ne changera rien, non ? Je pensais plutôt faire du "pas à pas", terminer d'abord le script php et être sûr qu'il renvoit les bonnes informations pour ensuite coder la partie javascript/ajax... le seul javascript que j'ai en place sur ma page c'est ma map googlemap générée xD
Messages postés
33695
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 octobre 2021
3 764 > Mihai
Dans ce cas, n'utilises pas la récupération de variables POST
met directement des valeurs aux variables (en dur dans le code) le temps des tests...

Par exemple, remplaces :
//récupération "propre" des variables
	$ID = !empty($_POST['ID']) ? $_POST['ID'] : NULL;
	$ACTION = !empty($_POST['ACTION']) ? $_POST['ACTION'] : NULL;
	

par :
//récupération "propre" des variables
$ACTION = "GET_LIEUX";


j'ai retiré $ID .. vu que dans le code que tu nous montres tu ne l'utilises nul part.
A quelles variables, précisément ?

J'ai changé ce que tu as marqué, et j'ai simplement eu une page blanche.

J'ai tenté de remplacer, par simple test, la ligne de connexion à la BDD ( $bdd = new PDO("mysql:host=$host;dbname=$dbname", $user, $pwd); ) par une autre sans me servir de variable ( $bdd = new PDO('mysql:host=localhost;dbname=points_interet;charset=utf8', 'root', ''); )

Et cette fois ça me renvoi le tout, mais.. d'une manière étrange !

Résultat :
{"RESULT":[{"ID":"1","0":"1","Titre":"Test 1","1":"Test 1","Descriptif":"Premier test","2":"Premier test","Adresse":"13230 Rue du Test","3":"13230 Rue du Test","Longitude":"4.808699000000000000000000000000","4":"4.808699000000000000000000000000","Latitude":"43.392247000000000000000000000000","5":"43.392247000000000000000000000000","Url":"http:\/\/google.com","6":"http:\/\/google.com"},{"ID":"2","0":"2","Titre":"Test n\u00b02","1":"Test n\u00b02","Descriptif":"Ceci est un second test de point","2":"Ceci est un second test de point","Adresse":"13230 Avenue des Tests","3":"13230 Avenue des Tests","Longitude":"4.809129000000000000000000000000","4":"4.809129000000000000000000000000","Latitude":"43.391950000000000000000000000000","5":"43.391950000000000000000000000000","Url":"http:\/\/google.com\r\n","6":"http:\/\/google.com\r\n"}]}

Donc certains trucs sont en double, etc... assez bizarre. ôo

Je sais que j'ai surement l'air d'un gros abrutit qui joue avec des produits chimiques mais bon x_x désolé et merci de prendre le temps de m'aider, ça fait plaisir à voir !
Messages postés
33695
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
18 octobre 2021
3 764
En fait, le code retourne un ARRAY

Si on le remet en forme histoire de te le rendre plus lisible..ça donne ça :
{
 "RESULT":[
  {"ID":"1"
    ,"0":"1"
    ,"Titre":"Test 1"
    ,"1":"Test 1"
    ,"Descriptif":"Premier test"
    ,"2":"Premier test"
    ,"Adresse":"13230 Rue du Test"
    ,"3":"13230 Rue du Test"
    ,"Longitude":"4.808699000000000000000000000000"
    ,"4":"4.808699000000000000000000000000"
    ,"Latitude":"43.392247000000000000000000000000"
    ,"5":"43.392247000000000000000000000000"
    ,"Url":"http:\/\/google.com"
    ,"6":"http:\/\/google.com"
  }
   ,
  {"ID":"2"
    ,"0":"2"
    ,"Titre":"Test n\u00b02"
    ,"1":"Test n\u00b02"
    ,"Descriptif":"Ceci est un second test de point"
    ,"2":"Ceci est un second test de point"
    ,"Adresse":"13230 Avenue des Tests"
    ,"3":"13230 Avenue des Tests"
    ,"Longitude":"4.809129000000000000000000000000"
    ,"4":"4.809129000000000000000000000000"
    ,"Latitude":"43.391950000000000000000000000000"
    ,"5":"43.391950000000000000000000000000"
    ,"Url":"http:\/\/google.com\r\n"
    ,"6":"http:\/\/google.com\r\n"
  }
 ]
} 


Ensuite.. pourquoi as tu tout en double.
et bien simplement parce que la commande fetchAll retourne à la fois un array INDEXE et un array associatif
autrement dit .. Tu auras tes valeurs dans les clés 0 ,1 ,2 ... et aussi Id (qui correspond à l'index 0) , Titre ( qui lui correspond à l'index 1... etc...
Donc c'est normal et nullement génant.