2016-04-21 3 views
3

Я пытаюсь получить некоторые данные из базы данных. Я создаю функцию, которая находится в файле functions.php, которые возвращают значение. На другой странице я создаю переменную и просто получаю ее. Я пытался использовать onkey для проверки базы данных, но потом понимаю, что мне нужно знать количество билетов, даже если они ничего не набирают.Как получить данные из базы данных sql-сервера в php без обновления страницы

Вот функция:

function.php

function is_ticket_able($conn){ 


$query = "select number_of_tickets from [dbo].[TICKETS] " ; 


$stmt = sqlsrv_query($conn, $query); 


while ($row = sqlsrv_fetch_array($stmt)) { 
    $amount_of_tickets = $row['number_of_tickets']; 

} 

    return $amount_of_tickets; 

} 

И, я пытаюсь проверить базу данных (без перезагрузки страницы) и получить значение на этой странице:

application.php

$amount_of_tickets = is_ticket_able($conn); 

Тогда я просто проверю, что $amount_of_tickets не 0 или 1. Потому что, если это один, то некоторые вещи должны измениться.

Я делаю это (внутри application.php):

if($amount_of_tickets !=0){ 
    //show the form and let them apply for tickets. 

    //also 
    if($amount_of_tickets == 1){ 
     //just let them apply for one ticket. 
    } 
} 

EDIT: Я видел, что AJAX будет правильным использовать, но я так запутать его использования.

UPDATE:

function.php

function is_ticket_able($conn){ 


$query = "select number_of_tickets from [dbo].[TICKETS_LKUP] " ; 


$stmt = sqlsrv_query($conn, $query); 


while ($row = sqlsrv_fetch_array($stmt)) { 


    $ticket = $row['number_of_tickets']; 

    } 

    return $ticket; 
} 

application.php

$amount_of_tickets = is_ticket_able($conn); 

<script type="text/javascript"> 
var global_isTicketAble = 0; 

checkTicket(); 

function checkTicket() 
{ 
    $.ajax(
     { 
     url: "application.php", 
     method: 'GET', 
     dataType: 'text', 
     async: true, 
     success: function(text) 
     { 
      global_isTicketAble = text; 
      alert(global_isTicketAble); 
      if(global_isTicketAble == 0){ 
         window.location.replace("http://www.google.com"); 
      } 
      setTimeout(checkTicket, 5000); // check every 5 sec 
     } 
    });   
    } 



    </script> 

Итак, теперь проблема в том, что, когда я alert(global_isTicketAble); это не предупредить значение из базы данных, но это делает предупреждение все, что находится внутри application.php ... Помощь plzzz

ответ

3

стороне сервера

Предполагая, что вы должны проверить $amount_of_tickets периодически, и это может быть вычислена в application.php, в том, что файл, который вы будете иметь

<?php 

    // $conn is defined and set somewhere 

    $amount_of_tickets = is_ticket_able($conn); 

    echo $amount_of_tickets; 
    exit(0); 
?> 

Таким образом, когда сценарий вызывается с помощью простого GET запроса значение Ретур в ответ как простой текст.


Client Side

Аякса это путь, если вы хотите обновить информацию на странице без перезагрузки его.

Ниже приведен простой пример (с использованием jQuery), который может быть расширен в соответствии с вашими потребностями.

Код ниже является фрагментом кода JavaScript. Глобальная используется для хранения значения (Глобалы следует избегать, но это только с целью примера)

Затем вызывается функция и обновленное значение извлекается из function.php сценария.

Функция -очередная оконечная нагрузка (сама по себе setTimeout) должна быть повторно вызвана после заданного количества миллисекунд (для повторения процесса получения).

var global_isTicketAble = 0; 

checkTicket(); 

