Я новичок в php. Поэтому один из мужчин рекомендовал мне выполнить шаг за шагом этот урок - http://symfony.com/doc/current/book/from_flat_php_to_symfony2.html (перед главой "Добавить прикосновение Symfony"). Это приятно для начинающих! Я создаю свой первый блог! Но когда я пытаюсь получить страницу "показать", на которой отображается отдельная запись в блоге, идентифицированная параметром запроса id, мой браузер говорит: "Запрошенный URL-адрес/чтение не было найдено на этом сервере". Я не использую.htaccess и переписывает режим apache (версия сервера - Apache/2.2.22). Мой следующий код:
Передний контроллер
<?php
// index.php
// load and initialize any global libraries
require_once 'model.php';
require_once 'controllers.php';
// route the request internally
$uri = $_SERVER['REQUEST_URI'];
if ('/index.php' == $uri) {
list_action();
} elseif ('/index.php/show' == $uri && isset($_GET['id'])) {
show_action($_GET['id']);
} else {
header('Status: 404 Not Found');
echo '<html><body><h1>Page Not Found</h1></body></html>';
}
Controllers.php
function list_action()
{
$posts = get_all_posts();
require 'templates/list.php';
}
function show_action($id)
{
$post = get_post_by_id($id);
require 'templates/show.php';
}
Модель
<?php
// model.php
function open_database_connection()
{
$link = mysql_connect('localhost', 'root', 'zoob');
mysql_select_db('post', $link);
return $link;
}
function close_database_connection($link)
{
mysql_close($link);
}
function get_all_posts()
{
$link = open_database_connection();
$result = mysql_query('SELECT id, title FROM post', $link);
$posts = array();
while ($row = mysql_fetch_assoc($result)) {
$posts[] = $row;
}
close_database_connection($link);
return $posts;
}
function get_post_by_id($id)
{
$link = open_database_connection();
$id = intval($id);
$query = 'SELECT date, title, post FROM post WHERE id = '.$id;
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);
close_database_connection($link);
return $row;
}
Шаблоны
//layout.php
<!DOCTYPE html>
<html>
<head>
<title><?php echo $title ?></title>
</head>
<body>
<?php echo $content ?>
</body>
</html>
//list.php
<?php $title = 'List of Posts' ?>
<?php ob_start() ?>
<h1>List of Posts</h1>
<ul>
<?php foreach ($posts as $post): ?>
<li>
<a href="/read?id=<?php echo $post['id'] ?>">
<?php echo $post['title'] ?>
</a>
</li>
<?php endforeach ?>
</ul>
<?php $content = ob_get_clean() ?>
<?php include 'layout.php' ?>
//show.php
<?php
$title = $post['title'] ?>
<?php ob_start() ?>
<h1><?php echo $post['title'] ?></h1>
<div class="date"><?php echo $post['date'] ?></div>
<div class="body">
<?php echo $post['body'] ?>
</div>
<?php $content = ob_get_clean() ?>
<?php include 'layout.php' ?>
Пожалуйста, помогите мне решить и понять проблему. благодаря
У вас есть несоответствие в ваших маршрутах и как вы относитесь к ним.
/read?id=
/show?id=
Измените один из двух, и вам должно быть хорошо идти.
Итак, теперь, когда контроллер фактически получает запрос, вам просто нужно отлаживать запросы URI и GET, чтобы убедиться, что они соответствуют вашим требованиям. Сделайте что-то подобное в своем переднем контроллере:
<?php
// index.php
// load and initialize any global libraries
require_once 'model.php';
require_once 'controllers.php';
// route the request internally
$uri = $_SERVER['REQUEST_URI'];
if ('/index.php' == $uri) {
list_action();
} elseif ('/index.php/show' == $uri && isset($_GET['id'])) {
show_action($_GET['id']);
} else {
header('Status: 404 Not Found');
echo '<html><body><h1>Page Not Found</h1></body></html>';
var_dump($uri);
var_dump($_GET);
}
Page Not Found string '/index.php/show?id=2' (length=20) array (size=1) 'id' => string '2' (length=1)
,
Page Not Found string '/index.php/show?id=5' (length=20) array (size=1) 'id' => string '5' (length=1)