Jump to content

[résolu] Erreur 500 (internal server error) avec un script js


Recommended Posts

Bonjour,

 

J'essai d'actualiser une liste déroulante dans un module et j'ai une erreur 500

 

dans la console :

GET https://mnsite.fr/modules/compatibilite/compatibilite.php?compa1=1 500 (Internal Server Error) jquery-1.11.0.min.js:4send jquery-1.11.0.min.js:4n.extend.ajax jquery-1.11.0.min.js:4(anonymous function) compatibilite.js:6n.event.dispatch jquery-1.11.0.min.js:3r.handle

mon script js

$(document).ready(function(){
$("#compa1").change(function() {
  var selectedVal = $('#compa1 :selected').val();
  console.log('Selected value : ' + selectedVal);
  var val = jQuery(this).val();
  $.ajax({
				url: '../../modules/compatibilite/compatibilite.php',
                data: 'compa1='+ val, // on envoie $_GET['compa1']
                dataType: 'html',
                success: function(json) {
                    $.each(json, function(index, value) {
                        $('#compa2').append('<option value="'+ index +'">'+ value +'</option>');
                    });
                }
            });
	console.log('Data : ' + val);
});
});

si quelqu'un peu me filer un coup de main ça serait cool...

 

merci

Edited by gudule1er (see edit history)
Link to comment
Share on other sites

biensur que je lis les réponses...

j'ai même eu loulou66 via skype et qui ne comprend pas non plus pourquoi j'ai (anonymous function) sur $.ajax alors que nous avons bien vérifier que jquery est appelé avant mon script...


et j'ai pareil pour POST... (anonymous function)

Link to comment
Share on other sites

je met ce qu'il y a dans la fonction getContent()

