• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با کلاس
#1
سلام،
من تازه میخوام پا بذارم تو دنیای شی گرایی،یه کلاسک(همون کلاس کوچک) نوشتم،وقتی یه شی ازش میسازم و تابع addNews رو اجرا میکنم،خطا میده،حالمو گرفته اول کاری.
اینم کد:
کد پی‌اچ‌پی:
<?php
class newsShow{
    var 
$hostName='127.0.0.1';
    var 
$hostUserName='root';
    var 
$hostPassword='';
    var 
$DBName='mycms';
    var 
$DBLink;
    function 
__construct(){
        if(
$this->DBLink=mysql_connect($this->hostName,$this->hostUserName,$this->hostPassword) and mysql_select_db($this->DBName))
            return 
$this->DBLink;
            return 
false;
        }
    function 
__set($name,$val){
            
$this->$name=$val;
        }
    function 
__get($name){
            return 
$this->$name;
        }
    function 
__destruct(){mysql_close($this->BDLink);}
    function 
addNews($title,$content){
            
$sql="insert into news(title,content) values(\"$title\",\"$content\")";
            if(
mysql_query($sql)){
            echo 
"ذخیره شد";
            return 
true;}
            echo 
"ذخیره نشد!!";
            return 
false;
        }
}
?>
اینجوری هم شی میسازم:
کد پی‌اچ‌پی:
<?php
include('inc/newsShow.class.php');
if(isset(
$_POST['title'])){
    
$title=$_POST['title'];
    
$content=$_POST['content'];
    
$a=new newsShow();
    
$a->addNews($title,$content);
}else{
//some codes
}
?>
اینم خطاهاش:
کد:
Notice: Undefined property: newsShow::$BDLink in D:\wamp\www\MyCMS\inc\newsShow.class.php on line 17

Warning: mysql_close(): supplied argument is not a valid MySQL-Link resource in D:\wamp\www\MyCMS\inc\newsShow.class.php on line 19

اللهم صل علی محمد و آل محمد و عجل فرجهم

افلاطون را گفتند چرا هرگز غمگین نمیشوی؟
گفت :دل برآنچه نمی ماند،نمی بندم.
  پاسخ
تشکر شده توسط :
#2
خطا هایی که در کلاست وجود داره و فعلاً نشون داده نمیشه تا اون دو خطای رخ داده حل بشه رو من برات حل می کنم ولی بهش نگاه کن و ببین چرا اینطوری شده بعد اگر سوالی داشتی بپرس دوست من Tongue :
کد پی‌اچ‌پی:
<?php
class newsShow{
    private 
$hostname;
    private 
$username;
    private 
$password;
private 
$connect;

    function 
__construct($hostname$username$password){
$this->hostname $hostname;
$this->username $username;
$this->password $password;
}

protected function 
to_mysql() {
$this->connect connect_db$this->hostname$this->username$this->password );
mysql_select_db'mycms'$this->connect );
mysql_query"SET NAMES 'utf8'" );
return 
$connect;
}
//nemidonam chera az in 2 method estefade kardi
    /*function __set($name,$val){
            $this->$name=$val;
        }
    function __get($name){
            return $this->$name;
        }*/

    
function __destruct(){
mysql_close($this->connect);
}

    function 
addNews($title$content){

//inja khata haro moshakhas mikoni bad dar else{} agar khataee vojood nadasht dastoore paeeno vared mikoni
            
mysql_query"INSERT INTO `news`( `title`, `content` ) VALUES('" $title "', '" $content "')"$this->to_mysql() );
        }
}
?>

الآن فرقش این شد که باید کمی در شیء ساختن متفاوت عمل کنیم:
کد پی‌اچ‌پی:
<?php
include('inc/newsShow.class.php');
if(isset(
$_POST['title'])){
    
$title=$_POST['title'];
    
$content=$_POST['content'];
    
$a=new newsShow'127.0.0.1''root''' );
    
$a->addNews($title,$content);
}else{
//some codes
}
?>

