[RESOLU] Internal Server Error

Eléphant du PHP | 53 Messages

11 oct. 2016, 13:55

Bonjour,

Actuellement en développement sur une application web, je rencontre un problème. J'ai effectué un appel ajax qui marche et me permet donc d'accéder à une page demandée (saisieOtp.php) .

Le problème étant que j'obtiens un : Internal Server Error, dès que j'utilise une fonction dans mon saisieOtp.php.

Voici l'appel ajax:
var nom = "Tom";

$(function(){
  $("#retourNavBar").click(function() {
    $.ajax({
       url: 'vue/ressources/saisieOtp.php',
       type: 'POST',
       dataType: 'html',
       data: 'idMachine!' + nom,
    success: function(msg) {
          alert(msg);
    },
   error: function(resu, statut, erreur) {
         alert(erreur);
    }
  });
 });
});
Et ma reception php: (saisieOtp.php)
<?php 
include_once('../Ressources/Modele/class/Employe.php');

if (isset($_POST['idMachine']) && $_POST['idMachine'] == "Tom") {
  $employe = $_SESSION['employe']->getId();
}
?>
Avec un var_dump, j'arrive facilement à afficher la valeur de $_SESSION['employe'], ou même de beaucoup d'autres variables qui me sont utiles. Le problème se situe lorsque j'emploie la fonction getId() , j'ai bien inclus mon fichier où se trouve cette fonction (include_once('../Ressources/Modele/class/Employe.php');) Seulement, dès que j'essaie d'employer getId, j'obtiens l'erreur: Internal Server Error.

Si quelqu'un voit d'où cela pourrait provenir !

Bonne fin de journée.
Modifié en dernier par tlalaguedulac le 11 oct. 2016, 14:55, modifié 2 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

11 oct. 2016, 14:51

Bonjour,

"Internal Server Error." => c'est une erreur du côté de ton serveur Apache/PHP et pas du côté de javascript.
Pour trouver l'origine, il faut que tu regardes dans les logs de ton serveur Apache.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 53 Messages

11 oct. 2016, 14:54

Bonjour,

J'ai posté le code de l'appel ajax seulement par précaution, je sais que l'erreur vient de php, c'est pour cela que je demandais pourquoi l'include de mon fichier ne fonctionne pas et donc pourquoi je ne peux pas utiliser ma fonction php dans mon fichier php et non coté javascript.

Si tu as plus d'info sur ce point la.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

11 oct. 2016, 15:20

salut,

il faut être parfois précis, c'est une méthode pas une fonction ;)
la différence c'est que cela inclus que dans $_SESSION['employe'] se trouve un objet (a priori de type Employe).

est ce que tu aurais le message d'erreur complet des fois ?

est ce que par hasard ce ne serait pas une sombre histoire de méthode getId() qui n'existe pas sur un null ?

parce la, sauf configuration particulière de ta par ou de ton hébergeur, tu n'as pas de session_start() et donc aucune chance d'avoir quelque chose dans l'index voulu.

d'ailleurs un var_dump($_SESSSION); doit te l'indiquer ;)

c'est tout ce que l'on peu déduire de ce code.

Pense a toujours donner le message d'erreur complet sinon c'est quand même un peu de la magie noire ;)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 53 Messages

11 oct. 2016, 15:28

Salut,

Désolé, mais j'ai obtenu ce message en faisant un debugg (var_dump coté php, alert coté js) du retour de l'appel ajax. Donc je n'obtenais rien de convaincant, simplement error [object] internal server error 500.

J'utilise maintenant le session_start, qui me permet de récupérer des variables SESSION, mais je ne peux toujours pas utiliser ce getId().

Je vais voir si je peux obtenir un message plus probant pour l'erreur. Mais je ne comprend vraiment pas pourquoi je ne peux utiliser cette méthode, si tu veux j'ai le code source de la classe qui emploie cette dernière.

Eléphant du PHP | 53 Messages

11 oct. 2016, 16:23

Tu penses avoir une idée ? Sinon je peux clore le sujet. Je touche presque au but, si je peux utiliser cette fonction(getId()) dans mon fichier ce serait vraiment top.

Car j'ai voulu contourner le problème en envoyant directement les données du getId() récupérer dans la page de l'appel AJAX or c'est trop tôt et donc je n'ai pas encore les données stockées dans mes variables. Il faut donc bien que je réalise ce remplissage grace à getId() dans mon fichier saisieOtp.php.

