Чтобы освоить формы php и HTML, я решил создать небольшое веб-приложение, которое собирает данные с другого веб-сайта, но отображает их для мобильного устройства.
Для этого упражнения я выбрал сайт автобусной компании в моем регионе: http://delijn.be/en/index.htm. Я проанализировал сайт и нашел форму с именем "form1", которая отправляет данные на сайт: http://reisinfo.delijn.be/reisinfo/RouteplannerHomeBeperktServlet?taal=en через метод POST.
Я начал писать код php и обнаружил в Интернете, что вы можете отправлять поля POST с помощью cURL. Так я и сделал. К сожалению, это не работает. Я получаю страницу с ошибкой сайта. Поэтому я думаю, что некоторые поля должны отсутствовать, но я проверил все и не могу найти другое поле. И таким образом я снова попадаю сюда с просьбой о помощи.
Веб-приложение размещено на моем домашнем сервере и также может быть загружено там.
Я был бы очень признателен, если бы кто-то мог помочь мне с этой проблемой,
ief2
PS: некоторые части кода написаны на голландском языке, поэтому вот некоторые переводы:
- Gemeente = Город / Город
- Plaats = Расположение
- Nummer = Число
- Дата = Дата
- Даг = День
- Маанд = Месяц
- Яар = Год
- Uur = час
- Aankomst = Прибытие
- Вертрек = Отправление
- Берекенен = Рассчитать
PPS: Ссылка на скачивание, очевидно, не работает, однако у меня нет проблем с ее загрузкой, поэтому вот несколько фрагментов кода:
index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>De Lijn Mobile</title>
<meta name="viewport" content="width = device-width">
</head>
<body>
<form name="main" action="calculateRoute.php" method="post">
<b>Vertrek:</b><br>
Gemeente: <input type="text" name="vertrekGemeente"><br>
Straat: <input type="text" name="vertrekStraat"><br>
Nummer: <input type="text" name="vertrekNummer"><br>
<hr>
<b>Aankomst:</b><br>
Gemeente: <input type="text" name="aankomstGemeente"><br>
Straat: <input type="text" name="aankomstStraat"><br>
Nummer: <input type="text" name="aankomstNummer"><br>
<hr>
<b>Datum:</b><br>
<?php
require("./Date.php");
$now = new Date();
?>
<input type="radio" name="datumType" value="aankomst" checked> Aankomst<br>
<input type="radio" name="datumType" value="vertrek"> Vertrek<br>
Dag: <input type="text" size="2" name="datumDag" value="<?php echo $now->day; ?>"><br>
Maand: <input type="text" size="2" name="datumMaand" value="<?php echo $now->month; ?>"><br>
Jaar: <input type="text" size="4" name="datumJaar" value="<?php echo $now->year; ?>"><br>
Tijdstip: <input type="text" size="2" name="datumUur" value="<?php echo $now->hour; ?>"> :
<input type="text" size="2" name="datumMinuten" value="<?php echo $now->minutes; ?>"><br>
<hr>
<input type="submit" value="Bereken"><br>
</form>
</body>
</html>
calculateRoute.php
<DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>De Lijn Mobile - Berekeningen</title>
</head>
<body>
<?php
require_once("./Plaats.php");
require_once("./Date.php");
require_once("./DeLijn.php");
echo "Gathering data...<br>";
$gemeente = $_POST["vertrekGemeente"];
$straat = $_POST["vertrekStraat"];
$nummer = $_POST["vertrekNummer"];
$vertrekPlaats = new Plaats($gemeente, $straat, $nummer);
$gemeente = $_POST["aankomstGemeente"];
$straat = $_POST["aankomstStraat"];
$nummer = $_POST["aankomstNummer"];
$aankomstPlaats = new Plaats($gemeente, $straat, $nummer);
$datumType = $_POST["datumType"];
$dag = $_POST["datumDag"];
$maand = $_POST["datumMaand"];
$jaar = $_POST["datumJaar"];
$uur = $_POST["datumUur"];
$min = $_POST["datumMinuten"];
$datum = Date::withDate($jaar, $maand, $dag, $uur, $min);
$datum->month = $maand;
echo "Searching...<br>";
searchDeLijn($vertrekPlaats,
$aankomstPlaats,
$datumType,
$datum);
?>
</body>
</html>
DeLijn.php
<?php
require_once("Route.php");
require_once("Date.php");
require_once("Plaats.php");
// ==== Returns of Route objects or null
define('DATE_ARRIVAL', "aankomst");
define('DATE_DEPARTURE', "vertrek");
function searchDeLijn($dep, $ar, $dateType, $date) {
$vertrekkenOfAankomen = "aankomen";
if(DATE_DEPARTURE === $dateType) {
$vertrekkenOfAankomen = "vertrekken";
}
$myMins = (int)$date->minutes;
$myMins -= ($myMins % 5);
$postFields = array(
"form1:vertrekGemeenteInput" => $dep->gemeente,
"form1:vertrekStraatInput" => $dep->straat,
"form1:vertrekNrInput" => $dep->nummer,
"form1:aankomstGemeenteInput" => $ar->gemeente,
"form1:aankomstStraatInput" => $ar->straat,
"form1:aankomstNrInput" => $ar->nummer,
"form1:vertrekkenOfAankomenRadio" => $vertrekkenOfAankomen,
"form1:dagCombo" => (string)(int)$date->day,
"form1:maandCombo" => (string)(int)$date->month,
"form1:jaarCombo" => $date->year,
"form1:uurCombo" => (string)(int)$date->hour,
"form1:minutenCombo" => (string)$myMins);
print_r($postFields);
// do the curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,
'http://reisinfo.delijn.be/reisinfo/RouteplannerHomeBeperktServlet?taal=nl');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$contents = curl_exec($ch);
curl_close($ch);
if($contents == false) {
return null;
}
echo $contents;
$myRouteObjects = extractRoutesFromXMLData($contents);
return $myRouteObjects;
}
// ==== Returns array of Route objects or null
function extractRoutesFromXMLData($dataString) {
$tableBody = getResultsTableBody($dataString);
if($tableBody != null) { return null; }
$tableRows = getTableRowsOfTableBody($tableBody);
if($tableRows != null) { return null; }
// put them in an array
$myArray = array();
$count = $tableRows->length;
for($i = 0; $i < $count; $i++) {
$aNode = $tableRows->item(0);
$myArray[] = $aNode;
}
return $myArray;
}
// ==== Returns XMLDocument or null
function getResultsTableBody($dataString) {
// Get table element
$status = preg_match('/<TABLE id="routeplanner_overzicht".*?>.*?<\/TABLE>/is',
$docString, $matches);
if($status == 0) {
return null;
}
$tableElement = $matches[0];
// Extract body
$status = preg_match('/<TBODY>.*?<\/TBODY>/is',
$tableElement, $matches);
if($status == 0) {
return null;
}
$doc = new DOMDocument();
$doc->loadXML($matches[0]);
return $doc;
}
// ==== Retunrs XMLNodeList or null
function getTableRowsOfTableBody($xmlDoc) {
$xpath = new DOMXPath($domDoc);
$xpathres = $xpath->evaluate("//tbody[0]/tr");
if($xpathres == false) {
return null;
}
return $xpathres;
}
?>
Date.php
, Plaats.php
и Route.php
содержат классы для инкапсуляции даты, местоположения и возможного маршрута соответственно.