2016-01-30 27 views
-1

我會解釋我的代碼,然後在代碼片段後繼續解決問題:爲什麼我的php代碼不能在表單提交時觸發?

我有一個叫做「functions_questions」的窗體。提交時,以下代碼根據當前分數增加或減少我的sql數據庫中的一列(標題爲「分數」)(標題爲「答案」)。

<?php 
    $id = $_SESSION['id']; 

    if(isset($_POST['functions_question'])){ 

    $res = $db->query("SELECT score FROM answers WHERE id=$id"); 
    $data = $res->fetch_array(); 

    if($data['score']<2)$db->query("UPDATE answers SET score = score+1 WHERE id=$id"); 

    if($data['score']>1)$db->query("UPDATE answers SET score = score-1 WHERE id=$id"); 

    } 

?> 

我也有以下的AJAX代碼,當提交表單時,它會自動更改div(id =「ajaxtest」)中的文本。當然,這樣做不會刷新頁面,因爲它使用AJAX。

<script type='text/javascript'> 

$(document).ready(function() { 
$('#questionform').on('submit', function(e) { 
    e.preventDefault(); 
    $.ajax({ 
     url : $(this).attr('action') || window.location.pathname, 
     type: "POST", 
     data: $(this).serialize(), 
     success: function (data) { 

ajaxtest.innerHTML = '"<?php echo $data['score']; ?>"'; 

      }, 
     }); 
    }); 
}); 
</script> 

最後,我有以下一段代碼,它顯示了標題爲「答案」的數據庫中標題爲「分數」的列中的值。

<?php 
$resss = $db->query("SELECT * FROM answers WHERE id=$id"); 
$data = $resss->fetch_array(); 
var_dump($data['score']); 
?> 

當我提交我的表單時,我可以在數據庫中看到管理員的分數已更新。 AJAX代碼將div(ajaxtest)更改爲$ data ['score'],但會顯示更新前的前一個分數,而不是新更新的分數。我如何修改這個以便ajaxtest顯示更新的分數而不是非更新的分數?

+0

表單本身名爲'functions_questions'?或者實際上是表單中輸入/按鈕/提交/其他表單字段的名稱? – jbafford

+0

這是表單的名稱。 –

+0

在HTML中,表單本身不是表單元素;它沒有價值,也沒有提交。您需要根據* is *提交的實際表單元素進行測試。 – jbafford

回答

0

嗯,這是因爲語句ajaxtest.innerHTML = '"<?php echo $data['score']; ?>"';在文件送達後立即進行評估,因此轉換爲ajaxtest.innerHTML = <score when file was served>';

如果您想要顯示新值,那麼您需要使用另一個異步請求(通常稱爲AJAX調用)來檢索它,或者返回代碼中的值來管理呼叫並使用它數據參數:

EDIT

JS:

$(document).ready(function() { 
    $('#questionform').on('submit', function(e) { 
     e.preventDefault(); 
     $.ajax({ 
      url : $(this).attr('action') || window.location.pathname, 
      type: "POST", 
      data: $(this).serialize(), 
      success: function (data) { 
       ajaxtest.innerHTML = data; 
      }, 
     }); 
    }); 
}); 

PHP:

<?php 
    $id = $_SESSION['id']; 

    if(isset($_POST['functions_question'])){ 

     $res = $db->query("SELECT score FROM answers WHERE id=$id"); 
     $data = $res->fetch_array(); 

     if($data['score'] < 2) 
      $db->query("UPDATE answers SET score = score+1 WHERE id=$id"); 

     if($data['score'] > 1) 
      $db->query("UPDATE answers SET score = score-1 WHERE id=$id"); 
     $res = $db->query("SELECT score FROM answers WHERE id=$id"); 
     $data = $res->fetch_array(); 

     echo $data['score']; 
    } 

它是這樣的:

  1. 文件送達,並在其所有的PHP語句進行評估,將響應發送到客戶端
  2. AJAX請求到服務器
  3. 服務器處理請求
  4. AJAX收到回覆(數據)
  5. 您使用回覆數據

您可以通過啓用開發人員工具(通常是ctrl + shift + i)並在「網絡」選項卡中啓用XHR來檢查Chrome中AJAX請求的結果。

+0

感謝您的評論!不幸的是,我對如何將其應用到我的AJAX代碼(我的文章中的第二個代碼塊)有點困惑。我以爲它已經以上面發佈的JS格式進行了設置。我應該用你寫的PHP代碼替換'ajaxtest.innerHTML ='「<?php echo $ data ['score'];?>」';'';對不起,看起來如此密集,但我是一個完整的新手。 –

+0

沒問題,我只是編輯了答案:-D。 – 42linoge

+0

根據重複查詢解決問題的原因是因爲您然後從數據庫中檢索新值並使用它填充$ data。 – 42linoge

0

只是下面改變你的PHP代碼: -

<?php 
    $id = $_SESSION['id']; 

    if(isset($_POST['functions_question'])){ 

     $res = $db->query("SELECT score FROM answers WHERE id=$id"); 
     $data = $res->fetch_array(); 

     if($data['score']<2)$db->query("UPDATE answers SET score = score+1 WHERE id=$id"); 

     if($data['score']>1)$db->query("UPDATE answers SET score = score-1 WHERE id=$id"); 

     $res = $db->query("SELECT score FROM answers WHERE id=$id"); 
     $data = $res->fetch_array(); 

    } 

?> 

它可以幫助你。

我只是在更新新記錄後得分。

+0

謝謝你的評論。爲什麼可能重複'$ res = $ db-> query(「SELECT score FROM answers WHERE id = $ id」); $數據= $水庫> fetch_array();'的代碼幫助解決此問題的結束? –

+0

因爲在那之前你有1你得到的值和之後所以現在它的2更新這些值,但是你顯示可更新查詢之前,舊的價值。 –

相關問題