J'ai trouvé plus d'infos sur mon erreur, dans la console, j'obtiens l'erreur anonymous function quand je place un require_once.

Effectivement j'ai lu que include laisse passer et n'émet qu'un warning, alors que require_once fait apparaitre une erreur, celle que je viens de décrire. Le problème vient donc de là, mais pourquoi ca se passe ..

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

12 oct. 2016, 13:28

ça donne quoi un var_dump($_SESSION); ?

l'inclusion de la classe je sais pas si c'est utile :)
voir si tu as définis les méthodes qui vont bien pour une sérialisation sereine ? http://php.net/manual/fr/function.serialize.php (le plus simple c'est d'utiliser du json pour le format sérialisé).

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 53 Messages

13 oct. 2016, 09:14

Salut Moogli,

Désolé pour hier aprem j'étais sur autre chose j'ai pas pensé à regarder le forum.

Je viens de faire un var_dump($_SESSION) comme tu me l'as demandé.

Je n'ai pas pu copier coller le retour car il s'affiche en alert (.success de $.ajax) donc j'ai des captures d'écran. Je ne savais pas qu'il était possible de toutes les afficher comme ceci.

Image

Image

Voici ce que j'obtiens. Je ne comprend pas trop le rapport en methode et serialisation ? Tu peux m'expliquer ? La sérialisation c'est pour l'envoi ajax et le retour non ? A part s'il faut envoyer les definitions de classe pour pouvoir appliquer les méthodes voulues dans le fichier ciblé ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 oct. 2016, 12:41

alors pour l'affichage, tu ouvres les outils de développement de ton navigateur (ctrl + i ou F12), dans l'onglet réseau tu verra la requête et toutes les données dans le corps de réponse :-)~

sinon utilise un client rest pour tester.

c'est po simple avec une image :)

par contre elle confirme ce que dit php et ce que je soupconne $_SESSION['employe'] n'existe pas !

tu as une liste d'employé, peux être qu'il te faut chercher dans cette liste pour récupérer le bon utilisateur ?

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 53 Messages

13 oct. 2016, 13:33

Merci pour les tuyaux, je t'accorde qu'avec une image c'est deguelasse même :) ! (Tu peux le dire haha)

J'ai oublié d'update le code de mon appel ajax sur le post car j'envoie l'idEmploye, et donc il existe, car je peux le récupérer par la suite.

Mon code n'a pas beaucoup changé, j'envoie presque tout ce dont j'ai besoin.
<script>
		var nom = '<?php echo $employe;?>';
		var res = '<?php echo json_encode($res); ?>';

			$(function(){
				$("#retourNavBar").click(function() {
					$.ajax({
						url: 'vue/ressources/saisieOtp.php',
						type: 'POST',
						dataType: 'html',
						data: { idEmploye: nom,
										idTache: res
						},
						success: function(msg) {
							alert(msg);
						},
						error: function(resu, statut, erreur) {
							alert(erreur);
						}
					});
				});
			});

		</script>
Sauf la méthode getId(), car effectivement je ne peux pas utiliser getId() sur ma page d'appel Ajax pour ensuite l'envoyer, il faut que j'effectue ce traitement à la reception et non à l'envoi. Et ce qui est bizarre c'est que sur ma page d'envoi, la methode getId() marche, mais quand je suis dans la reception plus rien.

Au cas ou, ma reception ressemble à ça et j'ai besoin d'utiliser le getId() dans mon foreach pour récupérer l'id ainsi que getHeures pour récupérer les heures. Peut etre verras tu mieux le but de ma recherche :)
if (isset($_POST['idEmploye']) && isset($_POST['idTache'])) {

    session_start();

    $i = 0;

    var_dump($_SESSION);
    $employe = $_POST['idEmploye'];
    $machine = $_SESSION['idMachineEnCours'];
    $site = $_SESSION['site'];
    //var_dump($site->getId());
    $idMachineEnCours = $machine;
    $res = json_decode($_POST['idTache']);

    foreach ($_SESSION['matriceTachesConduite'][$idMachineEnCours] as $cle => $tache) {
      // if ($_SESSION['matriceDureesTachesConduite'][$idMachineEnCours][$res[$i]]->getHeures() > 0) {
      //   saveOtp($_SESSION['matriceDureesTachesConduite'][$idMachineEnCours][$tache->getId()]->getHeures(), $tache->getId(), $machine, 'otp', $employe, $site->getId());
      //  }
      $i++;
    }
  }

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 oct. 2016, 14:33

