В рамках моей курсовой работы мне нужно создать веб-приложение, которое соединяется с базой данных, все размещаются на лазурной и реализуют 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.
это код для нас, чтобы попытаться отладить –
Извините Я не был уверен, что нужно, поэтому я поставил достаточно, чтобы люди могли понять большую часть происходящего. –
Узнайте, как использовать инструменты браузера для проверки запросов (данные отправлены/возвращены, заголовки, статус и т. Д.), Чтобы увидеть). Не уверен, какой маршрут используется ... 'echo json_encode ($ _ REQUEST);' – charlietfl