این رو چک کن ببین اگر خطا داد دوباره خطاشو برامون بنویس.
غایب
  پاسخ
تشکر شده توسط : Goback
#3
(۱۳۹۰ فروردین ۰۸, ۰۳:۳۵ ق.ظ)cyletech نوشته: خطا هایی که در کلاست وجود داره و فعلاً نشون داده نمیشه تا اون دو خطای رخ داده حل بشه رو من برات حل می کنم ولی بهش نگاه کن و ببین چرا اینطوری شده بعد اگر سوالی داشتی بپرس دوست من Tongue :
کد پی‌اچ‌پی:
<?php
class newsShow{
    private 
$hostname;
    private 
$username;
    private 
$password;
private 
$connect;

    function 
__construct($hostname$username$password){
$this->hostname $hostname;
$this->username $username;
$this->password $password;
}

protected function 
to_mysql() {
$this->connect connect_db$this->hostname$this->username$this->password );
mysql_select_db'mycms'$this->connect );
mysql_query"SET NAMES 'utf8'" );
return 
$connect;
}
//nemidonam chera az in 2 method estefade kardi
    /*function __set($name,$val){
            $this->$name=$val;
        }
    function __get($name){
            return $this->$name;
        }*/

    
function __destruct(){
mysql_close($this->connect);
}

    function 
addNews($title$content){

//inja khata haro moshakhas mikoni bad dar else{} agar khataee vojood nadasht dastoore paeeno vared mikoni
            
mysql_query"INSERT INTO `news`( `title`, `content` ) VALUES('" $title "', '" $content "')"$this->to_mysql() );
        }
}
?>

الآن فرقش این شد که باید کمی در شیء ساختن متفاوت عمل کنیم:
کد پی‌اچ‌پی:
<?php
include('inc/newsShow.class.php');
if(isset(
$_POST['title'])){
    
$title=$_POST['title'];
    
$content=$_POST['content'];
    
$a=new newsShow'127.0.0.1''root''' );
    
$a->addNews($title,$content);
}else{
//some codes
}
?>

این رو چک کن ببین اگر خطا داد دوباره خطاشو برامون بنویس.
ممنون علیرضا جان،کار کرد.
فقط چندتا سوال:
1-چرا ما تو تابع سازنده همین اول کار با مقادیر پیشفرضمون به بانک وصل نمیشیم؟اصلا آرگومان رو میتونیم اول از خود پروپرتی ها بدیم یا نه؟البته با مقدار پیشفرض.
2-اینارو Private و protected نکنیم،نفوذا مشکلی پیش نمیاد؟
3-میگم اخطارها و پیامهای رو همین داخل کلاس تعیین کنم یا بیرون از کلاس با چک برگشتی توابع؟مثلا دخیره شد یا نشد.
4-این سازنده فرقش با تابع همنام کلاس و اتولود چیه؟همشون یه کار انجام میدن دیگه،درسته؟
5-این:
کد پی‌اچ‌پی:
mysql_query"SET NAMES 'utf8'" ); 
به تنهایی کار نمیکنه،درسته؟یعنی باید تو ساختار دیتابیس هم یونیکد تعریف بشه ؟
بعدش فرقش با این چیه:
کد پی‌اچ‌پی:
SET CHARACTER SET utf8
تشکر

اللهم صل علی محمد و آل محمد و عجل فرجهم

افلاطون را گفتند چرا هرگز غمگین نمیشوی؟
گفت :دل برآنچه نمی ماند،نمی بندم.
  پاسخ
تشکر شده توسط :
#4
نقل قول:چرا ما تو تابع سازنده همین اول کار با مقادیر پیشفرضمون به بانک وصل نمیشیم؟اصلا آرگومان رو میتونیم اول از خود پروپرتی ها بدیم یا نه؟البته با مقدار پیشفرض.
برای اتصال به پایگاه داده راه زیاده ، حتی شما می تونید برای هر دفعه که میخواهید کوئری به دست بگیرید اول به پایگاه داده وصل بشید ... ولی دلیل اینکه من چرا این کارو کردم هم شاید مشخص باشه ... من اینکارو کردم تا بطور خودکار هیچوقت به پایگاه داده وصل نشه ، بنظر خودم اینطوری که دستی خودم وارد بشم ایمن تره Cool

