PDA

View Full Version : سوال: مشکل با pdo



Louai_M
پنج شنبه 10 بهمن 1392, 19:32 عصر
با سلام من در pdo تازه کار هستم یه مشکلی برام به وجود آمد
کد کلاس model


<?php
class news_model extends model
{
function __construct()
{
parent:: __construct();
}


public function newslist()
{
return $this->db->select('SELECT * FROM tblnews WHERE userid = :userid',
array('userid' => $_SESSION['userid']));
}

}
?>


کد کلاس controller


<?php
class News extends controller
{
function __construct() {
parent::__construct();
}
function index()
{
$this->view->newslist = $this->model->newslist();
$this->view->render('index/news');
}
function details()
{
$this->view->render('index/news');
}
}
?>

کد کلاس یا همان صفحه view


<hr />
صفحه اخبار
<?php
if(isset($_GET['param']))
{
$type= $_GET['param'];
echo $type;
foreach($this->newslist as $key => $value)
{
echo '<div class="page_news_view">'. "\n";
echo '<div class="page_news_img">' ."\n";
echo '<img src="../pic-news/'.$value['pic'].'" alt="'.$value['titr'].'" />'. "\n";
echo '</div>' ."\n";
echo '<div class="page_news_cont">'. "\n";
echo '<span class="page_news_cont_stitr">'. $value['stitr'].'</span>' . "\n";
echo '<br />' . "\n";
echo '<span class="page_news_cont_titr"><a href="pr?id='. $value['id'].'">'. $value['titr'].' </a></span>' . "\n";
echo '<br />' . "\n";
echo '<span>'. $value['content'].'</span>'. "\n";
echo '</div>' ."\n";
echo '</div>' ."\n";
}
}
?>


خطای که میگیره به شکل زیر است مشکل از کجاست



Notice: Undefined property: News::$model in C:\wamp\www\rasad_mvc\app\controller\news.php on line 9

Fatal error: Call to a member function newslist() on a non-object in C:\wamp\www\rasad_mvc\app\controller\news.php on line 9

Louai_M
پنج شنبه 10 بهمن 1392, 20:09 عصر
دوستان کسی نیست کمک کنه

Louai_M
جمعه 11 بهمن 1392, 10:08 صبح
کسی نیست دوستان

mbf5923
جمعه 11 بهمن 1392, 10:17 صبح
کلاس کنترلری که گذاستین ارث بری از چی میکنه؟

class News extends controller
این کلاس news هستش یا کنترلر؟

Louai_M
جمعه 11 بهمن 1392, 13:17 عصر
از کلاس controller در پوشه لایبری یا libs



<?php

class Controller {

function __construct() {
//echo 'Main controller<br />';
$this->view = new View();
}

/**
*
* @param string $name Name of the model
* @param string $path Location of the models
*/
public function loadModel($name, $modelPath = 'app/model/') {

$path = $modelPath . $name.'_model.php';

if (file_exists($path)) {
require $modelPath .$name.'_model.php';

$modelName = $name . '_Model';
$this->model = new $modelName();
}
}

}

2undercover
جمعه 11 بهمن 1392, 13:47 عصر
خوب شما هیچ جای برنامه متد loadModel رو برای استفاده از مدل صدا نزدید!

Louai_M
جمعه 11 بهمن 1392, 15:13 عصر
منظورتون چی نگرفتم یعنی کلاس model که تو لایبری لارم یا چیز دیگه ای هست


<?php

class Model {

function __construct() {
$this->db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
}

}

2undercover
جمعه 11 بهمن 1392, 19:06 عصر
منظورتون چی نگرفتم یعنی کلاس model که تو لایبری لارم یا چیز دیگه ای هست


<?php

class Model {

function __construct() {
$this->db = new Database(DB_TYPE, DB_HOST, DB_NAME, DB_USER, DB_PASS);
}

}


خوب شما توی کلاس controller اصلی یک متد به نام loadModel معرفی کردید، که با گرفتن نام مدل، مدل مناسب را در فیلد model از کلاس کنترلر قرار می ده.

ولی این متر که برای بارگذاری مدل هست هیچ جا برنامه شما برای بارگذاری مدل مناسب صدا زده نشده، در نتیجه وقتی توی کنترلر می خواید از مدل استفاده کنید، فیلد model در کنترلر خالی هست.

Louai_M
جمعه 11 بهمن 1392, 20:01 عصر
حالا باید چکار کنم میشه کد تکمیلیش بگید چیزی که کم داره را بنویسید

Louai_M
جمعه 11 بهمن 1392, 20:26 عصر
منظورتون این فایله


<?php
class news_model extends model
{
function __construct()
{
parent:: __construct();
}


public function newslist()
{
return $this->db->select('SELECT * FROM tblnews WHERE typen = :typen ORDER BY id DESC LIMIT 15',
array('typen' => $_GET['param']));
}

public function newshome()
{
return $this->db->select('SELECT * FROM tblnews WHERE typen = :typen ORDER BY id DESC LIMIT 2',
array('typen' => 'مهمترین خبر روز'));
}

}
?>

