web-dev-qa-db-fra.com

Appeler une fonction PHP à partir d'un formulaire HTML dans le même fichier?

J'essaie d'exécuter une fonction PHP dans la même page après que l'utilisateur a entré un texte et appuyé sur un bouton de soumission.

Le premier auquel je pense est d'utiliser des formulaires. Lorsque l'utilisateur soumet un formulaire, une fonction PHP sera exécutée dans la même page. L'utilisateur ne sera pas dirigé vers une autre page. Le traitement sera fait et affiché dans la même page (sans rechargement)

Voici ce que j'arrive à:

Dans test.php fichier:

    <form action="test.php" method="post">
            <input type="text" name="user" placeholder="enter a text" />
            <input type="submit" value="submit" onclick="test()" />
    </form>

Le PHP [test() fonction] est dans le même fichier aussi:

    <?php
    function test() {
    echo $_POST["user"]; //just an example of processing
    }    
    ?>

Cependant, j'ai toujours un problème! Quelqu'un a une idée?

13
iTurki

Cela ne peut pas se faire de la façon dont vous parlez. PHP est côté serveur tandis que le formulaire existe du côté client. Vous devrez examiner l'utilisation de Javascript et/ou AJAX si vous ne le faites pas) souhaitez actualiser la page.

test.php

<form action="javascript:void(0);" method="post">
    <input type="text" name="user" placeholder="enter a text" />
    <input type="submit" value="submit" />
</form>

<script type="text/javascript">
    $("form").submit(function(){
        var str = $(this).serialize();
        $.ajax('getResult.php', str, function(result){
            alert(result); // the result variable will contain any text echoed by getResult.php
        }
        return(false);
    });
</script>

Il appellera getResult.php et lui passer le formulaire sérialisé pour que le PHP puisse lire ces valeurs. Tout getResult.php les échos seront renvoyés à la fonction JS dans la variable result de retour sur test.php et (dans ce cas) affichés dans une boîte d'alerte.

getResult.php

<?php
    echo "The name you typed is: " . $_REQUEST['user'];
?>

NOTE Cet exemple utilise jQuery, un wrapper Javascript tiers. Je vous suggère d'abord de mieux comprendre comment ces technologies Web fonctionnent ensemble avant de vous compliquer davantage les choses.

26
Dutchie432

Vous avez un gros malentendu sur le fonctionnement du Web.

Fondamentalement, les choses se passent de cette façon:

  • L'utilisateur (enfin, le navigateur) demande test.php À votre serveur
  • Sur le serveur, test.php S'exécute, tout ce qui se trouve à l'intérieur est exécuté et une page HTML résultante (qui inclut votre formulaire) sera renvoyée au navigateur
  • Le navigateur affiche le formulaire, l'utilisateur peut interagir avec lui.
  • L'utilisateur soumet le formulaire (à l'URL définie dans action, qui est le même fichier dans ce cas), donc tout recommence depuis le début (sauf que les données du formulaire seront également envoyées). Nouvelle requête au serveur, PHP s'exécute, etc. Cela signifie que la page sera rafraîchie.

Vous essayez d'appeler test() à partir de votre attribut onclick. Cette technique est utilisée pour exécuter un script côté client , qui est dans la plupart des cas Javascript (le code s'exécutera sur le navigateur de l'utilisateur). Cela n'a rien à voir avec [~ # ~] php [~ # ~] , qui est côté serveur , réside sur votre serveur et ne fonctionnera que si une demande arrive. Veuillez lire Codage côté client versus codage côté serveur par exemple.

Si vous voulez faire quelque chose sans provoquer une actualisation de page, vous devez utiliser Javascript pour envoyer une requête en arrière-plan au serveur, laisser PHP faire ce qu'il doit faire et recevoir une réponse Cette technique est essentiellement appelée [~ # ~] ajax [~ # ~] , et vous pouvez trouver de nombreuses ressources sur elle en utilisant Google (comme l'incroyable tutoriel de Mozilla ).

9
kapa

Sans rechargement, en utilisant uniquement html y php, ce n'est pas possible mais cela peut être très similaire à ce que vous voulez, mais vous devez recharger:

<?php
function test() {
  echo $_POST["user"]; 
}    

if (isset($_POST[])){ //If it is the first time, it does nothing   
  test();
}
?>

<form action="test.php" method="post">
            <input type="text" name="user" placeholder="enter a text" />
            <input type="submit" value="submit" onclick="test()" />
</form>
6
jenkin90

Voici un script php complet pour faire ce que vous décrivez, bien qu'inutile. Vous devez lire sur le côté serveur vs côté client. PHP ne peut pas s'exécuter côté client, vous devez utiliser javascript pour interagir avec le serveur, ou mettre à jour une page actualisée. Si vous ne comprenez pas cela, il n'y a pas vous pourrez ainsi utiliser mon code (ou celui de quelqu'un d'autre) à votre avantage.

Le code suivant effectue AJAX appel sans jQuery, et appelle le même script pour diffuser XML vers AJAX. Il insère ensuite votre nom d'utilisateur et un <br/> dans une div en dessous de la boîte utilisateur.

Veuillez revenir à l'apprentissage des bases avant d'essayer de poursuivre quelque chose d'aussi avancé que AJAX. Vous finirez par vous confondre et potentiellement gaspiller l'argent des autres.

<?php
    function test() {
        header("Content-Type: text/xml");
        echo "<?xml version=\"1.0\" standalone=\"yes\"?><user>".$_GET["user"]."</user>"; //output an xml document.
    }
    if(isset($_GET["user"])){
        test();
    } else {
?><html>
    <head>
        <title>Test</title>
        <script type="text/javascript">
            function do_ajax() {
                if(window.XMLHttpRequest){
                    xmlhttp=new XMLHttpRequest();
                } else {
                    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
                }
                xmlhttp.onreadystatechange = function(){
                    if (xmlhttp.readyState==4 && xmlhttp.status==200)
                    {
                        var xmlDoc = xmlhttp.responseXML;
                        data=xmlDoc.getElementsByTagName("user")[0].childNodes[0].nodeValue;
                        mydiv = document.getElementById("Test");
                        mydiv.appendChild(document.createTextNode(data));
                        mydiv.appendChild(document.createElement("br"));
                    }
                }
                xmlhttp.open("GET","<?php echo $_SERVER["PHP_SELF"]; ?>?user="+document.getElementById('username').value,true);
                xmlhttp.send();
            }
        </script>
    </head>
    <body>
        <form action="test.php" method="post">
            <input type="text" name="user" placeholder="enter a text" id="username"/>
            <input type="button" value="submit" onclick="do_ajax()" />
        </form>
        <div id="Test"></div>
    </body>
</html><?php } ?>
6
adorablepuppy

Utilisez SAJAX ou passez en JavaScript

Sajax est un outil open source pour rendre la programmation de sites Web utilisant le framework Ajax - également connu sous le nom de XMLHTTPRequest ou de script à distance - aussi simple que possible. Sajax facilite l'appel de fonctions PHP, Perl ou Python à partir de vos pages Web via JavaScript sans effectuer d'actualisation du navigateur.

5
Carlos Precioso

au cas où vous ne voudriez pas utiliser Ajax et que votre page se rechargerait.

<?php
if(isset($_POST['user']) {
echo $_POST["user"]; //just an example of processing
}    
?>
3
Genjuro

C'est maintenant ainsi que fonctionne PHP. test() s'exécutera lorsque la page sera chargée, et non lorsque vous cliquerez sur le bouton Soumettre.

Pour faire ce genre de chose, vous devez avoir l'attribut onclick faire un appel AJAX à un fichier PHP.

3
ceejayoz

Jetez un œil à cet exemple:

<!DOCTYPE HTML> 
<html>
<head>
</head>
<body> 

<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
   $name = test_input($_POST["name"]);
   $email = test_input($_POST["email"]);
   $website = test_input($_POST["website"]);
   $comment = test_input($_POST["comment"]);
   $gender = test_input($_POST["gender"]);
}

function test_input($data) {
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}
?>

<h2>PHP Form Validation Example</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 
   Name: <input type="text" name="name">
   <br><br>
   E-mail: <input type="text" name="email">
   <br><br>
   Website: <input type="text" name="website">
   <br><br>
   Comment: <textarea name="comment" rows="5" cols="40"></textarea>
   <br><br>
   Gender:
   <input type="radio" name="gender" value="female">Female
   <input type="radio" name="gender" value="male">Male
   <br><br>
   <input type="submit" name="submit" value="Submit"> 
</form>

<?php
echo "<h2>Your Input:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>

</body>
</html>
2
user3599285

Vous pouvez soumettre le formulaire sans rafraîchir la page, mais à ma connaissance, il est impossible sans utiliser un appel JavaScript/AJAX à un script PHP sur votre serveur. L'exemple suivant utilise le jQuery JavaScript Library .

[~ # ~] html [~ # ~]

<form method = 'post' action = '' id = 'theForm'>
...
</form>

Script Java

$(function() {
    $("#theForm").submit(function() {
        var data = "a=5&b=6&c=7";
        $.ajax({
            url: "path/to/php/file.php",
            data: data, 
            success: function(html) {
                .. anything you want to do upon success here ..
                alert(html); // alert the output from the PHP Script
            }
        });
        return false;
    });
});

Lors de la soumission, la fonction Javascript anonyme sera appelée, qui envoie simplement une demande à votre fichier PHP (qui devra être dans un fichier séparé, btw) . Le data ci-dessus doit être une chaîne de requête encodée par URL que vous souhaitez envoyer au fichier PHP (essentiellement toutes les valeurs actuelles des champs du formulaire). votre côté serveur PHP Script dans le $_GET super global. Un exemple est ci-dessous.

var data = "a=5&b=6&c=7";

Si c'est votre chaîne de données, alors le script PHP verra ceci comme:

echo($_GET['a']); // 5
echo($_GET['b']); // 6
echo($_GET['c']); // 7

Vous devrez cependant construire les données à partir des champs du formulaire telles qu'elles existent pour votre formulaire, telles que:

var data = "user=" + $("#user").val();

(Vous devrez étiqueter chaque champ de formulaire avec un 'id', l'id ci-dessus est 'user'.)

Après l'exécution du script PHP PHP, la fonction success est appelée et toutes les sorties produites par le script PHP seront stockées dans le variable html.

...
success: function(html) {
    alert(html);
}
...
2
Jeff Lambert

C'est le meilleur moyen que j'utilise pour créer une soumission sans chargement dans un formulaire.

Vous pouvez utiliser du CSS pour styliser l'iframe comme vous le souhaitez.

Un résultat php sera chargé dans l'iframe.

<form method="post" action="test.php" target="view">
  <input type="text" name="anyname" palceholder="Enter your name"/>
  <input type="submit" name="submit" value="submit"/>
  </form>
<iframe name="view" frameborder="0" style="width:100%">
  </iframe>
1
John Mattan