نقل قول:اینارو Private و protected نکنیم،نفوذا مشکلی پیش نمیاد؟
وقتی در کلاس از private استفاده میشه بدین معنیه که فقط کلاس مشخص شده می تونه استفاده کنه حتی مشتق هاش دسترسی بهش ندارن. زمانی هم که از protected استفاده می کنیم فقط کلاس مشخص شده و مشتقاتش می تونن ازش استفاده کنن. ما در شی گرایی از اینا باید حتماً استفاده کنیم با کلاسمون ایمن تر باشه. اگر شما public بگیرید و در هرجا بشه ازشون استفاده کرد خب مسلماً امنیتش کمه. ولی یه پیشنهاد می کنم. هر تابعی که فقط خودش باهاش کار می کنه و از جایی قرار نیست فراخوانی بشه ، private بگذار اما زمانی هم که ممکنه یکی دیگه از اعضای کلاس باهاش کار داشته باشه و از بیرون فراخوانی لازم نباشه protected بگذار.

نقل قول:میگم اخطارها و پیامهای رو همین داخل کلاس تعیین کنم یا بیرون از کلاس با چک برگشتی توابع؟مثلا دخیره شد یا نشد.
یک جا که برات در کدی که اصلاح کردم نوشتم ، اونجا مشخص کنی بهتره. البته می تونی خیلی تغییراتی بدی. مثلاً در تابع دیگه ای خطا ها رو تعیین کنی. مثلاً یک تابع دیگه مثل زیر داشته باشی:
کد پی‌اچ‌پی:
public function TakeErrors() {
//if va elseif ha inja
else {
$this->addNews
}

حالا برای صفحه ای که میخوای از کلاست استفاده کنی اینطوری می نویسی:
کد پی‌اچ‌پی:
<?php
include('inc/newsShow.class.php');
    
$a=new newsShow'127.0.0.1''root''' );
    
