2017-08-01 1 views
1

Windows 10, Codeigniter 3, Wamp3.'Bad Request' avec ajax et codeigniter

La commande Ajax déclenche une erreur de demande incorrecte. Ceci est une vieille châtaigne mais la recherche en ligne montre habituellement le problème d'être CSRF. Cependant, je tiens à souligner, d'emblée que j'ai CSRF désactivé pour ce test:

config['csrf_protection'] = FALSE; 

J'ai mis en place un code de test volontairement très simple. Le contrôleur ressemble à ceci:

class Ajax extends CI_Controller { 

public function index() { 


$this->load->view('pages/index'); 
} 

public function hello($name) { 
    $fullname = $this->input->post('fullname'); 
    echo 'Hello '.$fullname; 

} 

}//EOF 

et la vue ressemble à ceci:

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Demo Ajax</title> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
<script> 
    $(function() { 
     $('#bttHello').click(function(){ 
      var fullname = $('#fullname').val(); 
      $.ajax({ 
       type:'POST', 
       data: {fullname: fullname}, 
       url:'<?php echo base_url('ajax/hello'); ?> + fullname', 
       success: function(result) { 
        $('#result1').html(result); 

       } 
      }); 

     }); 

    }); 
</script> 
</head> 
<body> 

Name <input type="text" id="fullname"> 
<input type="button" value="Hello" id="bttHello"> 
<br> 
<span id="result1"></span> 

</body> 
</html> 

La console montre une mauvaise demande

POST XHR http://localhost/faith/ajax/hello%20+%20fullname [HTTP/1.1 400 Bad Request 9ms] 

Donc, si CSRF est pas le coupable, est-il un problème de Wamp? Tout le reste semble bien fonctionner. J'ai passé tellement de temps là-dessus! Que se passe-t-il?

+0

Vous devriez vérifier votre journal d'erreur de serveur pour l'erreur réelle au lieu d'essayer de Devinez le problème. –

+0

Tout d'abord, vous utilisez post ajax alors pourquoi envoyer des paramètres de données attachent avec url. Pas besoin de publier des données pour envoyer des paramètres à la méthode du contrôleur. Deuxièmement bonjour param a besoin d'un nom, alors ce que vous attendez par un post normal. Troisième le paramètre que vous obtenez d'ajax est bien alors quel nom param fait dans ces belles parenthsis.Si ses paramètres optionnels les rendent optionnels. Supprimez param de l'ajax url et rendez la méthode param facultative dans la méthode. Vous êtes bon à aller .. –

Répondre

1

données par POST. Pas besoin de passer à travers l'URL

<script> 
$(function() { 
    $('#bttHello').click(function(){ 
    var fullname = $('#fullname').val(); 
    $.ajax({ 
     type:'POST', 
     data: {fullname: fullname}, 
     url:"<?php echo base_url('ajax/hello'); ?>", 
     success: function(result) { 
     $('#result1').html(result); 
     } 
    }); 
    }); 
}); 
</script> 

Et, supprimer le paramètre $name de l'action du contrôleur hello().

public function hello() { 
    $fullname = $this->input->post('fullname'); 
    echo 'Hello '.$fullname; 
} 
+0

Cela a fonctionné parfaitement - merci beaucoup! Maintenant j'ai un autre problème parce que quand j'active csrf je veux obtenir la valeur d'un cookie, mais jquery.cookie.js ne fonctionne pas pour moi ... – Perkin5

+0

@ Perkin5: J'aurais aimé pouvoir vous aider en ce qui concerne le nouveau problème. Mais, je n'ai pas travaillé dans le codeigniter avant. Donc, je ne vous détournerai pas du chemin. Je vais vous suggérer de poser une autre question au sujet du CSRF. * S'il vous plaît, ne me dérange pas. * –

-2
use this way 
you should concate fullname variable after quatation. 
like this 
url:'<?php echo base_url('ajax/hello'); ?>' + fullname 


