2017-09-18 4 views
0

私の問題は、update.phpは投稿されたフォームデータ(post_edit)のみを取得することです。私はテーブルの身体上のマウスの位置をトレースコールバック関数を持っているAJAX呼び出しをPHPファイルに同期させて、フォームを介して同じファイルにデータをポストする方法はありますか?

:変数は、私が何をしようとしている

Notice: Undefined index: id_to_edit in ...\update.php on line 5 

Notice: Undefined index: column_to_edit in ...\update.php on line 6 

を経由しませんAJAXを通じて以前掲載しました。これは、ユーザーが編集したいセルの列とIDを検出するために行われます。id整数と列文字列は、AJAXを介してPHPファイルにポストされ、SQLクエリーで使用されます。ユーザーが更新したいデータ(フォームを介してポストされます、詳細は後で説明します)。

編集は次のように行います。ユーザーがマウスの上にマウスを置いたときにフォームが作成され、そのフォームに記入すると、データをポストしてSQLテーブルの対応するエントリを更新する必要がありますコールバック関数)。マウスを外してフォームを削除します。すべてのこれらの値は、SQLクエリで使用することができるように私はPHPファイルへの座標とフォームデータを投稿するにはどうすればよいビットに

を言い換えする

?私がやっていることが根本的に壊れているなら、別の方法がありますか?

$(function(){ 

    $("td") 
    .hoverIntent(
     function(e){    
     var id_of_edit = $(e.target).siblings('th').text(); 
     var $clicked_column_i = $(e.target).index() + 1; 
     var column_of_edit = $("#tableheader").children("th:nth-child(" + $clicked_column_i + ")").text(); 

     $.ajax({ 
      type: 'POST', 
      dataType: 'text', 
      url: 'update.php', 
      data: { 
       'id_of_edit': id_of_edit, 
       'column_of_edit': column_of_edit 
       }, 

     }); 

     var $edit_button = $('<form action="update.php" method="post"><input type="text" name="post_edit"/></form>'); 

     $(e.target).append($edit_button); 

     console.log(e.target.innerText + " was clicked"); 
     console.log(id_of_edit + " is the ID"); 
     console.log(column_of_edit + " is the column name");  
     //just to check the tracer function is working correctly 
     }, 

     function(e){    
     $id_of_edit = $(e.target).siblings('th').text(); 
     $clicked_column_i = $(e.target).index() + 1; 
     $column_of_edit = $("#tableheader").children("th:nth-child(" + $clicked_column_i + ")").text(); 

     $(e.target).children('form').remove(); 
     }); 

}); 

update.phpを:

<?php 

include 'config.php'; 

echo $_POST['id_to_edit']; 
echo $_POST['column_to_edit']; 
echo $_POST['post_edit']; 


$stmt = $pdo->prepare('UPDATE food SET :column = :edit WHERE id = :id'); 
$stmt->execute([ 
    'id' => $_POST['id_to_edit'], 
    'column' => $_POST['column_to_edit'], 
    'edit' => $_POST['post_edit'] 
]); 

?> 
+0

また、タイプミスもあります。id _ ** of _ _ edit vs id _ ** to ** _edit(他の変数ペアと同じタイプミス) – Shadow

答えて

0

AJAXリクエストと標準ポストバックを介してフォーム送信は、二つの別個 HTTPリクエストです。あなたの "update.php"スクリプトは、を2回、を実行します。リクエストごとに1回ずつ送信されます。リクエストごとに送信された内容に応じて、リクエストごとに別々のPOST変数が設定されます。これらの変数は、要求と要求の間には存続しません。同じエンドポイント・スクリプトに送信しただけで問題はありません。

要約すると、HTTPリクエストはステートレスです。これらは孤立して存在し、任意のリクエストは以前のリクエストまたは将来のリクエストについて何も知らない。あたかも一度も実行されていないかのように、名前付きPHPスクリプトが最初から最後まで実行され、再び実行されることはありません。過去について何も覚えておらず、明示的に何かをしない限り、未来については何も知らない。

リクエスト間で値を保持したい場合は、DB、セッション、クッキー、何でも(それはあなた次第です) - それらを必要に応じて後で取得する必要があります。あなたは、SQLでの単一UPDATEステートメントを行っている、それは1つのHTTPリクエストを使用する方が理にかなってて -


あなたはとにかく二つの別々のリクエストをしたいと思う理由は、サーバーのコードを見ると、それは明らかではない、と述べましたすべてのデータをサーバーに送信し、UPDATEを実行するスクリプトを実行します。 UIに何らかの理由がある場合を除き、これを行うことはできません。その場合、要求の間のどこかに値を保持する必要があります。あなたの説明から、潜在的にajaxを介してサーバーにすぐに送信するのではなく、生成するフォームの中の隠しフィールドにセル/列IDを取り込むことができます。隠しフィールドの値は、メインフォームが送信されるときにユーザー生成値とともにサーバーに送信されます。

また、実際にマウスの位置を使用してセルを決定している場合、これは非常に信頼性が低いと思われます。ブラウザウィンドウは何かにリサイズすることができます。確かに、セルのHTMLマークアップ内にIDを入れておくと(例えば、データ属性として)、セルがクリック/マウスオーバーされたときに読み取ることができます。

関連する問題