du coup avec ce que tu indiques tu dois pouvoir faire un truc dans le genre
<?php
if (!empty($_POST['idEmploye']) && !empty($_POST['idTache'])) {
    session_start();
    $site = $_SESSION['site'];

    if (!isset($_SESSION['matriceTachesConduite'][$_SESSION['idMachineEnCours']])) {
        // message d'erreur
    } else {
        // tu peux directement mettre la machine en cours en session c'est quand même plus simple :)
        $res = json_decode($_POST['idTache']);
        $employe = getEmploye($_POST['idEmploye']);
        $machineEnCours = $_SESSION['matriceTachesConduite'][$_SESSION['idMachineEnCours']];
        foreach ($res as $k => $v) {
            $tache = $machineEnCours[$v];
            if ($tache->getHeures()>0) {
                // bon pour l'employe je pense que y a p'tet un soucis, sauf si tu t'attend a passer l'objet employé :)
                saveOtp($tache->getHeures(), $tache->getId(), $machineEnCours, 'otp', $employe, $site->getId());
            }
        }
    }
}

function getEmploye($id)
{
    foreach ($_SESSION['listeEmployes'] as $key => $value) {
        if ($value->getId()== $id) {
            return $value;
        }
    }
}
reste a tester.
avec ce script il n'y a pas d'affichage (a moins que saveOtp le fasse) et du coup tu va rien avoir coté JS pour ton alerte :)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 53 Messages

13 oct. 2016, 15:16

Non t'en fais pas j'ai besoin de rien afficher, je dois simplement entrer les variables voulues dans la base de données donc c'est nickel. Je vais essayer ta méthode de récréer une fonction getEmploye(). Le seul hic étant que j'aimerai utiliser le getId() et le getHeures() sur le $tache de mon foreach, et non sur le $employe.

Je marque résolu si c'est okay sinon je t'embete encore ! Haha :)

Merci pour toutes les infos en tout cas !
Modifié en dernier par tlalaguedulac le 13 oct. 2016, 15:24, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 oct. 2016, 15:22

de rien


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 53 Messages

13 oct. 2016, 15:26

J'ai édit mon message (au cas ou tu n'ai pas vu). Je dois employer ta méthode mais pour utiliser getId() sur $tache (dans mon foreach). Je ne pense pas posséder l'équivalent de $_SESSION['listeEmploye'] pour $tache, j'essaye et je te dis !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 oct. 2016, 16:28

tu veux la tache qui correspond à $_POST['idTache'] ?
tu n'as pas un moyen plus simple pour la trouver ?
ce serait aussi simple de faire des requêtes sql que de triturer des tableaux ;)

si les taches sont bien dans les machines contenue dans $_SESSION['matriceTachesConduite']
ça peux être comme ça
<?php
if (!empty($_POST['idEmploye']) && !empty($_POST['idTache'])) {
    session_start();
    $site = $_SESSION['site'];

    if (!isset($_SESSION['matriceTachesConduite'][$_SESSION['idMachineEnCours']])) {
        // message d'erreur
    } else {
        // tu peux directement mettre la machine en cours en session c'est quand même plus simple :)
        $res = json_decode($_POST['idTache']);
        $employe = getEmploye($_POST['idEmploye']);
        $machineEnCours = $_SESSION['matriceTachesConduite'][$_SESSION['idMachineEnCours']];
        foreach ($res as $k => $v) {
            $tache = getTacheFromMachine($machineEnCours[$v], $_POST['idTache']);
            if ($tache->getHeures()>0) {
                // bon pour l'employe je pense que y a p'tet un soucis, sauf si tu t'attend a passer l'objet employé :)
                saveOtp($tache->getHeures(), $tache->getId(), $machineEnCours, 'otp', $employe, $site->getId());
            }
        }
    }
}

function getEmploye($id)
{
    foreach ($_SESSION['listeEmployes'] as $key => $value) {
        if ($value->getId()== $id) {
            return $value;
        }
    }
}
function getTacheFromMachine($m, $tacheID)
{
    foreach ($m as $tache) {
        if ($tache->getId() == $tacheId) {
            return $tache;
        }
    }
}
function getTache($tacheId)
{
    foreach ($_SESSION['matriceTachesConduite'] as $m) {
        $tache = getTacheFromMachine($m, $tacheId);
        if ($tache->getId() == $tacheId) {
            return $tache;
        }
    }
}
@+
Il en faut peu pour être heureux ......