<script> 
$(function() { 
    $('#bttHello').click(function(){ 
     var fullname = $('#fullname').val(); 
     $.ajax({ 
      type:'POST', 
      data: {fullname: fullname}, 
      url:'<?php echo base_url('ajax/hello'); ?>' + fullname, 
      success: function(result) { 
       $('#result1').html(result); 

      } 
     }); 

    }); 

}); 

+2

"* .. utiliser de cette façon *". Pouvez-vous s'il vous plaît expliquer pourquoi OP utilisera cette réponse. Chaque réponse a besoin d'explication. –

0

url écrire comme ce

"url": "<?php echo base_url().'ajax/hello';?>/" + fullname 

après /fullname son sont déjà envoyé une argument de function hello()

0

Try this ..

<?php echo form_open('ajax/hello', [ 
      'method' => 'post', 
      'class' => 'create_form' 
     ]); ?> 
     <input type="text" name="fullname" value="Full Name"/> 
<button type="submit">Create</button> 
    <?php echo form_close(); ?> 

et ajax

$(document).on('submit', 'form.create_form', function (e) { 
      var self = this; 
      var formData = new FormData($(this)[0]); 
      $.ajax({ 
       url: $(self).attr('action'), 
       type: 'POST', 
       data: formData, 
       async: false, 
       dataType: 'json', 
       success: function (res) { 
        console.log(res) 
       }, 
       cache: false, 
       contentType: false, 
       processData: false 
      }); 
      return false; 
     }); 
0

Le contrôleur CodeIgniter:

<?php 
class Ajax extends CI_Controller 
{ 
    public function index() 
    { 
     $this->load->view('pages/index'); 
    } 
    /** 
    * @param $name 
    */ 
    public function hello($name) 
    { 
     // if no $name params value pass and post exist 
     if (! isset($name) && $this->input->post('fullname')) { 
      // get value from post params 
      $fullname = $this->input->post('fullname', true); 
     } elseif (isset($name) && ! $this->input->post('fullname')) { 
      // get value from pass param method 
      $fullname = $name; 
     } else { 
      // default value 
      $fullname = 'No Name found'; 
     } 
     // show ajax response 
     echo $fullname; 
    } 
    /** 
    * Another way if we using GET params 
    * e.g. http://wwww.site.com/ajax/hello/my-name-value 
    * @param $name 
    */ 
    public function hello_another($name) 
    { 
     // if url has param as name value 
     // remember codeigniter will map all url params as method params as they provided 
     // no need to use get input, it will take from url string directly 
     if (isset($name)) { 
      // get value from get params 
      $fullname = $name; 
     } else { 
      // default value 
      $fullname = 'No Name found'; 
     } 
     // show ajax response 
     echo $fullname; 
    } 
    /** 
    * Another way if we using GET params and security is on top 
    * e.g. http://wwww.site.com/ajax/hello/my-name-value 
    * @param $name 
    */ 
    public function hello_another_secure($name) 
    { 
     // if url has param as name value 
     // remember codeigniter will map all url params as method params as they provided 
     // no need to use get input, it will take from url string directly 
     if (isset($name) && preg_match("/^[a-zA-Z'-]+$/", $name)) { 
      // get value from method params 
      $fullname = $name; 
     } else { 
      // default value 
      $fullname = 'No Name or invalid name found'; 
     } 
     // show ajax response 
     echo $fullname; 
    } 
} 
//EOF 

<script> 
    $(function() { 
     $('#bttHello').click(function(){ 
      var fullname = $('#fullname').val(); 
      $.ajax({ 
       type:'POST', 
       data: {fullname: fullname}, 
       url:'<?php echo base_url('ajax/hello'); ?>', 
       success: function(result) { 
        $('#result1').html(result); 

       } 
      }); 

     }); 

    }); 
</script> 

<script> 
    $(function() { 
     $('#bttHello').click(function(){ 
      var fullname = $('#fullname').val(); 
      $.ajax({ 
       type:'GET', 
       url:'<?php echo base_url('ajax/hello_another/'); ?> + fullname', 
       success: function(result) { 
        $('#result1').html(result); 

       } 
      }); 

     }); 

    }); 
</script> 

Le CodeIgniter est tout à fait capable de répondre à vos besoins, Il suffit de regarder leur AWESOME Document premier ..