web-dev-qa-db-ja.com

同じファイル内のHTMLフォームからPHP関数を呼び出しますか?

ユーザーがテキストを入力して送信ボタンを押した後、同じページで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 code [test() function]は同じファイル内でまた:

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

ただし、まだ問題が発生します!誰にもアイデアがありますか?

13
iTurki

これはあなたが話しているようなやり方ではできません。 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エコーはすべて、result変数はtest.phpに戻り、(この場合)警告ボックスに表示されます。

getResult.php

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

[〜#〜] note [〜#〜]この例では、サードパーティのJavascriptラッパーであるjQueryを使用しています。物事をさらに複雑にする前に、まずこれらのWebテクノロジーがどのように連携するかをよりよく理解することをお勧めします。

26
Dutchie432

あなたはウェブがどのように機能するかについて大きな誤解を持っています。

基本的に、物事はこのように起こります:

  • ユーザー(ブラウザ)はサーバーから_test.php_をリクエストします
  • サーバーで_test.php_が実行され、内部のすべてが実行され、結果のHTMLページ(フォームを含む)がブラウザーに送り返されます
  • ブラウザにフォームが表示され、ユーザーはそれを操作できます。
  • ユーザーはフォームを(この場合は同じファイルであるactionで定義されたURLに)送信するため、すべてが最初から始まります(フォーム内のデータも送信されます)。サーバーへの新しいリクエスト、PHP実行など。これは、ページが更新されることを意味します。

onclick属性からtest()を呼び出そうとしました。この手法は、client-sideスクリプトを実行するために使用されます。ほとんどの場合、これはJavascript(コードはユーザーのブラウザで実行されます)。これは[〜#〜] php [〜#〜]とは何の関係もありません。これはserver-side 、サーバー上に存在し、リクエストが入った場合にのみ実行されます。たとえば、 クライアント側とサーバー側のコーディング をお読みください。

ページを更新せずに何かをしたい場合は、JavaScriptを使用してバックグラウンドでサーバーにリクエストを送信する必要があります。PHP必要なことを行い、答えを受け取るこの手法は基本的に[〜#〜] ajax [〜#〜]と呼ばれ、Googleを使用して多くの優れたリソースを見つけることができます( Mozillaのすばらしいチュートリアル など)。

9
kapa

リロードせずに、htmlおよび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>
6
jenkin90

これは、説明していることを実行するための完全なphpスクリプトです。サーバー側とクライアント側で読む必要があります。 PHPはクライアント側で実行できないため、javascriptを使用してサーバーと対話するか、ページを更新する必要があります。理解できない場合は、私のコード(または他の人のコード)をあなたの利益のために使用できるようになります。

次のコードは、AJAX jQueryなしの呼び出しを実行し、同じスクリプトを呼び出してXMLをAJAXにストリーミングします。次に、ユーザー名と<br/>ボックスの下のdiv内。

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
adorablepuppy

[〜#〜] sajax [〜#〜] を使用するか、JavaScriptに切り替えます

Sajaxは、XMLHTTPRequestまたはリモートスクリプトとしても知られているAjaxフレームワークを使用して、Webサイトをできるだけ簡単にプログラミングするためのオープンソースツールです。 Sajaxを使用すると、ブラウザの更新を実行せずに、JavaScriptを使用してWebページからPHP、PerlまたはPython関数を簡単に呼び出すことができます。

5
Carlos Precioso

あなたがAjaxを使用したくなく、あなたのページをリロードしたい場合に。

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

これでPHPが機能します。test()は、送信ボタンがクリックされたときではなく、ページがロードされたときに実行されます。

この種のことを行うには、onclick属性にAJAX PHPファイルの呼び出し)を実行させる必要があります。

3
ceejayoz

この例を見てください:

<!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

ページを更新せずにフォームを送信することはできますが、私の知る限り、サーバー上のJavaScript/AJAX呼び出しを使用せずにPHPスクリプトを使用することはできません。次の例では jQuery JavaScript Library

[〜#〜] 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 File(separateファイルにある必要があります) 、btw)。上記のdataは、PHPファイル(基本的にはフォームフィールドの現在のすべての値))に送信するURLエンコードされたクエリ文字列である必要があります。これらは、サーバー側に表示されますPHP $_GETスーパーグローバル。以下に例を示します。

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

それがデータ文字列の場合、PHPスクリプトはこれを次のように表示します。

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

ただし、次のように、フォームに存在するフォームフィールドからデータを作成する必要があります。

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

(各フォームフィールドに「id」をタグ付けする必要があります。上記のidは「user」です。)

PHPスクリプトの実行後、success関数が呼び出され、PHPスクリプトによって生成されたすべての出力が保存されます。変数html

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

これは、フォームにロードせずに送信を作成するために使用するより良い方法です。

いくつかのCSSを使用して、iframeを希望どおりにスタイル設定できます。

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>
1
John Mattan