2012-01-09 11 views
3

すべて HTMLで作成されたフォームが有効かどうかを確認するために、次のクラスがあるので、ctrl + F5などここでそれを行うクラスです。フォームキーとAJAXを使用してフォームを送信

<?php 
class Form_Key 
{ 

protected $oldKey; 

public function __construct() 
{ 

    // Ensure we have an available session 
    if (NULL == session_id()) 
    { 
     session_start(); 
    } 

    // Grab our former key for validation 
    if (isset($_SESSION['form_key'])) 
    { 
     $this->oldKey = $_SESSION['form_key']; 
    } 

    // Assign the new key 
    $_SESSION['form_key'] = md5(uniqid(mt_rand(), TRUE)); 

} 

public function isValid() 
{ 
    return 'POST' == $_SERVER['REQUEST_METHOD'] 
     && isset($_POST['form_key']) 
     && '' != trim($_POST['form_key']) 
     && '' != trim($this->oldKey) 
     && $_POST['form_key'] === $this->oldKey; 
} 

public function getKey() 
{ 
    return $_SESSION['form_key']; 
} 

public function getOldKey() 
{ 
    return $this->oldKey; 
} 

public function render() 
{ 
    return '<input type="hidden" name="form_key" value="' . $_SESSION['form_key'] . '" />'; 
} 

public function __toString() 
{ 
    return $this->render(); 
} 

} 
?> 

それから私はこのような何かに見える形があります。検証側(save_memory.php)で

require "form_key.php"; 
$form_key = new Form_Key; 
<form action="about.php" method="post" name="create_memory" id="create_memory"> 
<input type="text" value="" id="lamecaptcha" name="lamecaptcha" /> 
<input type="text" value="" id="person_name" name="person_name" /> 
<?php echo $form_key; ?> 
</form> 

を、私はこのような何かを実行します。

require "form_key.php"; 
$form_key = new Form_Key; 
if(isset($_POST) && $form_key->isValid()){ 
    echo "It is ok to submit"; 
}else{ 
    echo "Something went wrong"; 
} 

私はajax経由でフォームを送信しないと素晴らしいですが、私がAJAX経由でフォームを送信すると、常に何かが間違ったエラーになります。ここで私はAJAXを経由してフォームを送信しています方法です:

person_name = $("input#person_name").val(); 
memory = $("input#memory").val(); 
form_key = $("input#form_key").val(); 
var html_memory = $.ajax({ 
type: "POST", 
url: "save_memory.php", 
data: "person_name=" + person_name + "&memory=" + memory + "&form_key=" + form_key, 
async: false 
}).responseText; 

alert(html_memory); 

すべてのアイデアは、このような場合は、どのように私はこれがAJAX経由で私のフォームを提出する仕事を得ることができますなぜですか?事前にどうもありがとうございました!

答えて

1

キー入力のJqueryセレクタが無効です。あなたはそのように、それにform_keyのIDを入れてあります。

return '<input id="form_key" type="hidden" name="form_key" value="' . $_SESSION['form_key'] . '" />'; 

あなたが入力を生成する関数を呼び出す必要があります[EDIT]

また:

<?php echo $form_key->render(); ?> 
+0

私の上の愚かな間違い部。それを指摘してくれてありがとう! – user1048676

+1

@クリスチャンは、IDの事に良いキャッチ。ただし、出力はそのままレンダリングされます。最初のコード本体、魔法のメソッド__toStringは、オブジェクトが印刷されるときに呼び出されます。これは2番目のコードブロックecho $ form_keyで行われます。 – davogotland

+0

@davogotland:+1あなたの:) – Kristian