2

注意 - 最初は間違ったタイトルで申し訳ありません - それは私が投稿せずに解決しようとしている別の質問でした.

PHP ファイル呼び出しからデータを返すことについて、2 つの簡単な質問をしたいと思います。このフォーラムのおかげで、HMTL 内で PHP コードを記述して、データを db テーブルに保存したり、テーブルからデータを取得したりすることに自信が持てるようになりました。

しかし今では、1 つのページで、HTML 画面を更新することなく、テーブルにデータを追加し、テーブルからデータを取得し、そのデータを更新する必要があります。そこで、 MySQL テーブル(6 フィールド)、純粋な php で記述された「バックエンド」、およびHTML と JavaScript で記述された「フロントエンド」を備えた小さな「テスト」環境を作成しました。

昨日一日中、私は自分が残したわずかな髪の毛を引き抜いていましたが、最終的に php ファイルから html/javascript ファイルにデータを戻すという概念を理解しました (以下にすべてのコードを示します)。すべてがうまく機能します!しかし、一貫性がないため、次の手順で実験を行いました。

  • フロントエンドのftpアップロード
  • バックエンドの ftp アップロード
  • IE でフロントエンドを 2 回更新する
  • 入力ボックスに数字「150」を入力します。(「150」は
    ジミ・ヘンドリックスの行番号です :-) )
  • フォームの「送信」ボタンをクリックします。(この実験では、「Enter」キーは使用しませんでした)
  • うまくいけば、Jimi Hendrix が書かれた警告が表示されます。
  • うまくいかない場合、何も表示されません。

これが2つの実験の結果です Y=ジミ・ヘンドリックス N=ポップアップボックスなし

  • リフレッシュ
  • YNYNNYYNYYYNYYYNYYYNNY NYNY
  • リフレッシュ
  • YYYNYYYNYYYYYNYNYYNYNYN NYYN

ここでは、ルーチンがいつ「機能する」かについてのパターンを本当に見ることができません。この動作は、データベースへの保存に関する他のコードの一部であることがわかりました。

今私の2つの質問:

  • このコードがどのように機能するかについて説明できますか? 私はそれを修正する方法はありますか?
  • ジミ・ヘンドリックスを「アラート」ボックスに入れましたが、彼を div に入れるにはどのコマンドを使用しますか? ?。ロード?または他のコマンド?

PHPファイルは次のとおりです。

<?php
$localid = $_POST['localid'];

$host = "hostname";
$user = "username";
$password = "password";
$dbname = "dbname";

$cxn = mysqli_connect($host,$user,$password,$dbname);
if (mysqli_connect_errno()) {echo "No connection" . mysqli_connect_error();}

$query = " select * from testtable where localid = $localid ";
$result = mysqli_query($cxn, $query) or die ("could not query database 1");

while ($row = mysqli_fetch_array($result))
{
 $firstname = $row['firstname'];
 $lastname = $row['lastname'];
 $zip = $row['physzip'];
 $gender = $row['gender'];
 $dob = $row['dob'];
}

$variablestopass = array
(
    'ln' => $lastname,
    'fn' => $firstname,
    'zip' => $zip,
    'gender' => $gender,
    'dob' => $dob 
);
echo json_encode($variablestopass);                     
?>

そして、これが「フロントエンド」です(ヘッダーなし):

<body>
<form name="#inputform">
<table class="divtest">
<tr><td>Localid:</td><td> <input type="text" id="localid"></td></tr>
<tr><td colspan="2" align="center"><input type="submit" id="submitbutton" value="Submit" /></td></tr>
</table>
</form>

<div id="loadmehere" class="divtest"></div>

<script type="text/javascript">
$(document).ready(function(e) {

$("#submitbutton").click(function() {

var localid = document.getElementById("localid").value;

$.ajax({
        type: "POST",
        url: "testajaxbackend.php",
        data: {localid: localid},
        dataType : 'json',
        success: function(result) {
                                   alert(result['fn'] + result['ln'] + result['zip'] + result['gender'] + result['dob']);
                                   },
        error : function() { alert("error"); }
});//End of ajax call
});//End of click
});//End of ready
</script>

</body>
</html>

あなたがレンダリングするかもしれないどんな助けにも前もって感謝します。PS - 他の初心者が私の力ずくのコードによって助けられる可能性がある場合に備えて、これも提示します。

4

1 に答える 1

1

Ajax を使用する場合は、フォームの送信を脇に置いておく必要があります。両方を使用することはできません。混乱します。送信ボタンをクリックすると、 がリロードされ、ajax コンテキストが失われます。

ボタンを次のように変更します。

<input type="button" id="submitbutton" value="Submit" />

form必要に応じて、タグを削除できます。

セキュリティのために、PHP を次のように変更します。

<?php
$localid = $_POST['localid'];

if (!is_numeric($localid)) { echo "Error!"; exit; }// Prevention of SQL injection

$host = "hostname";
$user = "username";
$password = "password";
$dbname = "dbname";

$cxn = mysqli_connect($host,$user,$password,$dbname);
if (mysqli_connect_errno()) {echo "No connection" . mysqli_connect_error(); exit;}

$localid = mysqli_real_escape_string($localid, $cxn); // Double prevention of SQL injection

$query = "SELECT * FROM testtable WHERE localid = $localid LIMIT 0, 1";
$result = mysqli_query($cxn, $query) or die ("could not query database 1");

if (mysqli_num_rows($result) > 0)
{
    $row = mysqli_fetch_array($result);

    $variablestopass = array
    (
        'ln' => $row['lastname'],
        'fn' => $row['firstname'],
        'zip' => $row['physzip'],
        'gender' => $row['gender'],
        'dob' => $row['dob']
    );

    echo json_encode($variablestopass);
}
else 
{
    echo "Erro selection id"; 
}
?>

ご覧のとおり、SQL インジェクションの防止と .NET による結果チェックを追加しましたmysqli_num_rows。私の理解が正しければ、このコードは 1 つの結果しか返さないかもしれません。whileそのため、ブロックを削除し、LIMITクエリに句を追加しました。したがって、フロントエンドは確実に 1 つの結果しか受け取りません。私が間違っていた場合は、LIMIT句を削除しwhileて を元に戻すことができますが、この方法である必要があります。これは、方法が複数のレコードを返すことができないためです。

$variablestopass = array();
while ($row = mysqli_fetch_array($result))
{
    $variablestopass[] = array
    (
        'ln' => $row['lastname'],
        'fn' => $row['firstname'],
        'zip' => $row['physzip'],
        'gender' => $row['gender'],
        'dob' => $row['dob']
    );
}

success最後に、 on ajax オブジェクトを次のように少し変更します。

sucess: function(result)
{
    var result = jQuery.parseJSON(result);

    alert(result.fn + " - " + result.ln + " - " + result.zip); // and so on...
}

注: このsuccess関数は 1 つの結果のみを調べます。

ご不明な点がございましたら、お知らせください。幸運を!

于 2013-06-09T17:03:13.690 に答える