PDA

View Full Version : مشکل با یک مثال برای پیاده سازی مدل mvc



esmahdi
جمعه 16 دی 1390, 22:45 عصر
یه مثال تو یه سایت دیدم در مورد مدل mvc ولی تو پیاده سازی و فهمش یه مقدار مشکل دارم. اگه کسی راهنماییم کنه خیلی ممنونش می شم:
توضیح مختصر: وقتی کاربر صفحه (index.php) رو باز می کنه title یک سری اطلاعات از پایگاه داده نمایش داده می شه. حالا هر عنوان خودش حاوی یک لینک می شه تا بشه باقی اطلاعات اون رو مشاهده کرد. که این نمایش اطلاعات به شکل index.php/show?id=1 هست. اطلاعات رو می شه به صورت یک لیست دید ولی وقتی بخوام که اطلاعات رو با استفاده از index.php/show?id=1 بخونم به مشکل بر می خورم و not found می ده!
حالا من فایلا رو پایین می ذارم در آخر هم کل فایل رو به همراه دیتابیس برای آپلود می ذارم:
//model.php

<?php
function open_database_connection()
{
$link = mysql_connect('localhost', 'root', '');
mysql_select_db('blog_db', $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 = mysql_real_escape_string($id);
$query = 'SELECT date, title, body FROM post WHERE id = '.$id;
$result = mysql_query($query);
$row = mysql_fetch_assoc($result);

close_database_connection($link);

return $row;
}

//index.php

<?php
require_once 'model.php';
require_once 'controllers.php';

// route the request internally
$uri = $_SERVER['REQUEST_URI'];
if ($uri == '/index.php') {
list_action();
} elseif ($uri == '/index.php/show' && 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

<?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';
}

در ضمن تو پوشه templates هم فایلای زیر موجوده:
//layout.php

<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="/show?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' ?>

:متفکر:

امیـرحسین
شنبه 17 دی 1390, 10:53 صبح
مقدار REQUEST_URI کوئری هم با خودش داره یعنی اون شرط شما صحیح نیست اینجوری باید باشه:

elseif(preg_match('@^\/index\.php\/show(.*)@i', $uri)!=0 && isset($_GET['id'])) {
show_action($_GET['id']);
}
این روش هم خشکتر عمل میکنه ولی سریعتر:

elseif(substr(strtolower($uri),0,15)=='/index.php/show') && isset($_GET['id'])){
show_action($_GET['id']);
}