2016-05-14 155 views
0

我正在這個網站上工作,允許學生通過下拉列表中的選擇主題和按鈕上的按鈕來預定座位進行培訓課程。我創建了一個包含調用php腳本的函數的javascript(ajax)腳本,該腳本減少了我數據庫上的席位數量。 但不幸的是它不工作...我需要你的幫助球員: 這裏是我的javascript:選擇一個下拉列表上的選項的值

<select name="Branche" name="clock" id="clock" onchange="count()"></select> 
<a onclick="count()" class="button"> 
    <span class="user">Réserver une place</span> 
</a> 


<script> 
    function count(){ 
     var place = document.getElementByTagName(clock); 
     var option = place.options[place.selectedIndex].id; 
     alert(option); 
     var xmlhttp = new XMLHttpRequest(); 
     xmlhttp.open("GET", "count.php?place=" + place,true); 
     xmlhttp.send(null); 
     xmlhttp.onreadystatechange = function() { 
      if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
       var reponse = xmlhttp.responseText; 
       if(reponse == "yes") { 
        alert("Votre place a été réservé"); 
       } else { 
        alert("Vous êtes arrivé trop tard !"); 
       } 
      } 
     } 
    } 
</script> 

,這裏是我的PHP腳本:

try { 
    $db = new PDO('mysql:host=localhost;dbname=projet','root','',array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
} catch(Exception $e){ 
    echo $e->getMessage(); 
    die(); 
} 

$nom = $_GET['place']; 
$sq="SELECT place FROM formation WHERE nom='$nom'"; 
$re = $db->query($sq); 

$i = $re->fetch(PDO::FETCH_ASSOC); 

if($i > 0){ 
    $sqq="UPDATE formation SET place = place - 1 WHERE nom='$nom'"; 
    $res = $db->query($sqq); 
    echo 'yes'; 
} else { 
    echo 'no'; 
} 
+0

替換此'變種地方= document.getElementByTagName(時鐘);'與此'變種地方=文檔。getElementById(「clock」);'它會更好用:) – dlopez

+0

無論如何,你可以顯示你的PHP腳本產生的輸出(如果它產生某人,顯然)。 – dlopez

+0

我用Id替換了TagName,但仍然是 –

回答

0

第一個錯誤是在這一行:

var place=document.getElementTagName(clock); 

您需要通過它的id找到元素,而不是它的標籤名稱。另外click是一個不存在的變量;你應該使用"clock"引號:

var place=document.getElementById("clock"); 

這樣place將是select元素。但後來你建立的URL參數使用:

xmlhttp.open("GET","count.php?place="+place,true); 

place不是所選的值;它是select元素,所以不會正常工作。相反,你應該送你option變量具有值:

xmlhttp.open("GET","count.php?place="+option,true); 

這是假設的option值是正確的。在沒有看到HTML和數據庫表格內容的情況下,目前無法說明這一點。

PHP腳本在這裏有一個錯誤:

$i = $re->fetch(PDO::FETCH_ASSOC); 
if($i>0){ 

您使用$i,就好像它是所選擇的價值,但事實並非如此。 fetch()返回一個包含值的數組,在這種情況下是一個具有一個值的數組。因爲你有它的比較將總是返回true,即使所選place值爲0

而且你應該改變你的PHP腳本,這樣你就不會串聯值到一個SQL字符串,因爲它使你容易受到SQL injection。請使用prepared statements

另外,當有很多併發時,您的PHP腳本運行不正常。想象一下,還有一個席位,兩個同時進行PHP調用,那麼兩個人都會看到在另一個席位減少計數之前還剩下一個位置,並且都會得到「是」。

相反,您應該先執行更新並檢查update語句中的可用性。然後檢查語句是否更新了記錄。如果沒有,那麼就沒有地方了。由於update語句在更新期間鎖定了記錄,所以一次只能有一個進程執行該操作。數據庫連接後

推薦PHP代碼成立:

$stmt = $db->prepare("UPDATE formation 
         SET place = place - 1 
         WHERE nom = ? 
         AND place > 0"); 

$stmt->execute(array($_GET['place'])); 

echo $stmt->rowCount() ? 'yes' : 'no'; 
+0

你可以給一些反饋,這是否回答你的問題? – trincot

相關問題