2012-11-29 2 views
2

Je rencontre un comportement étrange avec PHP. Fondamentalement, je veux exiger une classe dans un script PHP. Je sais que c'est simple et que je l'ai fait avant mais quand je le fais, ça change le comportement de ma réponse ajax (jquery) (1.8.3). Je cours une installation de wamp et ma version de PHP est 5.4.6.comportement étrange tout en incluant une classe en php

Voici un échantillon pour mon index.html

tête (en omettant les js jquery comprennent)

<script> 
    $(document).ready(function(){ 
     $('#submit').click(function(){ 
      var action = $('#form').attr('action'); 
      var form_data = { 
       fname: $('#fname').val(), 
       lname: $('#lname').val(), 
       phone: $('#phone').val(), 
       email: $('#email').val(), 
       is_ajax: 1 
      }; 

      $.ajax({ 
       type: $('#form').attr('method'), 
       url: action, 
       data: form_data, 
       success: function(response){ 
        switch(response){ 
         case 'ok': 
          var msg = 'data saved'; 
         break; 
         case 'ko': 
          var msg = 'Oops something wrong happen'; 
         break; 
         default: 
          var msg = 'misc:<br/>'+response; 
         break; 
        } 
        $('#message').html(msg); 
       } 
      }); 

      return false; 
     }); 
    }); 
</script> 

corps

<div id="message"></div> 
<form id="form" action="handler.php" method="post"> 
    <p> 
     <input type="text" name="fname" id="fname" placeholder="fname"> 
     <input type="text" name="lname" id="lname" placeholder="lname"> 
    </p> 
    <p> 
     <input type="text" name="phone" id="phone" placeholder="phone"> 
     <input type="text" name="email" id="email" placeholder="email"> 
    </p> 
    <input type="submit" name="submit" value="submit" id="submit"> 
</form> 

Et comme pour le fichier handler.php:

<?php 
    require('class/Container.php'); 

    $filename = 'xml/memory.xml'; 

    $is_ajax = $_REQUEST['is_ajax']; 
    if(isset($is_ajax) && $is_ajax){ 

     $fname = $_REQUEST['fname']; 
     $lname = $_REQUEST['lname']; 
     $phone = $_REQUEST['phone']; 
     $email = $_REQUEST['email']; 

     $obj = new Container; 
     $obj->insertData('fname',$fname); 
     $obj->insertData('lname',$lname); 
     $obj->insertData('phone',$phone); 
     $obj->insertData('email',$email); 
     $tmp = $obj->give(); 
     $result = $tmp['_obj']; 
     /* 
      Push data inside array 
     */ 
     $array = array(); 
     foreach($result as $key => $value){ 
      array_push($array,$key,$value); 
     } 

     $xml = simplexml_load_file($filename); 
     // check if there is any data in 
     if(count($xml->elements->data) == 0){ 
      // if not, create the structure 
      $xml->elements->addChild('data',''); 
     } 
     // proceed now that we do have the structure 
     if(count($xml->elements->data) == 1){ 
      foreach($result as $key => $value){ 
       $xml->elements->data->addChild($key,$value); 
      } 
      $xml->saveXML($filename); 
      echo 'ok'; 
     }else{ 
      echo 'ko'; 
     } 
    } 
?> 

La classe Container:

<?php 
    class Container{ 
     private $_obj; 

     public function __construct(){ 
      $this->_obj = array(); 
     } 

     public function addData($data = array()){ 
      if(!empty($data)){ 
       $oldData = $this->_obj; 
       $data = array_merge($oldData,$data); 
       $this->_obj = $data;  
      } 
     } 

     public function removeData($key){ 
      if(!empty($key)){ 
       $oldData = $this->_obj; 
       unset($oldData[$key]); 
       $this->_obj = $oldData; 
      } 
     } 

     public function outputData(){ 
      return $this->_obj; 
     } 

     public function give(){ 
      return get_object_vars($this); 
     } 


     public function insertData($key,$value){ 
      $this->_obj[$key] = $value; 
     } 
    } 
?> 

La chose étrange est que mon résultat toujours tomber sous l'instruction switch par défaut et la réponse ajax correspondent à la fois présente déclaration. J'ai alors remarqué que si je collais juste la classe Container en haut du fichier handler.php, tout fonctionnait correctement, mais c'était en quelque sorte une défaite de ce que j'essayais d'accomplir.

J'ai essayé différemment d'inclure la classe Conteneur, mais il semble que le problème soit spécifique à ce scénario.

J'apprends toujours PHP et je pense qu'il me manque quelque chose de vraiment basique. Je recherche aussi sur stackoverflow concernant le problème que je rencontre ainsi que PHP.net, sans succès.

Cordialement,

Répondre

1

Je pense que vous avez un espace blanc à la fin de votre fichier de classe, ce qui est à l'origine de la sortie pour être « ok » au lieu de « ok ». Cela peut être le résultat de l'utilisation de certaines applications pour éditer vos fichiers ou de l'ajout accidentel d'un espace après la fermeture ?>. Essayez de supprimer la fermeture ?> dans votre classe php tous ensemble. Ceci n'est pas seulement autorisé (PHP finira automatiquement le traitement à la fin du fichier de toute façon), mais souvent encouragé dans de nombreux guides de style pour éviter exactement le genre de chose que vous décrivez.

Une autre chose que je fais habituellement pour ce type de situation, est au lieu de retourner une chaîne simple, je retourne une chaîne json, qui jQuery se transformera automatiquement en un objet javascript pour vous. Cela permettrait également de prévenir, ou au moins vous faire savoir tout de suite que vous rencontrez le type de problème ci-dessus.

donc php retentirait comme ceci:

exit(json_encode(array('status' => 'ok'))); 

et jQuery recevrait comme ceci:

$.ajax({ 
     type: $('#form').attr('method'), 
     url: action, 
     data: form_data, 
     dataType: 'json', 
     success: function(response){ 
      switch(response.status){ 
       case 'ok': 
        var msg = 'data saved'; 
       break; 
       case 'ko': 
        var msg = 'Oops something wrong happen'; 
       break; 
       default: 
        var msg = 'misc:<br/>'+response; 
       break; 
      } 
      $('#message').html(msg); 
     } 
    }); 

Notez la valeur ajoutée des paramètres dataType dans l'appel ajax, ainsi que l'utilisation response.status pour vérifier la propriété d'état que nous avons créée en PHP.

Cela vous permet également de renvoyer plusieurs valeurs dans votre réponse. Vous pouvez construire l'objet ou le tableau comme vous le souhaitez du côté de PHP, et vous recevrez essentiellement la même chose qu'un objet javascript du côté javascript.

+0

@ user1864539 a ajouté quelques informations supplémentaires. – dqhendricks

+0

Merci, le json_encode a fait l'affaire. Quant à la fin php char je ne savais pas! Il n'y avait pas d'espace à la fin du fichier PHP mais je comprends le cauchemar qu'il aurait pu être! Merci encore! – happy

Questions connexes