2016-05-14 4 views
0

Я работаю на этом сайте, что позволяет студентам заказывать места для учебных занятий по теме выбора в выпадающем списке и кликать по кнопке. Я создал сценарий 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

Заменить этот 'уаг место = document.getElementByTagName (часы),' 'с этим вар место = документа.getElementById («clock»); 'Будет работать лучше :) – dlopez

+0

В любом случае, вы можете показать результат, созданный вашим PHP-скриптом (если он кого-то выражает). – dlopez

+0

Я заменил TagName на Id, но все же –

ответ

0

Первые ошибки в этой строке:

var place=document.getElementTagName(clock); 

Вам нужно найти элемент по его идентификатору, а не по имени его тега. Также 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 и содержимое вашей базы данных в базе данных, в данный момент это невозможно сказать.

РНР скрипт имеет ошибку здесь:

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

Вы используете $i, как если выбранное значение, но это не так. fetch() возвращает массив со значениями, в этом случае массив с одним значением. Сравнение, как вы его всегда будет возвращать true, даже если выбран place значение 0.

Кроме того, вы должны изменить свой скрипт, так что вы не сцепить значения в строку SQL, как это делает вас уязвимыми для SQL injection. Вместо этого используйте prepared statements.

Кроме того, ваш PHP-скрипт не работает хорошо, когда существует много параллелизма. Представьте себе, что есть одно место слева, а два - вызов PHP в то же время, тогда оба увидят, что осталось одно место, а другое уменьшило счет, и оба получат «да».

Вместо этого вы должны сначала выполнить обновление и проверить наличие в инструкции обновления. Затем проверьте, обновила ли запись запись. Если нет, то мест не осталось. Поскольку оператор 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

Смежные вопросы