function checkTicket() 
{ 
    $.ajax(
     { 
      url: "application.php", 
      method: 'GET', 
      dataType: 'text', 
      async: true, 
      success: function(text) 
      { 
       global_isTicketAble = text; 
       // eventually do something here 
       // with the value just fetched 
       // (ex. update the data displayed) 

       setTimeout(checkTicket, 5000); // check every 5 sec 
      } 
     }   
} 

Обратите внимание, что $.ajax() посылает запрос, но не ждать ответа (как async установлен в true). Когда запрос получен, выполняется функция, указанная как success.

Полная функция Аякса документации JQuery можно найти здесь

http://api.jquery.com/jquery.ajax/

+0

несколько вещей. Итак, мне не нужно 'onkey'? Кроме того, мне нужна переменная билета, чтобы убедиться, что это не 0 ... могу ли я просто использовать ее в любом месте? И, наконец, O слышал, что с Ajax мне нужно «отгонять» что-то от моей функции (обязательное «эхо»)? –

+0

«Мне не нужно« onkey ». Я не знаю, это зависит от того, что вам нужно сделать. Этот фрагмент предоставил значение каждые 5 секунд. Вы можете настроить код для извлечения значения при возникновении события. Поскольку я использовал глобальную память для хранения извлеченного значения, она доступна из любого места в коде, но более целесообразно «делать что-то», когда значение извлекается. --- «Мне нужно« эхо »...», конечно, вам нужно передать значение сценарию на стороне клиента через ответ, и вы выполните это, повторив результат. – Paolo

+0

Таким образом, проблема заключается в том, что пользователь не может видеть количество оставшихся билетов. Есть ли способ, которым я не мог бы повторить количество оставшихся билетов? –

1

Я предполагаю, что у вас есть страницы (application.php), который отображает таблицу где-то. И вы хотите заполнить эту таблицу данными, содержащимися в вашей базе данных.

Я не уверен, КОГДА вы хотите, чтобы эти данные были обновлены. Нажимайте кнопку или периодически (например, через 5 секунд) ... Но это не имеет значения, о чем я расскажу ниже.

В application.php: Соберите всю свою страницу, как вы уже знаете, как это сделать.

Но внутри него, somewere, просто вставить пустой DIV, где ваш стол должен показать:

<div id="dynamicContent"></div> 

Кроме того, добавить этот скрипт в нижней части страницы:

<script> 
function getData(){ 
    PostData=""; 
    $.ajax({ 
     type: "POST", 
     url: "function.php", 
     data: PostData, 
     cache: true, 
     success: function(html){ 
      $(Destination).html(html); 
     } 
    }); 
} 

getData(); // Trigger it on first page load ! 
</script> 

Существует 2 переменных здесь ... Я назвал его «PostData» и «Destination».

О PostData:
Вы можете передать данные, собранные на стороне клиента для вашей функции PHP, если это необходимо. Предположим, вам нужно пройти первую и фамилию вашего пользователя, вы бы определить PostData так:

Fname=$("#Fname").val(); // user inputs 
Lname=$("#Lname").val(); 
PostData="Fname="+Fname+"&Lname="+Lname; 

В вашем function.php, вы будете извлечь его, как это (как и любые данные обычной почтой):

$Fname=$_POST['Fname']; 
$Lname=$_POST['Lname']; 

Если вам не нужно передавать данные со своего сценария на стороне клиента на серверную часть PHP ... Просто определите его пустым.

PostData=""; 

Тогда о Destination:
Это место для пустого «динамического сНу» ид (я назвал его «dynamicContent» выше).
Не забывайте о хэштеге (#) для идентификатора или точки для класса.
Это селектор jQuery.
Так вот, PostData будет определяться следующим образом:

Destination="#dynamicContent"; 

Результат запроса Аякса приземлится в том, что «динамический» DIV.
Это будет результатом того, что определено в function.php ..

Так что, если вы меня, вы должны создать таблицу в function.php ...
Я имею в виду ту часть, где вы делаете ваш запрос базы данных и ваш выбор.

echo "<table>"; 
echo "<tr><th>column title 1</th><th>column title 2</th></tr>" 
while ($row = sqlsrv_fetch_array($stmt)){ 
    echo "<tr><td>" . $row['data1'] . "</td><td>" . $row['data2'] . "</td></tr>"; 
} 
echo "</table>"; 

Поэтому, если у вас нет данных, таблица будет пустой.
Вы получите только таблицы и таблицы заголовков ... Но нет строки.
Нет необходимости в функции, которая проверяет наличие данных или нет.

Наконец ... О триггером для обновления:
В application.php, вы можете разместить кнопку, что пожары GetData() ... Или вы можете определить setInterval.
Это зависит от вас.

Вот как я использую ajax для обновления части страницы без ее полной перезагрузки.
Поскольку ajax для вас новичок, я надеюсь, что этот ответ поможет.
;)

------------------------
EDIT основан на комментарий Ариэль (2016-05-01)

Хорошо, я понимаю! Попробуйте это:

В application.php:

<div id="dynamicDiv"></div> 


<script type="text/javascript"> 

    // timer to trigger the function every seconds 
    var checkInterval = setInterval(function(){ 
     checkTicket(); 
    },1000); 


    function checkTicket(){ 
     $.ajax({ 
      type: "POST", 
      url: "function.php", 
      data: "", 
      cache: true, 
      success: function(html){ 
       $("#dynamicDiv").html(html); 
      } 
     });  
    } 

    function noMoreTikets(){ 
     clearInterval(checkInterval); 
     window.location.replace("http://www.google.com"); 
    } 
</script> 

В function.php:

// Remove the "function is_ticket_able($conn){" function wrapper. 
// Define $conn... Or include the file where it is defined. 

// I assume that your query lookup works. 

$query = "select number_of_tickets from [dbo].[TICKETS_LKUP] " ; 
$stmt = sqlsrv_query($conn, $query); 
while ($row = sqlsrv_fetch_array($stmt)) { 
    $ticket = $row['number_of_tickets']; 
} 

// Add this instead of a return. 
if($ticket>0){ 
    echo "There is still some tickets!"; // Text that will show in "dynamicDiv" 
}else{ 
    ?> 
    <script> 
     $(document).ready(function(){ 
      noMoreTikets(); 
     }); 
    </script> 
    <?php 
} 

Помните, что ваши PHP скрипты выполняются на стороне сервера.
Вот почему ваш «билет возврата»; ничего не делал.

В этом способе вызова функции function.php его скрипт выполняется один, как на одной странице, без какого-либо отношения с application.php, который был выполнен давно.

Он создает текст (или javascript) для обслуживания клиенту.
Если вы хотите передать переменную PHP на клиентский javascript, вы должны эхо его использовать как javascript.

Итак, если переменная $ variable $ ticket больше нуля, в тексте «dynamicDiv» будет отображаться текст, говорящий о наличии доступных билетов, и страница приложения не будет обновлена. Я полагаю, это показывает кнопку или что-то, что позволяет студентам получить билет.

Иначе, это будет триггер javascript для «noMoreTikets()», который приземлится в «dynamicDiv».

+0

Спасибо за ваш ответ. Ну, нет, у меня нет стола нигде. Мне просто нужно получить строку из базы данных, содержащую 'number_of_tickets_able', тогда, если это число равно 0, немедленно отправьте пользователя на другую страницу, говоря, что больше нет билетов. Другими словами, я считаю, что я должен обновлять страницу каждую секунду, потому что студенты будут запрашивать сразу. около 100 билетов и около 2000 студентов, я беспокоился о том, что «echo» где-то будет показывать «number_of_tickets_abe», и я не хочу, чтобы учащиеся это видели. –

+0

Я обновил свой ответ ... Теперь это более конкретно для вашей потребности. ;) –

+1

'var checkInterval = setInterval (function() {checkTicket();}, 1000);' hmm .. что, если бэкэнд занимает более 1 секунды, чтобы отправить ответ? Новый запрос должен быть опубликован только в том случае, если предыдущий был получен. – Paolo

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