sadegh1362
شنبه 12 بهمن 1392, 09:05 صبح
سلام
خسته نباشید
فکر نمی کنم مشکل از این چیزا باشه
در فایل bootstrap در پوشه libs بعد از خط
$controller=new $url[0]();
بذارید

$controller->loadModel();
درست می شه

Louai_M
یک شنبه 13 بهمن 1392, 13:15 عصر
اینهم فایل bootstrap


<?php

class Bootstrap {

private $_url = null;
private $_controller = null;

private $_controllerPath = 'app/controller/'; // Always include trailing slash
private $_modelPath = 'app/model/'; // Always include trailing slash
private $_errorFile = 'error.php';
private $_defaultFile = 'index.php';

/**
* Starts the Bootstrap
*
* @return boolean
*/
public function init()
{
// Sets the protected $_url
$this->_getUrl();

// Load the default controller if no URL is set
// eg: Visit http://localhost it loads Default Controller
if (empty($this->_url[0])) {
$this->_loadDefaultController();
return false;
}

$this->_loadExistingController();
$this->_callControllerMethod();
}

/**
* (Optional) Set a custom path to controllers
* @param string $path
*/
public function setControllerPath($path)
{
$this->_controllerPath = trim($path, '/') . '/';
}

/**
* (Optional) Set a custom path to models
* @param string $path
*/
public function setModelPath($path)
{
$this->_modelPath = trim($path, '/') . '/';
}

/**
* (Optional) Set a custom path to the error file
* @param string $path Use the file name of your controller, eg: error.php
*/
public function setErrorFile($path)
{
$this->_errorFile = trim($path, '/');
}

/**
* (Optional) Set a custom path to the error file
* @param string $path Use the file name of your controller, eg: index.php
*/
public function setDefaultFile($path)
{
$this->_defaultFile = trim($path, '/');
}

/**
* Fetches the $_GET from 'url'
*/
private function _getUrl()
{
$url = isset($_GET['url']) ? $_GET['url'] : null;
$url = rtrim($url, '/');
$url = filter_var($url, FILTER_SANITIZE_URL);
$this->_url = explode('/', $url);
}

/**
* This loads if there is no GET parameter passed
*/
private function _loadDefaultController()
{
require $this->_controllerPath . $this->_defaultFile;
$this->_controller = new Index();
$this->_controller->index();
}

/**
* Load an existing controller if there IS a GET parameter passed
*
* @return boolean|string
*/
private function _loadExistingController()
{
$file = $this->_controllerPath . $this->_url[0] . '.php';

if (file_exists($file)) {
require $file;
$this->_controller = new $this->_url[0];
$this->_controller->loadModel($this->_url[0], $this->_modelPath);
} else {
$this->_error();
return false;
}
}

/**
* If a method is passed in the GET url paremter
*
* http://localhost/controller/method/(param)/(param)/(param)
* url[0] = Controller
* url[1] = Method
* url[2] = Param
* url[3] = Param
* url[4] = Param
*/
private function _callControllerMethod()
{
$length = count($this->_url);

// Make sure the method we are calling exists
if ($length > 1) {
if (!method_exists($this->_controller, $this->_url[1])) {
$this->_error();
}
}

// Determine what to load
switch ($length) {
case 5:
//Controller->Method(Param1, Param2, Param3)
$this->_controller->{$this->_url[1]}($this->_url[2], $this->_url[3], $this->_url[4]);
break;

case 4:
//Controller->Method(Param1, Param2)
$this->_controller->{$this->_url[1]}($this->_url[2], $this->_url[3]);
break;

case 3:
//Controller->Method(Param1, Param2)
$this->_controller->{$this->_url[1]}($this->_url[2]);
break;

case 2:
//Controller->Method(Param1, Param2)
$this->_controller->{$this->_url[1]}();
break;

default:
$this->_controller->index();
break;
}
}

/**
* Display an error page if nothing exists
*
* @return boolean
*/
private function _error() {
require $this->_controllerPath . $this->_errorFile;
$this->_controller = new Error();
$this->_controller->index();
exit;
}

}

abdollahpor
یک شنبه 13 بهمن 1392, 13:59 عصر
یه @ بزارید مشکل برطرف میشه ....

@parent:: __construct();

البته اگه اینکلود فایلتون قبل کلاس انجام شده ..

Louai_M
دوشنبه 14 بهمن 1392, 12:57 عصر
دوستان دیگه کسی نیست

sadegh1362
دوشنبه 14 بهمن 1392, 14:30 عصر
کلاس news_model رو تو چه پوشه ای ساختید؟

البته من فکر می کنم شما در لینکی که برای صفحه هاتون گذاشتید یه اشکالی دارد . چون در خط اول خطا News با حرف بزرگ داره خطا میده در صورتی که کنترلر شما با حرف کوچک نام گذاری شده

Louai_M
دوشنبه 14 بهمن 1392, 18:52 عصر
در پوشه model

sadegh1362
دوشنبه 14 بهمن 1392, 23:10 عصر
من فکر میکنم که وقتی صفحه رو فرا خونی میکنید تو url مرورگرتون news رو News صدا میزنید چک کنید...