2015-04-30 5 views
1

В рамках моей курсовой работы мне нужно создать веб-приложение, которое соединяется с базой данных, все размещаются на лазурной и реализуют REST api. Я создал базу данных MySQL, и теперь я пытаюсь выполнить код примера, который дал мой лектор, чтобы настроить его на мой текущий проект. Только у меня возникают проблемы с этим. Желаемая структура заключается в том, что index.html имеет кнопку, когда это нажато, вызов NameWebService использует ajax для подключения к php-файлу, который затем обрабатывает соединение с базой данных и сбор данных. Но ничего не возвращается из базы данных (и не может отлаживать php из webmatrix. Я не уверен на 100%, что соединение даже установлено).Понимание того, что делает ajax

Любая помощь была бы принята с благодарностью.

NameWebService.js

var year; 
var gender; 

function SetValues() { 
    year = document.getElementById('Year').value; 
    gender = document.getElementById('Gender').value; 
} 

function getNames(year, gender) 
{ 
    //alert(year + '\n' + gender); 
    $.ajax({ 
     url: '/Name', 
     type: 'GET', 
     data: 'table='+year, 
     datatype: 'json', 
     success: function (data) { 
      alert('Data is:\n'+data) 
      createNamesTable(data); 
     }, 
     error: function (jqXHR, textStatus, errorThrown) { 
      alert(jqXHR + '\n' + textStatus + '\n' + errorThrown); 
     } 
    }); 
} 

function createNamesTable(Names) 
{ 
    var strResult = '<div class="col-md-12">' + 
        '<table class="table table-bordered table-hover">' + 
        '<thead>' + 
        '<tr>' + 
        '<th>Rank</th>' + 
        '<th>Name</th>' + 
        '<th>Change Since Last Year</th>' + 
        '</tr>' + 
        '</thead>' + 
        '<tbody>'; 
    $.each(Names, function (Rank, Name){       
     strResult += "<tr><td>" + Name.Rank + "</td><td> " + Name.Name + "</td><td>" + Name.Change + "</td>"; 
    }); 
    strResult += "</tbody></table>"; 
    $("#allNames").html(strResult); 
} 

звонки в PHP и, следовательно, базы данных, забирает данные и создает таблицу из него.

NameRestService.php

<?php  
    require "RestService.php"; 
    require "Name.php"; 

class NameRestService extends RestService 
{ 
    private $Domain = 'domain'; 
    private $User = 'username'; 
    private $Password = 'password'; 
    private $Database = 'database'; 
    private $Names; 

    public function __construct() 
    { 
    parent::__construct("Name"); 
    } 

    public function performGet($url, $parameters, $requestBody, $accept) 
    { 
    $this->initialiseData($_GET['table']); 
    echo json_encode($this->Names); 
    } 

    private function initialiseData($year) 
    { 
     $this->Names = [new Name("100000","Test","-23124324"),new Name("100001","Testtwo","-24")]; 
    } 
} 
?> 

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

RestService.php

<?php 

class RestService 
{ 
    private $supportedMethods; 
    private $apiStringToMatch; 

    public function __construct($apiStringToMatch) 
    { 
    $this->supportedMethods = "GET, PUT, POST, DELETE"; 
    $this->apiStringToMatch = $apiStringToMatch; 
    } 

    public function handleRawRequest($_SERVER, $_GET, $_POST) 
    { 
    $url = $this->getFullUrl($_SERVER); 
    $method = $_SERVER['REQUEST_METHOD']; 
    $requestBody = file_get_contents('php://input'); 

    if (isset($_GET['q'])) 
    { 
     $parameters = explode("/", $_GET['q']); 
     if (strlen($this->apiStringToMatch) > 0 && count($parameters) > 0) 
     { 
      if (strcmp($this->apiStringToMatch, $parameters[0]) != 0) 
      { 
       $this->notImplementedResponse(); 
       return; 
      } 
     } 
    } 
    else 
    { 
     $parameters = array(); 
    } 
    if (isset($_SERVER['HTTP_ACCEPT'])) 
    { 
     $accept = $_SERVER['HTTP_ACCEPT']; 
    } 
    else 
    { 
     $accept = ""; 
    } 
    $this->handleRequest($url, $method, $parameters, $requestBody, $accept); 
    } 

    protected function getFullUrl($_SERVER) 
    { 
    $protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http'; 
    $location = $_SERVER['REQUEST_URI']; 
    return $protocol.'://'.$_SERVER['HTTP_HOST'].$location; 
    } 

    public function handleRequest($url, $method, $parameters, $requestBody, $accept) 
    { 
    switch($method) 
    { 
     case 'GET': 
     $this->performGet($url, $parameters, $requestBody, $accept); 
     break; 
     default: 
     $this->notImplementedResponse(); 
    } 
    } 

    protected function notImplementedResponse() 
    { 
    // 501 Not Implemented 
    header('Allow: ' . $this->supportedMethods, true, 501); 
    } 


    protected function methodNotAllowedResponse() 
    { 
    // 405 (Method Not Allowed) 
    header('Allow: ' . $this->supportedMethods, true, 405); 
    } 

    protected function notFoundResponse() 
    { 
    header("HTTP/1.1 404 Not Found"); 
    } 

    protected function noContentResponse() 
    { 
    header("HTTP/1.1 204 No Content"); 
    } 

    // Override the following methods to provide the appropriate functionality 

    public function performGet($url, $parameters, $requestBody, $accept) 
    { 
    $this->methodNotAllowedResponse(); 
    } 
} 
?> 

Базовый класс для апи отдыха, выкладывает основные фонды. Я не могу сказать, если запрос Ajax приходит сюда или к NameRestService ...

Name.php

<?php 
class Name 
{ 
    public $Rank; 
    public $Name; 
    public $Change; 

    public function __construct($rank, $name, $change) 
    { 
     $this->Rank = $rank; 
     $this->Name = $name; 
     $this->Change = $change; 
    } 

    public function GetRank() 
    { 
     return $this->Rank; 
    } 

    public function GetName() 
    { 
     return $this->Name; 
    } 

    public function GetChange() 
    { 
     return $this->Change; 
    } 
} 
?> 

базовый объект для наших данных хранится в.


EDIT:

Я разговаривал с некоторыми коллегами, и мы начали, чтобы выяснить, что должно быть сделано. Сайт использует web.config для перенаправления запросов на api.php, который затем инициализирует остальную часть php.

Я также сократил много неживого кода для этого этапа и обновил выше, чтобы соответствовать. веб-конфигурация и api.php как таковые:

api.php

<?php 
    require "NameRestService.php"; 

$service = new NameRestService(); 
$service->handleRawRequest($_SERVER, $_GET, $_POST); 
?> 

web.config

<?xml version="1.0"?> 
<configuration> 
    <system.webServer> 
     <handlers> 
     <remove name="PHP53_via_FastCGI" /> 
     <add name="PHP53_via_FastCGI" path="*.php" 
       verb="GET, PUT, POST, DELETE, HEAD" 
       modules="FastCgiModule" 
       scriptProcessor="D:\Program Files (x86)\PHP\v5.3\php-cgi.exe" 
       resourceType="Either" requireAccess="Script" /> 
     </handlers> 
     <rewrite> 
     <rules> 
      <rule name="Rule" stopProcessing="true"> 
       <match url="^(.*)$" ignoreCase="false" /> 
       <conditions> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" /> 
        <add input="{URL}" pattern="^/favicon.ico$" ignoreCase="false" negate="true" /> 
       </conditions> 
       <action type="Rewrite" url="api.php?q={R:1}" appendQueryString="true" /> 
      </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

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

+0

это код для нас, чтобы попытаться отладить –

+0

Извините Я не был уверен, что нужно, поэтому я поставил достаточно, чтобы люди могли понять большую часть происходящего. –

+1

Узнайте, как использовать инструменты браузера для проверки запросов (данные отправлены/возвращены, заголовки, статус и т. Д.), Чтобы увидеть). Не уверен, какой маршрут используется ... 'echo json_encode ($ _ REQUEST);' – charlietfl

ответ

0

Если это не

$.ajax({ 
    url: '/Name', 

быть

$.ajax({ 
    url: '/NameRestService.php', 
+0

У меня было это так, но я продолжал получать «внутреннюю ошибку обслуживания» –

1

Для мониторинга и отладки AJAX звонки, использовать инструменты для разработчиков браузера (Нажмите F12). Затем вы увидите вкладку «Сеть», где вы можете просмотреть весь трафик на сервер, включая параметры и данные ответа. В некоторых браузерах есть субстраница XHR, которая фильтрует только запросы AJAX (полезно, если у вас много изображений и т. Д.).

+0

Удивительно, я получил эту работу, спасибо –

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