$a->TakeErrors();
?>
با اینکار خطا ها هم جدا شدند. حالا اول به تابع خطا ها میره و اگر خطایی وجود داشت نمایش میده در غیر اینصورت در else میره به تابع دیگه ای و دستورات اون رو اجرا می کنه. توجه داشته باش که: حتماً زمانی که خطا ها مشخص میشه حتماً از return FALSE استفاده کن تا با خطا های بعدی قاطی نشه و وقتی یک خطا داد تا اون حل نشه بعدی نمایش داده نشه! مثل زیر:
کد پی‌اچ‌پی:
$x 2;
if( 
$x != ) {
echo( 
'khata' );
return 
FALSE;

نقل قول:این سازنده فرقش با تابع همنام کلاس و اتولود چیه؟همشون یه کار انجام میدن دیگه،درسته؟
منظورت متد ها هست؟ خب هر کدوم که یک کاری رو انجام نمیدن ولی یک چیز مشترکی که دارن اینه که همشون در نهایت به خود شخص class بر می گردن و فرقش با باقی توابع که ما تعریف می کنه در اینه که خودکار متصل میشن به کلاسشون. اما متد autoload همونطور که از اسمش بر میاد بصورت خودکار هرچی که داخلش باشه برای اون کلاس بارگذاری می کنه اما متد سازنده یا construct همونطور که در کدی که اصلاح کردم برات دیدی به کلاس بر می گرده و مقداری برای expression کلاس در نظر میگیره در صورتی که اصلاً کلاس expression نمیگیره! و از بیرون ما بهش مقدار دادیم. پس بطور خودکار انجام نشده. متوجه فرقشون شدی دوست من؟ Blush
نقل قول:به تنهایی کار نمیکنه،درسته؟یعنی باید تو ساختار دیتابیس هم یونیکد تعریف بشه ؟
خودم اون بخش رو برات اضافه کردم که با فارسی ذخیره شدن در پایگاه داده مشکلی نداشته باشی. راه هست که بشه کاراکتر های utf8 یا بهتره بگم فارسی در پایگاه داده ذخیره بشه اما من این روش ساده و بی نقص رو انتخاب کردم. و اما فرقش. یه نگاهی به این پاسخ بنداز. کامل توضیح داده فرقش رو. Heart
غایب
  پاسخ
تشکر شده توسط : Goback
#5
واقعا ممنون علیرضا جان،کلی کمک حالم شدی.

اللهم صل علی محمد و آل محمد و عجل فرجهم

افلاطون را گفتند چرا هرگز غمگین نمیشوی؟
گفت :دل برآنچه نمی ماند،نمی بندم.
  پاسخ
تشکر شده توسط : cyletech
#6
علیرضا جان در مورد اینکه private یا public یا protected برای امنیت هست یه مقدار طرز فکرت رو عوض کن. چون اینها فقط برای این هستن که توسعه دهنده اشتباه نکنه
  پاسخ
تشکر شده توسط : cyletech Goback
#7
(۱۳۹۰ فروردین ۱۱, ۱۲:۵۲ ب.ظ)admin نوشته: علیرضا جان در مورد اینکه private یا public یا protected برای امنیت هست یه مقدار طرز فکرت رو عوض کن. چون اینها فقط برای این هستن که توسعه دهنده اشتباه نکنه

خب وحید جان،یه کم توضیح میدادی ،بدونیم جریانو.

اللهم صل علی محمد و آل محمد و عجل فرجهم

افلاطون را گفتند چرا هرگز غمگین نمیشوی؟
گفت :دل برآنچه نمی ماند،نمی بندم.
  پاسخ
تشکر شده توسط :
#8
developer اگر بخواد می تونه کلاس اصلی رو تغییر بده.
پس اینجا امنیت معنی نمیده
  پاسخ
تشکر شده توسط : Goback
#9
(۱۳۹۰ فروردین ۱۱, ۱۲:۵۲ ب.ظ)admin نوشته: علیرضا جان در مورد اینکه private یا public یا protected برای امنیت هست یه مقدار طرز فکرت رو عوض کن. چون اینها فقط برای این هستن که توسعه دهنده اشتباه نکنه

منظورت از توسعه دهنده کیه؟ منم که کدم رو نوشتم یا توسعه دهنده واقعی؟ و اینکه اگر اینها فرقی با هم ندارن و فقط برای جلوگیری از اشتباه توسعه دهنده هست پس موقع استفاده هم فرقی با هم نباید داشته باشند که اینطور نیست!
غایب
  پاسخ
تشکر شده توسط : Goback
#10
ببینید مثلا
من توسعه دهنده هستم یکی دیگه هم داخل گروه هست یکی دیگه هم دوباره داخل گروه هست. بعد این فاز وارد یک فاز دیگه برای یک گروه دیگه میشه.
اینجا توی منطق کلاس من یک متدی رو من فقط برای این کلاس دارم استفاده می کنم و اصلا لزومی نمی بینم که فرد دیگه که می خواد از این کلاس ارث بری کنه قرار نیست ازش استفاده کنه پس private می زارم. یا مثلا فقط کسی که می خواد ارثبری کنه بتونه کلاس رو override کنه و یا اینکه ازش استفاده کنه ولی داخل آبجکت نه.
البته مزایای دیگه ای هم داره و اونم اینه کسی که می خواد از کلاس من ارثبری کنه دیگه کاری به private ها نداره. اما من می تونم برم داخل کلاس اصلی و private رو به protected تغییر بدم و یا خیلی کارهای دیگه می تونم انجام بدم. اینجا اصلا امنیت معنی نمیده
به نظر شما چه امنیتی رو ایجاد می کنه؟
  پاسخ
تشکر شده توسط : Goback


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان