J'ai une liste déroulante drpcategory
dans un formulaire. Je vais simplement coller le code déroulant ci-dessous;
<?php if(isset($_POST['drpcategory'])) { echo 'POST Received'; } ?>
Ensuite, je AJAX poste
chaque fois que je fais une sélection dans le menu déroulant drpcategory
ci-dessus comme ci-dessous;
<script> $(function(){ $('#drpcategory').on('change',function() { $.ajax({ method: 'post', data: $(this).serialize(), success: function(result) { console.log(result); } }); }); }); </script>
Cela semble fonctionner actuellement car j'obtiens des résultats comme ci-dessous dans le navigateur Chrome > Inspecter > Onglet Réseau chaque fois que je fais une sélection dans drpcategory
. Voici la capture d'écran;
La question est de savoir comment puis-je capturer ces données AJAX post
utiliser PHP dans la même page et le faire écho
dans la même page? Jusqu'à présent, j'ai essayé;
<div class="form-group"> <label>Category</label> <select class="form-control bg-dark btn-dark text-white" id="drpcategory" name="drpcategory" required> <?php $category = ''.$dir.'/template/post/category.txt'; $category = file($category, FILE_IGNORE_NEW_LINES); foreach($category as $category) { echo "<option value='".$category."'>$category</option>"; } ?> </select> </div>
Je recherche une solution utilisant uniquement PHP, JQuery et AJAX combinés.
Cette question était mis à jour ultérieurement et répondu ici : AJAX POST & PHP POST sur la même page
p>
6 Réponses :
Je vous recommande de lire la documentation de la fonction ajax, j'ai essayé de la répliquer et j'ai dû résoudre ce problème:
$.ajax({ // If you don't set the url // the request will be a GET to the same page url: 'YOU_URL', method: 'POST', // I replaced type by method data: $(this).serialize(), success: function(result) { console.log(result); } });
Je n'ai pas d ' url
car je poste sur la même page. Et j'ai déjà essayé $ (this) .attr ('method')
. Et dans l'onglet réseau, il a juste donné la sortie http://example.com/?page=post
. PHP n'a toujours rien fait écho.
Si vous publiez sur la même page, cela signifie que vous publiez sur l'URL de cette page. Lorsque vous publiez un message HTML standard, votre navigateur le remplit pour vous si vous ne spécifiez pas d'URL
C'est vrai si vous ne mettez pas d'URL, la requête sera la même page, je vous recommande de déclarer l'url pour la tester et vous pouvez voir comment cela fonctionne.
@ roag92 La structure de ma page Web commence à partir de http://example.com/index.php
. Je suis actuellement à http://example.com/index.php?page=post
où les utilisateurs peuvent publier de nouvelles choses. Je ne sais pas trop quelle url
je dois écrire là-dedans, j'ai donc supprimé le champ url
pour que le navigateur le récupère.
si c'est pour le même fichier, vous pouvez définir l'url comme http://example.com/index.php
ou uniquement index.php
. Pour plus d'informations sur les URL relatives, consultez cette stackoverflow.com/ questions / 4765740 /…
@ roag92 Essayé avec url
comme url: 'http://mywebsite.com/index.php'
mais maintenant la sortie dans l'onglet réseau est juste http: //mywebsite.com/index.php
chaque fois que j'apporte un changement sur drpcategory
. PHP n'a donné aucune sortie non plus.
Comme vous pouvez le voir maintenant, vous faites une requête POST mais le problème est d'identifier la bonne URL.
@ roag92 Je doute que ce soit le cas puisque j'ai essayé à la fois http://mywebsite.com/index.php
et http://mywebsite.com/index.php?page=post < / code> comme
url
. De plus, le navigateur récupère la page actuelle pour la publier automatiquement si je ne spécifie pas une url
. Je pense fortement que le problème est ailleurs empêchant PHP d'afficher l'écho. PHP peut-il même afficher un changement dynamique comme celui-ci sans rechargement de page?
Cette question a été mise à jour. Veuillez vous référer si vous le pouvez.
Tout d'abord, cette ligne -> type: $ (this) .attr ('post') doit être type: $ (this) .attr ('method'), . Donc, cela donnera la valeur ** type: post ** et
Pour autant que je sache, vous demandez d'envoyer ajax chaque fois que vous sélectionnez des options de drpcategory . Pourquoi soumettez-vous le formulaire complet pour cela. Si j'étais là où vous, j'aurais dû faire ce problème en suivant la manière suivante
echo $_POST['drpcategory'];
De votre côté php, vous pouvez obtenir vos données comme,
$("#drpcategory").change(function(){ e.preventDefault(); var drpcategory=$(this).val(); $.ajax({ type: 'post', data: drpcategory, success: function(result) { console.log(result); } }); });
Pourquoi il existe une fonction e.preventDefault ();
pour la fonction $ ("# drpcategory"). Change (function ();
? Mais j'ai essayé ce code dans mon $ ('# form'). submit (function (e)
et PHP n'ont rien fait écho.
je l'utilise juste pour empêcher la fonctionnalité par défaut. Vous pouvez omettre si vous le souhaitez. Essayez comme ça, cela fonctionnera.
Déjà omis et essayé comme je l'ai mentionné. Pas de chance sur celui-ci.
Cela devrait fonctionner et cela fonctionne très bien pour moi. Veuillez essayer de changer le nom d'identifiant de drpcategory en quelque chose de différent comme drp. Parfois, ajax garde le cache de tout le nom et une chaîne similaire peut pointer vers le même pointeur dans Chrome. Essayez ceci une fois
Essayé avec différents id
s et encore une fois sans écho. PHP nécessite-t-il un rechargement de page pour capturer le POST et afficher l'écho? Parce que comme je l'ai mentionné dans la question, actuellement, il ne fera écho que si la page est rechargée à l'aide de la méthode d'envoi standard avec rechargement de page. Si tel est le cas, alors je suppose que cette approche AJAX ne fonctionnera pas pour moi.
AJAX est spécifiquement pour permettre aux informations d'être renvoyées au serveur sans nécessiter une actualisation de la page. Mais votre page est appelée et vous devez savoir quoi faire avec la demande de publication. Voir ma réponse ci-dessous ... quand j'ai fini.
Oh, alors vous pouvez envoyer votre demande ajax à une page différente à la place et votre problème sera envoyé. Comment pourrais-je ne pas reconnaître ça ... dites-moi après que vous ayez fini.
Cette question a été mise à jour. Veuillez vous référer si vous le pouvez.
Veuillez essayer ce code:
$.post('URL', $("#FORM_ID").serialize(), function (data) { alert('df); }
Qu'est-ce que df
? Je viens de modifier ceci comme $ .post ('', $ ('# form'). Serialize (), function (data) {alert (data);});
et ça me donne juste un fenêtre d'alerte avec le code source de la page entière dans laquelle je suis actuellement.
Cette question a été mise à jour. Veuillez vous référer si vous le pouvez.
if(isset($_REQUEST['ID']))
Ça va. Je sais que ce n'est pas idéal d'utiliser les mêmes noms de variables. Mais le vrai problème ici est que PHP n'obtient pas le bon AJAX POST?
J'ai essayé votre solution modifiée. Veuillez noter que je poste sur la même page en utilisant AJAX, donc il n'y a pas d ' url
. Mais j'ai essayé cela avec une url
vers la même page et toujours pas d'écho de PHP.
Cette question a été mise à jour. Veuillez vous référer si vous le pouvez.
Il semble que vous essayez de résoudre plusieurs problèmes à la fois. Avant que je puisse passer à la question immédiate, nous devons mettre en place un travail de base afin que vous compreniez ce qui doit se passer.
Premièrement, la confusion concernant l'URL:
Vous acheminez tout via l'index .php. Par conséquent, index.php doit suivre une structure quelque chose comme ceci:
<?php // there can be no output before this tag. if(isset($_POST['drpcategory'])) { // get your items from drpcategory. I will assume: $items = array('val1' => 'option1','val2' => 'option2','val3' => 'option3'); // send this as json. you could send it as html, but this is more flexible. header('Content-Type: application/json'); // convert array to json $out = json_encode($items); // simply print the output and die. die($out); }
Maintenant, confusion à propos de JQuery et AJAX:
Selon https://api.jquery.com/jquery.post/ vous devez fournir une URL. p >
Toutes les propriétés à l'exception de l'url sont facultatives
Votre JQuery AJAX enverra une demande de publication à votre page index.php. Lorsque votre page s'exécute comme indiqué ci-dessus, elle affichera simplement {message: "Votre soumission a été reçue"}
puis mourra. Le JQuery attendra cette réponse et fera tout ce que vous lui direz de faire avec (dans cet exemple, imprimez-le sur la console).
<div class="form-group"> <label>Category</label> <select class="form-control bg-dark btn-dark text-white" id="drpcategory" name="drpcategory" required> <?php $category = ''.$dir.'/template/post/category.txt'; $category = file($category, FILE_IGNORE_NEW_LINES); foreach($category as $category) { echo "<option value='".$category."'>$category</option>"; } ?> </select> </div> <!-- HTML to receive AJAX values --> <div> <label>Item</label> <select class="" id="drpitem" name="drpitem"></select> </div> <script> $(function(){ $('#drpcategory').on('change',function() { $.ajax({ url: '/receive.php', method: 'post', data: $(this).serialize(), success: function(result) { workWithResponse(result); } }); }); }); function workWithResponse(result) { // jquery automatically converts the json into an object. // iterate through results and append to the target element $("#drpitem option").remove(); $.each(result, function(key, value) { $('#drpitem') .append($("<option></option>") .attr("value",key) .text(value)); }); } </script>
receive.php:
<?php // cleanse any incoming post and get variables // if all your POST requests are being routed to this page, you will need to have a hidden variable // that identifies which page is submitting the post. // For this example, assume a variable called calling_page. // As per your naming, I'll assume it to be 'post'. // Always check for submitted post variables and deal with them before doing anything else. if($_POST['calling_page'] == 'post') { // set header type as json if you want to use json as transport (recommended) otherwise, just print_r($_POST); header('Content-Type: application/json'); print json_encode(array('message' => 'Your submission was received')); // if this is from an ajax call, simply die. // If from a regular form submission, do a redirect to /index.php?page=some_page die; } // if you got here, there was no POST submission. show the view, however you're routing it from the GET variable. ?> <html> (snip) <body> <form id="form1" method="post"> <input type="hidden" name="calling_page" value="page" /> ... rest of form ... <button id="submit-button">Submit</button> </form> }
Une fois que tout fonctionne, vous pouvez prendre le code de receive.php
, collez-le en haut de index.php
, et redirigez l'appel ajax vers index.php
. Assurez-vous qu'aucune sortie n'est possible avant cet extrait de code.
D'accord, donc si AJAX est spécifiquement destiné à permettre aux informations d'être renvoyées au serveur sans nécessiter une actualisation de la page, et dans ma question si PHP ne parvient à écho qu'en utilisant la fonction d'envoi standard avec rechargement de page, pourquoi PHP ne peut pas faire écho quand c'est pareil la fonction d'envoi standard est remplacée par AJAX? Est-ce parce que la page n'est pas rechargée pour que PHP affiche les modifications?
Dans la soumission html et la soumission AJAX, les mêmes informations POST sont envoyées. La seule différence est que AJAX le fait dans les coulisses et ne réécrit pas la page. Pour le résoudre, vous devez ouvrir les outils de développement et surveiller l'onglet réseau. Lors de la soumission, vous verrez la demande de fichier. cliquez dessus, et vous pouvez voir ce qui a été soumis et quelle était la réponse.
Si, cependant, la page se recharge, vous savez que vous ne l'avez pas réellement soumis avec ajax. Ensuite, il s'agit de retourner à la documentation pour voir ce que vous avez manqué.
Je viens d'utiliser la soumission par défaut pour vérifier si PHP fait écho ici. J'ai en fait remplacé la soumission par défaut comme mentionné dans la question et c'est toujours comme ça maintenant. Et il est soumis en utilisant AJAX et il n'y a pas de rechargement de page. Je reçois des demandes de fichiers dans l'onglet Réseau sous http://example.com/?page=post
chaque fois que j'apporte une modification à drpcategory
. Je peux donc être sûr que la soumission est envoyée en utilisant AJAX, je ne peux tout simplement pas comprendre pourquoi PHP n'est pas echo
ici alors que la soumission par défaut montrait l ' écho
dans PHP la page.
Où et comment vous attendez-vous à ce qu'il fasse écho? Tel qu'il est écrit, il n'apparaîtra pas sur la page, uniquement dans la console. Pour dépanner, besoin de savoir ce que le serveur répond, trouvé en cliquant sur la demande de fichier.
Il n'y a pas d'endroit spécifique où je lui demande de faire écho. Cela peut être n'importe où dans la page, je fais juste un écho pour voir si PHP le récupère après AJAX post
. Cet écho PHP doit être dans la même page et il doit être visible avec la nouvelle valeur sans rechargement de page. J'ai mis à jour la question avec ce qui se passe maintenant après avoir essayé les solutions suggérées. Veuillez vous référer si vous le pouvez.
Ok je vois qu'un message est lancé, maintenant quelle est la réponse? Je m'attends à ce que vous voyiez une répétition de l'ensemble de la sortie de la page.
Oui, dans l'onglet Réponse, je peux voir le code source de cette page entière.
Juste une pensée, pour se débarrasser des variables confondantes, je suggérerais de publier sur une page temporaire dont la seule sortie est de faire écho aux variables de publication qu'il reçoit. De cette façon, vous pouvez résoudre un problème à la fois.
Création d'un fichier receive.php
dans le répertoire du domaine et ajout de l ' url
dans la fonction AJAX. Le fichier receive.php
avait Php print_r ($ _ POST); ?>
y est codé. Et dans l'onglet Réseau, ce fichier est appelé avec succès et il est affiché sous la forme; Array ([drpcategory] => Véhicules)
comme prévu. Ce dont j'ai besoin, c'est de faire écho uniquement à la valeur Vehicles
dans la même page sans appeler un fichier externe comme celui-ci.
Excellent. Pour le moment, travaillez avec le fichier externe pendant que vous déterminez le fonctionnement de l'ensemble du processus. Que vouliez-vous faire avec drpcategory côté serveur? Que souhaitez-vous envoyer au navigateur pour l'afficher?
J'essaie d'obtenir la valeur de drpcategory
et de l'utiliser pour remplir le 2ème menu déroulant appelé drpitem
qui n'est pas mentionné ici, le code d'élément html de drpitem
est identique à drpcategory
avec une boucle PHP pour lire un fichier, sauf que son chemin de fichier est changé en fonction de la valeur envoyée par drpcategory
.
Je t'ai eu. Je voulais juste être sûr que Ajax était vraiment ce dont vous avez besoin. Ce dont vous avez besoin maintenant, c'est de savoir comment prendre les données Ajax et les ajouter à la page existante. Toujours en utilisant la page temp php, je suggérerais d'imprimer ce que vous voulez insérer / remplacer. Toujours dans votre question, ajoutez la partie du code HTML qui recevra les modifications. Une fois que tout cela fonctionne, vous pouvez déplacer la réponse php vers l'index, mais laissez-la séparée pour le moment pour plus de clarté.
continuons cette discussion dans le chat .
Résolu après plusieurs mises à jour de la question: stackoverflow.com/questions/54968749/...
Je pense que vous avez une erreur de syntaxe eroror dans la requête ajax jQuery car ajax post ' http: // example.com/?page=post&drpcategory=Vehicles 'ne renvoie pas ce type d'url dans l'onglet Réseau du navigateur.
console.log(result);
Voici un exemple de requête ajax
$ ("# drpcategory"). change (function () {
e.preventDefault ();
var drpcategory = $ (this) .val ();
$ .ajax ({
type: 'post',
données: drpcategory ,
succès: fonction (résultat) {
<?php var_dump($_POST); exit; ?> please do this statment in your php function if anything posted to php page it will dump.
}
});
}) ;
`
Des mises à jour mineures ont été apportées à la question comme suggéré par les réponses ici. Et toujours pas de chance. Dans l'onglet Réseau du navigateur, je reçois des requêtes http://example.com/?page=post
et votre PHP a vidé array (0) {}
en tant que production.
parfois jquery montre ce type fou pense ... est-ce qu'on pense ouvrir une nouvelle balise de script créer une fonction js, utiliser la méthode onchnage = "" en html puis écrire ajax dans la fonction js
Je voudrais continuer à utiliser jQuery car le JS standard est difficile à comprendre. Même si j'essayais, je finirais probablement avec ce problème à nouveau. Je doute que jQuery soit le problème ici, il me manque quelque chose.
ya JQuery est le problème! use std.JS. rien n'est dur html:
J'ai utilisé votre code et obtenu la même activité dans l'onglet Réseau qu'avant, et toujours pas de vidage PHP affiché. En gros, c'est toujours la même chose.
vérifiez l'onglet de la console pour vous assurer qu'aucune erreur de syntaxe, puis l'alerte de première ligne de la fonction de code ("ok"); pour vérifier si votre flux de code est dans le bon sens
Dans l'onglet de la console, tout est blanc, pas une seule erreur rouge affichée. Je peux également confirmer qu'il n'y a pas d'erreurs de syntaxe car j'écris le code très soigneusement. Et oui, le code passe par AJAX et l'alerte "ok" est affichée dans le navigateur lorsqu'il est placé dans AJAX success.
ajx le succès alerte ??? ok très bien, donc votre requête passe par la même page s'il vous plaît donner url: path en ajax puis, assurez-vous que php a if ($ _ POST) et else part.C'est parce que la requête ajax réussit renvoie le résultat de la page entière. Veuillez consulter le réseau -> auditeurs -> Données du formulaire, il affichera les données de votre formulaire de publication
Le navigateur détecte déjà l ' url
pour la même page. J'ai également essayé de donner une url
AJAX avant mais pas de chance. J'ai essayé la condition if ($ _ POST)
en PHP pour un écho, mais rien ne s'est répercuté dans la page. Voici la capture d'écran de Réseau> En-têtes pendant l'appel AJAX: i.imgur.com/7rdu1oj.jpg
Cette question a été mise à jour. Veuillez vous référer si vous le pouvez.
Non, je n'ai pas pu y arriver.
quel était le "/? page = post" dans votre URL? s'il vous plaît var_dump ($ _ POST, $ _ GET);
C'est la nouvelle question avec le problème que j'ai, en attendant une réponse directe; stackoverflow.com/questions/54968749 /…
Vous utilisez
et non
. Vos données doivent être dans
$ (this) .attr ('post')
, je suppose que cela devrait probablement être$ (this) .attr ('method')
car c'est comme$ _POST
si vous lesPOST
(vérifiez-le également en utilisant l'onglet réseau!)@ccKep: Le formulaire est déjà
et j'ai changé la partie AJAX en
$ (this) .attr ('method')
et maintenant c'est simplementhttp://example.com/?page=post
dans l'onglet réseau. PHP n'a toujours rien fait écho.Pourriez-vous s'il vous plaît surveiller l'onglet réseau sur l'appel ajax.
@Parvej Alam: Déjà fait. Toutes les sorties de l'onglet réseau dans différentes situations sont publiées dans mes questions et réponses, commentaires ci-dessous.
Cette question a été mise à jour. Veuillez vous référer si vous le pouvez.