public function getContent(){
		global $smarty;
		Tools::addJS(($this->_path).'js/compatibilite.js', 'all');
		$req_sortie=Db::getInstance()->ExecuteS('select id, value from '._DB_PREFIX_.'compatibilite1');
		$req_sortie2=Db::getInstance()->ExecuteS('select id, id_compa1, value from '._DB_PREFIX_.'compatibilite2');
		$req_sortie3=Db::getInstance()->ExecuteS('select id, id_compa1, id_compa2, value from '._DB_PREFIX_.'compatibilite3');
		if (Tools::isSubmit('submitCompa1'))
		{
				
				$value_insert_compa1=Tools::getValue('text_compa1');
				if ($value_insert_compa1!="") {
				$insert_db_compa1=dB::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'compatibilite1 SET value="'.$value_insert_compa1.'" ON DUPLICATE KEY UPDATE value="'.$value_insert_compa1.'"');
				unset($value_insert_compa1);
		}
		}
		if (Tools::isSubmit('submitCompa2'))
		{
				
				$value_insert_compa2=Tools::getValue('text_compa2');
				$id_insert_compa1=Tools::getValue('compa1');
				if ($value_insert_compa2!="") {
				$insert_db_compa2=dB::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'compatibilite2 SET value="'.$value_insert_compa2.'", id_compa1="'.$id_insert_compa1.'"');
				unset($value_insert_compa2);
		}
		}	
		if (Tools::isSubmit('submitCompa3'))
		{
				
				$value_insert_compa3=Tools::getValue('text_compa3');
				$id_insert_compa2=Tools::getValue('compa2');
				$id_insert_compa1=Tools::getValue('compa1');
				if ($value_insert_compa3!="") {
				$insert_db_compa2=dB::getInstance()->Execute('INSERT INTO '._DB_PREFIX_.'compatibilite3 SET value="'.$value_insert_compa3.'", id_compa1="'.$id_insert_compa1.'", id_compa2="'.$id_insert_compa2.'"');
				unset($value_insert_compa3);
		}
		}
		$this->_html.='
		<h2>Configuration du module de '.$this->displayName.'</h2>
		<h2>Première option</h2>
					<form method="post" method="updateCompa1">

			<select name="compa1" id="compa1">
			<option value="select">-- Sélectonner une option --</option>';
			foreach($req_sortie as $value_select_req)
		{
		$id_compa1=$value_select_req['id'];
		$value_compa1=$value_select_req['value'];
		$this->_html.='<option value='.$id_compa1.'>'.$value_compa1.'</option>';
		}
		$this->_html.='
			</select>
			<p>ou entrer une nouvelle option dans la base</p>
			<input type="text" name="text_compa1"></input>
			<button type="submit" name="submitCompa1">Update</button>

			<h2>Deuxième option (dépend de l\'option 1)</h2>
			<select name="compa2" id="compa2">
			<option value="select">-- Sélectonner une option --</option>';
			
				foreach($req_sortie2 as $value_select_req2)
		{
		$id_compa2=$value_select_req2['id'];
		$value_compa2=$value_select_req2['value'];
		$this->_html.='<option value='.$id_compa2.'>'.$value_compa2.'</option>';
		}
		$this->_html.='
			</select>
			
			<input type="text" name="text_compa2"></input>
			<button type="submit" name="submitCompa2">Update</button>
			<h2>Troisième option (dépend de l\'option 1 et 2)</h2>
			<select name="compa3" id="compa3">
			<option value="select">-- Sélectonner une option --</option>';
			foreach($req_sortie3 as $value_select_req3)
		{
		$id_compa3=$value_select_req3['id'];
		$value_compa3=$value_select_req3['value'];
		$this->_html.='<option value='.$id_compa3.'>'.$value_compa3.'</option>';
		}
		$this->_html.='
			</select>
			<input type="text" name="text_compa3"></input>
			<button type="submit" name="submitCompa3">Update</button>
			</form>
			
		';

			return $this->_html;
			
}

dans le BO j'ai bien les listes déroulantes ainsi que la possibilité d'ajouter des valeurs dans la BDD et ça fonctionne

Link to comment
Share on other sites

 

si je comprend bien, il faudrait que je fasse un fichier PHP distinct pour traiter mes requêtes du fichier JS ?

 

Oui, par exemple fichier ajax.php dans votre module.

Extrait de la DOC (edit: voir le lien donné) :

// Located in /modules/mymodule/ajax.php
require_once(dirname(__FILE__).'../../../config/config.inc.php');
require_once(dirname(__FILE__).'../../../init.php');
switch (Tools::getValue('method')) {
  case 'myMethod' :
    ... // What you want
    break;
  default:
    exit;
}
exit;
Edited by Yopixel (see edit history)
Link to comment
Share on other sites

Si vous avez besoin d’accéder à la classe principale de votre module vous pouvez aussi inclure le fichier, ma méthode consiste à récupérer la variable action et ajax et d’appeler une méthode ajaxCall de ma classe principale : 

 

<?php


$useSSL = true;
include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');
include(dirname(__FILE__).'/../MyModule.php');


$mymodule = new MyModule();
echo $mymodule->ajaxCall(Tools::getValue('ajax'), Tools::getValue('action'));

ensuite je switch dans ma methode principale pour avoir mon retour ( en json tjrs !)

 

mais si vous savez que vous allez avoir une seul action vous pouvez juste créer une méthode displayAjaxMonaction()

  • Like 1
Link to comment
Share on other sites

Bonjour,

 

j'ai toujours le soucis d'une erreur 500 sur mon fichier ajax.php

 

mon fichier js

$(document).ready(function(){
$("#compa1").change(function() {
  var selectedVal = $('#compa1 :selected').val();
  console.log('Selected value : ' + selectedVal);
  var val = jQuery(this).val();
  var query = $.ajax({
				type: 'POST',
				url: '../../modules/compatibilite/ajax.php',
                data: 'compa1='+ val, // on envoie $_GET['compa1']
                dataType: 'json',
                success: function(json) {
                    $.each(json, function(index, value) {
                        $('#compa2').append('<option value="'+ index +'">'+ value +'</option>');
                    });
                }
            });
	console.log('Data : ' + val);
});
});

et mon fichier ajax.php

require_once(dirname(__FILE__).'../../../config/config.inc.php');
require_once(dirname(__FILE__).'../../../init.php');
include(dirname(__FILE__).'/compatibilite.php');
switch (Tools::getValue('compa1')) {
  case 'compa1' :
	$filtre_compa2=$_POST['compa1'];
	$aff_filtre_compa2=Db::getInstance()->ExecuteS('select id, value from '._DB_PREFIX_.'compatibilite2 WHERE id_compa1='.$filtre_compa2.'');
	foreach ($aff_filtre_compa2 as $result_compa2) 
	{
    die( Tools::jsonEncode( array('id_compa2'=>'id')
								('value_compa2'=>'value')
								);
	}
    break;
  default:
    exit;
}
exit;

je comprend pas tout, mais ça vous avez du le voir, de plus j'ai toujours (anonymous function) sur la ligne 6 de mon fichier js qui est var query =$.ajax etc

 

merci pour votre aide

Link to comment
Share on other sites

 var query = $.ajax({ ... ?!

AJAX est asynchrone par défaut, vous ne pouvez pas affecter comme ceci le résultat à la variable query. D'ailleurs dans quel but ?

Si vous avez un but, passez en asynchrone (async = false) ou bien définissez votre variable dans le success (success : function (data) { var query = data;} et si vous n'avez pas de but n'affectez rien !

 

Par ailleurs les chemins d'appel à compatibilite.php sont-ils corrects ?

 

Également :

console.log('Data : ' + val);

Ce n'est pas clair, soit vous comptez loguer la réponse retournée par le serveur soit la valeur de la variable val (que vous avez définie avant l'appel), dans l'un ou l'autre cas le console.log n'est pas cohérent.

Edited by Yopixel (see edit history)
Link to comment
Share on other sites

bonjour,

 

j'avance un peu

switch (Tools::getValue('method')) {
  case 'compa1' :
	$filtre_compa2=$_POST['compa1'];
	$aff_filtre_compa2=Db::getInstance()->ExecuteS('select id, value from '._DB_PREFIX_.'compatibilite2 WHERE id_compa1='.$filtre_compa2.'');
	foreach ($aff_filtre_compa2 as $result_compa2) 
	{
	Tools::jsonEncode( array(id_compa2=>$result_compa2['id'],
			value_compa2=>$result_compa2['value'],));
	}

je n'ai plus d'erreur 500 sur ce bout de code par contre je n'arrive pas à bien utiliser la classe Tools::jsonEncode()

j'ai cherché sur le net mais aucune référence ou autre tuto...

 

une personne pourrais m'expliquer comment remplir le tableau pour le retour

 

merci

Edited by gudule1er (see edit history)
Link to comment
Share on other sites

alors la suite, je n'ai plus aucune erreur dans la console avec cette syntaxe...

require_once(dirname(__FILE__).'../../../config/config.inc.php');
require_once(dirname(__FILE__).'../../../init.php');
switch (Tools::getValue('method')) {
  case 'compa1' :
	$filtre_compa2=$_POST['compa1'];
	$aff_filtre_compa2=Db::getInstance()->ExecuteS('select id, value from '._DB_PREFIX_.'compatibilite2 WHERE id_compa1='.$filtre_compa2.'');
	
    Tools::jsonEncode();
	
}
exit;

pas sur que ce soit bon quand même puisque je ne sais pas comment affiché le success dans mon fichier

Edited by gudule1er (see edit history)
Link to comment
Share on other sites

 data: 'compa1='+ val, //
switch (Tools::getValue('method'))

 method correspond à quoi ? Mettez 'compa1', pas l'exemple de la doc !

Tools::jsonEncode();

?! Il n'y a aucune valeur. Et puis aucun retour par la suite.

 

J'ai l'impression que vous faites tout un peu au hasard.

 

Je préfère quitter ce topic, désolé mais ça tourne en rond !

Link to comment
Share on other sites

j'ai essayer de faire passer "$aff_filtre_compa2" qui me sort un tableau avec les résultats, mais ça ne fonctionne pas...

c'est pour ça que je demander si il y avais un doc pour cette fonction...

 

j'ai été voir dans le fichier tools.php pour voir à quoi ressemblé cette fonction, en effet elle attend un $data, mais je n'arrive pas à comprendre quoi...

 

j'ai lu que le json transformer un tableau php en tableau json pour un retour en javascript, mais je n'arrive pas à faire passer quoi que ce soit dedans...

Link to comment
Share on other sites

dans votre script,faites un Tools::jsonEncode($result);

 

$result étant votre tableau à envoyer,

 

Puis ouvrez votre console(f12) et regardez la réponse à votre requête ( ou ouvrez directement l'url appelée dans votre navigateur)

 

Pour info les erreurs 500 trouvent leur explication dans le fichier error.log de php

 

Je pense que vous avez bien activé l'affichage des erreurs dans votre boutique, n'est ce pas ?

Link to comment
Share on other sites

ça ne fonctionne pas...

 

j'ai ça dans la console : Notice: Undefined variable: result in /home/mototestdb/www/modules/compatibilite/ajax.php on line 9

 

et la ligne 9 c'est ça :

Tools::jsonEncode($result);

et ùon fichier ajax.php

require_once(dirname(__FILE__).'../../../config/config.inc.php');
require_once(dirname(__FILE__).'../../../init.php');
switch (Tools::getValue('method')) {
  case 'compa1' :
	$filtre_compa2=Tools::getValue('compa1');
	$req_filtre_compa2=Db::getInstance()->ExecuteS('select id, value from '._DB_PREFIX_.'compatibilite2 WHERE id_compa1='.$filtre_compa2.'');
	foreach ($req_filtre_compa2 as $aff_compa2)
    Tools::jsonEncode($result);
}
exit;
Link to comment
Share on other sites

donc j'ai fait ça...

require_once(dirname(__FILE__).'../../../config/config.inc.php');
require_once(dirname(__FILE__).'../../../init.php');
switch (Tools::getValue('method')) {
  case 'compa1' :
	$filtre_compa2=Tools::getValue('compa1');
	echo $filtre_compa2;
	$req_filtre_compa2=Db::getInstance()->ExecuteS('select id, id_compa1, value from '._DB_PREFIX_.'compatibilite2 WHERE id_compa1='.$filtre_compa2.'');
	foreach ($req_filtre_compa2 as $resultat)
    Tools::jsonEncode($resultat);
}
exit;

comme ça je fait passer mon tableau php dans la fonction jsonEncode, et dans la console j'ai bien la valeur que je fais passer mais en réponse j'ai "no properties"

Link to comment
Share on other sites

Ben en regardant votre code vous envoyez un json_encode à chaque boucle du foreach, en aucun cas vous ne renvoyez un tableau...
 
A la limite un 

	foreach ($req_filtre_compa2 as $resultat) {
                $result[$resultat['id_compta1']] = $resultat['value']
        }
    Tools::jsonEncode($result);

soit vous supprimez cette boucle foreach qui ne sert à rien et vous envoyez directement:

    Tools::jsonEncode($req_filtre_compa2);

Enfin, difficile de vous en dire plus comme cela, ne sachant pas ce que vous voulez obtenir, pour en faire quoi, ni ce que contient votre base de données.
 
Toujours est-il que jsonEncode ne sert qu'au transport de vos données entre votre script php et votre script js, et qu'il ne fait rien d'autre. Donc ce que vous envoyez, vous le récupérez à l'identique.
 
PS: Dans mon post précédent,

"dans votre script,faites un Tools::jsonEncode($result);
$result étant votre tableau à envoyer,"

 

$result était juste un exemple, à vous de définir le nom de votre tableau. Je n'ai pas dit de recopier mon exemple sans réfléchir. Car là évidemment vous avez un résultat vide et une notice disant que $result n'est pas défini....

Edited by Eolia (see edit history)
Link to comment
Share on other sites

quand je met Tools::jsonEncode($req_filtre_compa2); j'ai le même résultat "no properties"

 

alors je cherche à faire des listes déroulantes dynamique...

quand on sélectionne une valeur dans compa1, je fais un filtre pour afficher les valeurs correspondante dans compa2

 

la structure de mes tables :

 

table1 : id, value

table2 : id, id_table1, value

table3 : id, id_table1, id_table2, value

 

table1 correspond à la liste compa1, table à la liste compa2 et table3 à la liste compa3

Edited by gudule1er (see edit history)
Link to comment
Share on other sites

et avec un var_dump() vous voyez quelquechose ?

require_once(dirname(__FILE__).'../../../config/config.inc.php');
require_once(dirname(__FILE__).'../../../init.php');
switch (Tools::getValue('method')) {
  case 'compa1' :
	$filtre_compa2=Tools::getValue('compa1');
	echo $filtre_compa2;
	$req_filtre_compa2=Db::getInstance()->ExecuteS('select id, id_compa1, value from '._DB_PREFIX_.'compatibilite2 WHERE id_compa1='.$filtre_compa2.'');
	die(var_dump($req_filtre_compa2));
}

Link to comment
Share on other sites

Bon, je pense qu'effectivement il vous manque des bases en php/mySql...

 

Vous n'avez pas 2 tableaux, mais un seul:

- Votre array comporte les résultats obtenus sous la forme:

 

Ensemble des résultats (1 array) :

- 1er résultat [0] donne un sous-array avec 3 entrées

 

Il vous suffit de récupérer les valeurs du premier indice du tableau ( [0] ) dans votre script 

// récupère les résultats compris dans le 1er index du tableau
    $result['id'] = $req_filtre_compa2[0]['id'];
    $result['id_compa1'] = $req_filtre_compa2[0]['id_compa1'];
    $result['value'] = $req_filtre_compa2[0]['value'];

    Tools::jsonEncode($result);


Un article qui peut vous servir:

http://www.prestashop.com/blog/fr/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5/

 

Avant d'aller plus loin, je vous conseille quand même de lire les tutoriaux concernant la syntaxe et l'usage des langages php, mysql et javascript. Copier/coller un code n'avance pas à grand chose si on a pas compris son fonctionnement.

Link to comment
Share on other sites

bon alors j'arrive à faire mon retour json sans aucune erreur

$req_filtre_compa2=Db::getInstance()->ExecuteS('select id, id_compa1, value from '._DB_PREFIX_.'compatibilite2 WHERE id_compa1='.$filtre_compa2.'');
echo Tools::jsonEncode($req_filtre_compa2);

avec ce code j'ai bien mon tableau avec toute les réponses contenue dans la BDD

[{"id":"1","id_compa1":"1","value":"Shiver 750 ABS"},{"id":"3","id_compa1":"1","value":"Shiver 750"}] 

en gros il manquait juste "echo"

 

mais pour vous embêter encore un peu, comment je fais pour afficher ça dans la page d'admin de mon module.

 

voilà ce que j'ai dans le success

success: function(json) {
                    $.each(json, function(id, value) {
                        $('#compa2').append('<option value="'+ id +'">'+ value +'</option>');
                    }); 

merci encore pour votre aide et patiente 

de mon fichier js

Edited by gudule1er (see edit history)
Link to comment
Share on other sites

je ne sais pas quelle est la forme de votre tableau retour mais vous devez pouvoir récupérer vos variables sous la forme json['id'], json['value'], etc... ou

if (typeof json['id'] === "undefined") {
	var jsonObject = JSON.parse(json);
//si vous avez prévu une gestion d'erreur qui envoie $req_filtre_compa2['error'] = 2; par exemple
if (json.error === 2)
   alert('Message erreur correspondant);
}
Link to comment
Share on other sites

non je ne gère pas les erreurs...

j'ai fait ce code et ça fonctionne 

success: function(data) {
                    $.each(data, function(index, valeur) {
					console.log (valeur)
						$('#compa2').append('<option value="'+ valeur.id +'">'+ valeur.value +'</option>');
                    });
                }

j'ai juste un soucis, quand je sélectionne une première option dans "compa1" ça m'affiche bien les infos dans "compa2".

par contre que je reselectionne une autre option dans "compa1" ça ne m’efface pas le contenue précédent de "compa2"

Link to comment
Share on other sites

Ben là on n'est plus dans l'ajax mais dans le javascript/jquery avec action suivant les événements

A vous de déterminer suivant le onchange qu'est ce qui doit être affiché/caché ou modifié

$(document).ready(function(){ 
	$('.id_de_votre_1er_select').change(function() {
		if($(this).val() == "0") 
                    //faire quelquechose...
        }
});
Edited by Eolia (see edit history)
Link to comment
Share on other sites

alors avec ce code ça fonctionne

$("#compa1").change(function() {
	var verifCompa2 = $('#compa2 :selected').val();
	if (verifCompa2 !="") { $('#compa2').empty(); }

par contre j'ai un truc bizarre, encore vous allez me dire

j'active ma deuxieme requete pour mon compa2 et la j'ai une erreur

switch (Tools::getValue('method')) {
	case 'compa1' :
		$filtre_compa2=Tools::getValue('compa1');
		$req_filtre_compa2=Db::getInstance()->ExecuteS('select id, value from '._DB_PREFIX_.'compatibilite2 WHERE id_compa1='.$filtre_compa2.'');
		echo Tools::jsonEncode($req_filtre_compa2);
	
		
	case 'compa2' :
		$filtre_compa3=Tools::getValue('compa2');
		$req_filtre_compa3=Db::getInstance()->ExecuteS('select id, value from '._DB_PREFIX_.'compatibilite3 WHERE id_compa2='.$filtre_compa3.'');
		echo Tools::jsonEncode($req_filtre_compa3);
}

alors que c'est la même requete qu'au dessus avec une table différente...

 

le message d'erreur...

 

<b>Fatal error</b>:  Uncaught You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1<br /><br /><pre>select id, value from ps_prodcompatibilite3 WHERE id_compa2=</pre>
  thrown in <b>/home/mototestdb/www/classes/db/Db.php</b> on line <b>635</b><br />
Link to comment
Share on other sites

Bonjour,

 

en faisant comme ça c'est parfait :

success: function(data) {
						$('#compa2').html('<option value="select">-- Sélectionner une option --</option>');
                    $.each(data, function(index, valeur) {
						
						$('#compa2').append('<option value="'+ valeur.id +'">'+ valeur.value +'</option>');
                    });
                }
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...