Вызов функции PHP из формы HTML в том же файле? - PullRequest
13 голосов
/ 11 мая 2011

Я пытаюсь выполнить функцию PHP на той же странице после того, как пользователь вводит текст и нажимает кнопку отправки.

Первое, о чем я думаю, - это использование форм.Когда пользователь отправляет форму, функция PHP будет выполняться на той же странице.Пользователь не будет перенаправлен на другую страницу.Обработка будет выполнена и отображена на той же странице (без перезагрузки)

Вот что я получаю:

В test.php файл:

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

PHP-код [test() function ] - в том же файле также:

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

Однако,У меня все еще проблемы!У кого-нибудь есть идея?

Ответы [ 10 ]

26 голосов
/ 11 мая 2011

Это нельзя сделать так, как вы говорите. PHP на стороне сервера, а форма существует на стороне клиента. Вам нужно будет изучить использование Javascript и / или AJAX, если вы не хотите обновлять страницу.

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>

Он вызовет getResult.php и передаст ему сериализованную форму, чтобы PHP мог прочитать эти значения. Все, что getResult.php echos будет возвращено в функцию JS в переменной result обратно на test.php и (в этом случае) будет показано в окне предупреждения.

getResult.php

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

ПРИМЕЧАНИЕ В этом примере используется jQuery, сторонний Javascript Wrapper. Я предлагаю вам сначала лучше понять, как эти веб-технологии работают вместе, прежде чем усложнять себе задачу.

9 голосов
/ 11 мая 2011

У вас большое недопонимание того, как работает веб.

В основном, все происходит так:

  • Пользователь (ну, браузер) запрашивает test.php с вашего сервера
  • На сервере запускается test.php, все внутри выполняется, и полученная HTML-страница (включая вашу форму) будет отправлена ​​обратно в браузер
  • Браузер отображает форму,пользователь может взаимодействовать с ним.
  • Пользователь отправляет форму (по URL-адресу, определенному в action, который в данном случае является тем же файлом), поэтому все начинается с начала (за исключением данных в форметакже будет отправлено).Новый запрос к серверу, запуск PHP и т. Д. Это означает, что страница будет обновлена.

Вы пытались вызвать test() из своего атрибута onclick.Этот метод используется для запуска клиентского сценария , который в большинстве случаев является Javascript (код будет выполняться в браузере пользователя).Это не имеет ничего общего с PHP , который на стороне сервера , находится на вашем сервере и будет работать только при поступлении запроса. Пожалуйста, прочитайте Версия на стороне клиента и серверакодирование на стороне , например.

Если вы хотите сделать что-то без обновления страницы, вам нужно использовать Javascript для отправки запроса в фоновом режиме на сервер, позвольте PHP делать то, что ему нужноделай и получай от него ответ.Этот метод в основном называется AJAX , и вы можете найти много полезных ресурсов по нему с помощью Google (например, удивительное руководство Mozilla ).

6 голосов
/ 11 мая 2011

Вот полный скрипт php, чтобы делать то, что вы описываете, хотя и бессмысленно.Вы должны читать на стороне сервера против стороны клиента.PHP не может работать на стороне клиента, вы должны использовать javascript для взаимодействия с сервером или смириться с обновлением страницы.Если вы не можете этого понять, вы никоим образом не сможете использовать мой код (или чей-либо другой) в свою пользу.

Следующий код выполняет вызов AJAX без jQuery и вызывает тот же сценарийдля потоковой передачи XML в AJAX.Затем он вставляет ваше имя пользователя и <br/> в поле ниже поля пользователя.

Пожалуйста, вернитесь к изучению основ, прежде чем пытаться заняться чем-то более продвинутым, чем AJAX.Вы будете только путать себя в конце концов и потенциально тратить деньги других людей.

<?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 голосов
/ 11 мая 2011

Без перезагрузки, используя только html y php, это невозможно, но это может быть очень похоже на то, что вы хотите, но вы должны перезагрузить:

<?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>
5 голосов
/ 11 мая 2011

Используйте SAJAX или переключитесь на JavaScript

Sajax - это инструмент с открытым исходным кодом, позволяющий программировать веб-сайты с использованием инфраструктуры Ajax - также называемой XMLHTTPRequest или удаленными сценариями - так же просто, каквозможный.Sajax упрощает вызов функций PHP, Perl или Python с веб-страниц через JavaScript без обновления браузера.

3 голосов
/ 06 октября 2011

на тот случай, если вы не хотите использовать Ajax и хотите, чтобы ваша страница перезагрузилась.

<?php
if(isset($_POST['user']) {
echo $_POST["user"]; //just an example of processing
}    
?>
3 голосов
/ 11 мая 2011

Вот так работает PHP.test() будет выполняться при загрузке страницы, а не при нажатии кнопки отправки.

Чтобы делать подобные вещи, необходимо, чтобы атрибут onclick выполнял вызов AJAX для файла PHP.

2 голосов
/ 25 июля 2015

Взгляните на этот пример:

<!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 голосов
/ 11 мая 2011

Вы можете отправить форму без обновления страницы, но, насколько мне известно, это невозможно без использования JavaScript / AJAX-вызова PHP-скрипта на вашем сервере. В следующем примере используется библиотека JavaScript jQuery .

HTML

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

Java Script

$(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;
    });
});

После отправки будет вызвана анонимная функция Javascript, которая просто отправляет запрос в ваш PHP-файл (который должен быть в отдельном файле, кстати). data выше должно быть строкой запроса в кодированном URL-адресе, которую вы хотите отправить в файл PHP (в основном все текущие значения полей формы). Они появятся на вашем серверном PHP-скрипте в суперглобальном $_GET. Пример ниже.

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

Если это ваша строка данных, тогда PHP Script будет выглядеть так:

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

Однако вам нужно будет построить данные из полей формы, как они существуют для вашей формы, например:

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

(Вам нужно будет пометить каждое поле формы идентификатором, вышеуказанный идентификатор - «пользователь».)

После запуска сценария PHP вызывается функция success, и все выходные данные, созданные сценарием PHP, сохраняются в переменной html.

...
success: function(html) {
    alert(html);
}
...
1 голос
/ 11 сентября 2016

Это лучший способ, который я использую для создания отправки без загрузки в форму.

Вы можете использовать CSS для стилизации фрейма так, как вы хотите.

Результат php будетбыть загруженным в 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...