我正在这个网站上工作,允许学生通过下拉列表中的selectiong主题预订培训课程的座位并按下按钮。我创建了一个javascript(ajax)脚本,其中包含一个调用php脚本的函数,该脚本可以减少数据库中的席位数。 但不幸的是它不起作用......我需要你的帮助人: 这是我的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 :(得分: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
值为0,您所拥有的比较也将始终返回place
。
此外,您应该更改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';