PDA

View Full Version : مشکل خطای PHP MVC



moeinkhm
سه شنبه 28 خرداد 1398, 21:19 عصر
دوستان من دارم یک سایت مثل دیجیکالا برنامه نویسی میکنم الان به مشکل برخوردم
ببینین این کدهای MODEL اصلی منه

<?php


class Model
{

public static $db='';

function __construct()
{
$servername='localhost';
$username='myd';
$password='123';
$dbname='test1';
$farsi = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
self::$db=new PDO('mysql:Host='.$servername.';dbname='.$dbname,$ username,$password,$farsi);

}



public static function getoption(){


$select='SELECT * FROM tbl-settings';
$query=self::$db->prepare($select);
$query->execute();
$akhar=$query->fetchAll();
$new_option=[];

foreach ($akhar as $save){

$mysetting=$save['setting'];
$value=$save['value'];
$new_option[$mysetting]=$value;


}



return $new_option;




}


}



?>

داخل فایل index اصلی هم فراخوانی کردم اونو ببینین

<?php


require_once 'core/App.php';
require_once 'core/controller.php';
require_once 'core/config.php';
require_once 'core/model.php';

new App;



?>



متود داخل model اصلی رو از نوع استاتیک درست کردم بعدش میرم داخل صفحه مربوط به footer و کلاس Model رو فراخوانی میکنم خوب؟
ببینین اینجوری

<?php

$option=Model:: getoption();



?>
و حالا گفتم به جای شماره تلفن اون شماره تلفنی که داخل دیتابیس هست باید جایگزینش بشه و اینو نوشتم براش

<?= $option['tel']; ?>
ولی وقتی اجرا میگیرم شماره تلفن جایگزین نمیشه و این خطا رو میده

Notice: Undefined index: tel in C:\xampp\htdocs\dddd\footer.php on line 18

اسم تمام متغیر و کلاس هامم درسته و اسم جدول و ستون های دیتابیس هم درست نوشتم
اینم بگم وقتی خود صفحه footer.php رو به تنهایی توی مرور گر اجرا میکنم میگه کلاس Model پیدا نشد

ali_sed
پنج شنبه 30 خرداد 1398, 08:58 صبح
سلام

وقتی با مشکل مواجه می شوید مرحله به مرحله دیباگ کنید تا مشکل را پیدا کنید. همانطور که ملاحظه می کنید متغییر $option حاوی اندیس tel نمی باشد.

از printr_r و var_dump برای مشاهده محتوای متغییرها استفاده کنید تا مشکل را پیدا کنید.

با توجه به کدهای برنامه شما باید حداقل یک آبجکت از مدل بسازید تا constructor اجرا شود و $db مقدار دهی شود. وقتی شما از تابع استاتیک استفاده می کنید constructor اجرا نمی شود. اگر کد خود را بصورت زیر بنویسید نباید مشکلی پیش بیاید.


$model = new Model();
$option=Model::getoption();


هر چند بهتر است برای این کار از توابع استاتیک استفاده نکنید.

اگر همچنان مشکل داشتید کوئری خود را مستقیم روی دیتابیس ران کنید مثلا با استفاده از phpmyadmin و خروجی آن را بررسی کنید تا مطمئن شوید مشکل از کوئری نمی باشد.

جهت جلوگیری از ایجاد چند اتصال به دیتابیس باید دقت کنید که new PDO تنها یکبار اجرا می شود:


function __construct()
{
if(self::$db){
return;
}
$servername='localhost';
$username='myd';
$password='123';
$dbname='test1';
$farsi = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
self::$db=new PDO('mysql:Host='.$servername.';dbname='.$dbname,$ username,$password,$farsi);

}


با توجه به اینکه تنها یک نمونه از کلاس Model کافیست، میتوانید کلاس Model را بصورت singleton طراحی کنید. در مورد php singleton مطالعه کنید.

moeinkhm
پنج شنبه 30 خرداد 1398, 13:40 عصر
سلام
من print _r کردم ولی آرایه رو خالی نشون میده
ببین مستقیم صفحه footer.php اجرا میکنم میگه کلاس Model پیداا نشد

ali_sed
پنج شنبه 30 خرداد 1398, 14:38 عصر
ممکنه مشکل از نام جدول باشد بهتر است از بکارگیری علائم خاص در نام جدول پرهیز کنید.
کوئری را به زیر تغییر دهید یا نام جدول را اصلاح کنید مثلا از خط زیر استفاده کنید.



$select='SELECT * FROM `tbl-settings`';

plague
پنج شنبه 30 خرداد 1398, 17:37 عصر
احتمالا کوئریت مشکل داره که آرایه خالی برمیگردونه
توی مدلت بعد از اجرای کوئری اول چک کن ارور نداشته باشی .. اگه داشتی ارورر رو چاپ کن که ببینی مشکل از چیه