سایت خود را بسازید ، به روش saalek110

saalek110

Well-Known Member
ادامه ساخت فروم:

در ادامه باید ادیت پستها را اضافه کرد
و بالای صفحه هم لینک های چرخش در فروم را ایجاد کرد.
 
آخرین ویرایش:

saalek110

Well-Known Member
من تاریخ به شکل:

PHP:
$my_time=time();

را هم به پستها افزودم.

چون کار محاسباتی باهاش راحت تره.
در همین فروم مجیدآنلاین ، اجازه نمی دهد زودتر از 30 ثانیه ، پست بعدی را بزنیم. من فکر کنم این برای امنیت فروم مفید باشه. چون ممکنه هکر به جای پست زدن داره ارسالی های مختلف را برای نفوذ تست می کنه و محدودیت زمانی برایش گذاشتن خوبه. البته دلیل قانون 30 ثانیه مجیدآنلاین و نفع و فلسف اش را نمی دونم. نمیگم بده ، میگم علت این کار را نمی دانم.
 
آخرین ویرایش:

saalek110

Well-Known Member
سیستم فایلی فروم من:

Screenshot_16.png

اون پوشه حاوی فایلهایی است که همه فایلها استفاده می کنند ، مثل هدر صفحه. برای ساخت هدر ، اجزای لازم را درش قرار دهید و اول صفحات اون صفحه را اینکلود کنید.

در فایل new topic ، علاوه بر ساخت تاپیک ، پست هم ساخته میشه. چون کاربر هدفش از ساخت تاپیک ، پست زدن بوده دیگه.
در فایل topic هم پست در ادامه تاپیک زده میشه.
پس دو جا داره پست ساخته میشه و این کار درستی نیست. پس هردو را به فایل create post منتقل کردم. که در شکل بالا فایل create post دیده می شود.
اینکه چرا نباید دو جا یک کار انجام بشه ، چونکه اگر یک روز بخواهیم تغییر بدهیم ، ممکن است یادمان برود چند جا و کجا این کار انجام شده و چند تا فراموش بشه. پس باید هر کار فقط در یک جا انجام بشه.

برای افزودن پست و تاپیک یک insert باید بنویسید که کاری نداره و کدش را پستهای قبل گفتم. یک textarea می زاریم تا درش تایپ بشه و بعدش اونو به کدهای اکشن پاس می دهیم تا اینسرت بشه.

محتوای فعلی فایل create_post:

PHP:
<?php


 if ( ! isset(  $_SESSION["username"] )  )
{
$user="unknown";
}
  if (  isset(  $_SESSION["username"] )  )
{
    $user=$_SESSION["username"];
}



$my_time=time();
$tarikh=$the_date.$the_week.$hour;
//echo"<br>time= ".$my_time;

mysqli_set_charset($ccoonn, "utf8");

 $sql = "INSERT INTO `posts` (`post`,`topic`,`user`,`post_date`,`post_time`) VALUES ( '$post','$topic_number','$user','$tarikh','$my_time')";
    $result = mysqli_query($ccoonn ,$sql);
?>

روش استفاده از تاریخ شمسی ، کد کاملش این نیست ، اولا بالای صفحه باید فایلش اینکلود شود

PHP:
require_once "./../../folder_name/jdf.php";

و این کدها هم قبلا نوشته شده:

PHP:
           $hour= jdate('g:i A');      
           $the_week=jdate('l');
           $the_date=jdate('Y/m/d ');


روش استفاده از فایل create post:
PHP:
// $post  $topic_number ------------99
include"create_post.php";//---------99
منظورم این بوده که اول محتوای پست و شماره پست را بساز ، بعد فایل create_post را اینکلود کن.
در زبان php وقتی اینکلود می کنیم انگار کدهای اون فایل میایند جای اینکلود.

شاید یک نفر بیاید بگوید این کارها چیه تو باید تابع می ساختی برای این کار.بله اون شخص هم درست می گوید. هر کس دوست داره تابع بسازه ، هر کس هم دوست داره این طوری کار کنه. دو روش است دیگه.
 
آخرین ویرایش:

saalek110

Well-Known Member
ادیت پست:

ادیت پست یک textarea پر شده با پست قدیمی نیاز داره تا کاربر ببینه و تصحیح کنه ، باقیش مثل new post است.
HTML:
?>


<center>
 <form id='myform' action="<?php echo $_SERVER['PHP_SELF']; ?>"  method = 'POST'>
 

 post: <textarea id="mytextarea"  form="myform" name="post_text" rows="10" cols="70">
 <?php  echo $post;  ?>
 </textarea><br><br>

<?php
  echo'<input type="hidden" id="custId" name="number"  value='.$post_number.'>';
   ?>
 <center>
  <input type="submit"  name='act' form='myform' value="Submit"  style=" font-size:40px; height:90px; width:150px">   </center>


 
</form>
</center>

نگاه کنید به این قسمت:
PHP:
 echo $post;

داخل textarea محتوای پست echo شده.
نکته اش همین بود.

و همچنبن شماره پست به شکل مخفی به قسمت اکشن ارسال میشه تا پست ادیت شده در دیتابیس جانشین بشه ، پس update داریم نه insert
 

saalek110

Well-Known Member
قسمتهای مختلف فایل edit post:
اولش گرفتن شماره پست:
PHP:
 $post_number=test_input($_GET["number"]);

بعدش من کد اکشن را گذاشتم:
PHP:
 if(isset($_POST['act']))
 {// if action

        $post_number=test_input($_POST["number"]);  
        $post_text=test_input($_POST["post_text"]);


     mysqli_set_charset($ccoonn, "utf8");

     $sql = "UPDATE posts SET post='$post_text' WHERE number=$post_number";
     $result = mysqli_query($ccoonn ,$sql);

 }// if action

قبلش کدها پایین صفحه بود ، اجرا نمیشد آوردم اول صفحه ، دلیلش را نمی دونم. کلا ایرادی نداره این کدها اول صفحه باشند چون بعد زدن دکمه فرم اجرا میشن و اجرای خودکار ندارند.
 

saalek110

Well-Known Member
کد خواندن محتوای پست با استفاده از شماره پست:
PHP:
if(isset($post_number))
{
mysqli_set_charset($ccoonn, "utf8");

$sql = "SELECT * FROM posts WHERE  number=$post_number";
$result = mysqli_query($ccoonn ,$sql );

while($info = mysqli_fetch_array( $result ))
        {
             $post=$info['post'];
 
        }//while
}  // if post number was set

در پستهای قبلی گفتیم محتوای پست را انداتیم داخل textarea تا کاربر ادیت کند ،کد بالا محتوای پست را اول فراهم می کند و بعد باید کد textarea را قرار دهیم.

ممکنه صفحه edit post همین طوری بی عدد ، اجرا بشه ، منظورم بدون اضاقه کردن number ذر آدرس صفخه است، برای همین نوشتم اگر شماره پست موجود بود...کد خواندن شماره پست را هم در پست های قبلی نوشتم.تکرار می کنم:
PHP:
 $post_number=test_input($_GET["number"]);
 

saalek110

Well-Known Member
ترتیب چیدن قطعات بالا:

اول شماره پست را با اون تک خط بگیره
دوم کدهای اکشن که update می کنه پست را در دیتابیس.
سوم کدهای خوندن محتوای پست از دیتابیس.
چهارم: فرم حاوی پست برای ادیت.

بالای صفحه هم اینکلودهای صفحه شامل فایل کانکشن. چون کدهای کار با دیتابیس که بی فایل کانکشن کار نمی کنه.


HTML:
  require "./../../ccoonn.php";
 
آخرین ویرایش:

saalek110

Well-Known Member
تمام صفحات من 3 خط اولش اینه:

PHP:
<?php
session_start();
?>

چون سسیون باید قبل هر خروجی دادن اجرا بشه.

مخصوصا فایلهای new topic و create post که میان سسیون را بررسی می کنند تا اسم نویسنده پست را داخل دیتابیس بنویسند.
 
آخرین ویرایش:

saalek110

Well-Known Member
نکته :
کدهای بالا که فقط مخصوص ساخت فروم نیست....
هر جا ادیتی در کار باشه ، میشه از این کدها استفاده کرد.....

یا هر جا افزودن چیز جدیدی باشه با insert میشه کار کرد.

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

این کدها ، روش ارتباط با دیتابیس است. و برای هر سایتی لازم است. من قبلا کار با کدها را گفتم و الان تکرار و مرور است. برای همین گاهی کد کامل نمی ذارم. اون آموزش ها را اگر بلد باشید ، اینجا یک اشاره کافیه ولی باز من گاهی کد کامل نوشتم و شرح دوباره دادم.
 

saalek110

Well-Known Member
شهر ساخته شده:

houses.jpg

چون الان دیگه ایجاد پست و تاپیک را داریم و امکان ادیت پست هم داریم.


ولی هر کس می تونه همه پست ها را ادیت کنه.
هر کس می تونه هر تالاری را ببیند و در هر تالاری تاپیک و پست بزند.

نیاز به نظارت داریم حالا.
 

saalek110

Well-Known Member
چطوری جلوی ادیت پستهای دیگران را بگیریم؟

PHP:
     if ( $_SESSION["username"] == $user )
           echo'<a href="edit_post.php?number='.$post_number.'">'.$str.'</a>';
یعنی در جدول پست ها در دیتابیس ، ستون user را می خوانیم و با سسیون کاربر که داره تاپیک را می خونه مقایسه می کنیم.

Screenshot_۲۰۲۴-۰۹-۰۵_۱۲۵۴۳۴.jpg

در عکس بالا ، حمید داره تاپیک را نگاه می کنه ، و می بینید که لینک ادیت برای پست اول که متعلق به ادمین است برای حمید نشان داده نشده. وبرای پست خودش حق ادیت دارد.

ولی این کافی نیست، ممکنه حمید کمی سوادش بالا باشه و برود صفحه ادیت پست را با شماره پست یک نفر اجرا کنه، پس باید در فایل ادیت پست هم جلویش را بگیریم.
پس در فایل ادیت پست هم باید ستون $user را بخوانیم و اگر برابر با سسیون کاربر نبود بهش اجازه ادیت پست مردم را ندهیم.

کد زیر را در فایل edit post قرار دهید:


PHP:
     if ( $_SESSION["username"] != $user )
     die("sorry");

این طوری اگر پست مال شخص نباشه بقیه کدها دیگه اجرا نمیشه. $_SESSION["username"] که سسیون شخص است و موقع لوگین شخص ساختید و $user این جور بدست می آید که در صفحه edit post ستون user جدول پست ها را بوسیله شماره پست که در آدرس بالای صفحه داده شده ، می خوانیم.

یا این جوری بنویسید:


PHP:
if ( $_SESSION["username"] == $user )
{// Auth
 
 
    .....
        ....
        .....
        ....

یعنی کدهایی که نباید اجرا بشه ، را مشروط به بررسی هویت کاربر کنید.
کلمه Aut مخفف

Authentication است . به معنی احراز هویت. این کلمه هم در فروم phpbb به کار رفته و از اونجا در ذهنم مونده.

بهتره هر دو روش را با هم استفاده کنید تا اگر یکی اشتباهی از کار افتاد ، دیگری عمل کند.یعنی هم با die جاوی اجرای بقیه کدها را بگیرید و هم قسمتهای حساس را در کروشه auth بگذارید.
کلا بهتره موانع دفاعی چند تا باشد.
 
آخرین ویرایش:

saalek110

Well-Known Member
شمارنده تاپیک:

ستون count را اضافه می کنیم به جدول تاپیکها.

PHP:
//count:

 mysqli_set_charset($ccoonn, "utf8");

$sql = "SELECT * FROM topics WHERE number=$topic_number ";
  $result = mysqli_query($ccoonn ,$sql);
 
 
          while($info = mysqli_fetch_array( $result ))
           {
 $count=$info['count'];
           }
$count=$count+1;
 
     $sql = "UPDATE topics SET count='$count' WHERE number=$topic_number";
     $result = mysqli_query($ccoonn ,$sql);

شرح کد:
اول جدول تاپیکها را خوندیم
و ردیف مطابق با شماره تاپیک خود را پیدا کرده ایم
ستون count را خوانده ایم
یک واحد به اون عدد اضافه کرده ایم
و در جدول تاپیک ها اون لانه جدول را به روز کرده ایم.

Screenshot_17.png


در عکس بالا ، داخل هر پست ، تعداد بازدید تاپیک را نشان داده ام ولی معمولا در تالار ، جلوی اسم تاپیک تعداد بازدیدش را نشان می دهند.
در عکس زیر ، کنار اسم هر تاپیک نشان داده شده:

Screenshot_18.png
 
آخرین ویرایش:

saalek110

Well-Known Member
معماری فایلها:

Screenshot_19.png

در شکل بالا ، پوشه topic_parts را می بینید.
برای اینکه فایلهایی که در شکل می بینید شلوغ نشوند ، برای هر فایل پوشه ای می توانیم بسازیم و قطعات کد اون فایل را در اون پوشه بزاریم و خود فایل شامل include هایی به اون قطعات خواهد شد.

این روش ابداع خودم است تا فایل اصلی شلوغ نشود. مثلا همین کدهای کانت تاپیک که هفت ، هشت خط بود را خارج کردم و این طوری نوشتم:
PHP:
 // need $topic_number
 include"topic_parts/count.php";

یعنی نیاز به تاپیک نامبر داره این اینکلود.
اگر تابع بسازید ، تاپیک نامبر را باید به عنوان ورودی بدهید و فکر کنم کانکشن را هم باید به تابع بفرستید. ولی با اینکلود کردن انگار کدها می آیند جای کلمه include می نشینند و از کانکشن صفحه اصلی اتوماتیک استفاده می کنند.
البته تابع ساختن ، فکر کنم درست تر است ، چون کار کنترل شده تر است.
 

saalek110

Well-Known Member
صفحه آرایی:

اولا میشه برای table و td بیاییم css بنویسیم:
PHP:
echo"<table border=1>"; echo"<tr>";
  echo"<td style=' width:85%;  background-color: #dd7777;'>"; 
       echo"<center><h4>".$the_date.$the_week.$hour."</h4></center>";
       echo"</td>";
echo"<td style=' width:85%;  background-color: #9999cc;'>"; 

 echo"<center><h3>Hi</h3></center>";
       echo"</td>";
       echo"<td style=' width:85%;  background-color:#88cc88;'>"; 

 echo"<center><h3>Index</h3></center>";
       echo"</td>";
        echo"</tr>";
        echo"</table>";

در کد بالا برای td ها به شکا inline یعنی داخل خطی css نوشتم. درصد عرض صفحه و رنگ:

Screenshot_20.png
 

saalek110

Well-Known Member
و میشه بعدش یک div داخل td قرار دهیم. این طوری:
PHP:
 echo"<td style=' width:85%;  background-color: rgba(20,50,220,0.2);'>";
                 echo"<div id='category'>";
                   echo $name;
                   echo"</div'>";
                  echo"</td>";

و css را بالای صفحه برای category تعریف کنیم:
CSS:
#category
{
                 font-size:30px; 
                 text-align:center;
          width:85%;
                   border:7px solid #115555;
                   background-color: rgba(220,150,20,0.5);
          border-radius: 10px;         
          padding-bottom:30px;
          

}

دقت کنید به عرض صفحه که هم صفت td ست و هم صفت div داخلش.
البته در کدهای من table هم مثل td صفت عرض داشت. وقتی اون را 50 درصد کردم. نیمی از صفحه فقط اشغال شد:
Screenshot_1.png

چون table فقط یک td داره کاهش درصد عرض td فکر کنم بی فایده باشه. من عرضtd را 20 درصد کردم ولی فرقی نکرد.




آدرس اینه اگر دوست داشتید سر بزنید:
 
آخرین ویرایش:

saalek110

Well-Known Member
حالا عرض div را می کنم 20 درصد:

CSS:
#category
{
                 font-size:30px;  
                 text-align:center;
          width:20%;
                   border:7px solid #115555;
                   background-color: rgba(220,150,20,0.5);
          border-radius: 10px;          
          padding-bottom:30px;
}

Screenshot_2.png

می بینیم که درصد اشغال کم شده. اونجا که نوشته welcome اون کاتگوری است. پایینی ها فروم ها است که همون نزدیک 100 است.
یعنی شکل بالا ، حاصل table با عرض 50 درصد است و div کاتگوری 20 درصد و div فروم ها نزدیک 100 .
 

saalek110

Well-Known Member
در صفحه تاپیک دو ستون داریم. عرض ها را 80 درصد و 20 درصد دادم:

در صفحه کامپیوترم:

Screenshot_3.png

در تبلتم:

Screenshot_۲۰۲۴-۰۹-۰۶_۱۷۱۴۲۱.jpg

شاید ((ستون پست)) به ((ستون نویسنده)) گفته ((مهربون تر بشین ما هم جا بشیم)). البته این حدس من است. من فکر می کنم چون نویسنده فقط یک کلمه بوده در حقش اجحاف شده.

آیا میشه جلوی این اجحاف را گرفت:
 
آخرین ویرایش:

saalek110

Well-Known Member
من padding راست و چپ دادم به اسم Admin ،

CSS:
#user
{
                 font-size:18px; 
                 text-align:center;
                   width:90%;
     background-color: rgba(180,120,100,1);
          border-radius: 8px;         
          padding-left:20px;
           padding-right:20px;
           border:3px solid #995555; 
}

در تبلتم این طوری شد:

Screenshot_۲۰۲۴-۰۹-۰۶_۱۷۲۳۱۹.jpg

به جای padding اگر از margin استفاده کنیم:
CSS:
#user
{
                 font-size:18px;  
                 text-align:center;
                   width:90%;
     background-color: rgba(180,120,100,1);
          border-radius: 8px;          
          margin-left:20px;
           margin-right:20px;
           border:3px solid #995555;  
}
 

پیوست ها

  • Screenshot_۲۰۲۴-۰۹-۰۶_۱۷۲۸۰۳.jpg
    Screenshot_۲۰۲۴-۰۹-۰۶_۱۷۲۸۰۳.jpg
    104.7 کیلوبایت · بازدیدها: 0
آخرین ویرایش:

saalek110

Well-Known Member
بعدا شاید باز صفحه آرایی بحث کردم.
فعلا چیزهای مهم تری فروم من نیاز داره .

این پست را ببینید:

Screenshot_۲۰۲۴-۰۹-۰۶_۱۷۳۷۵۴.jpg

چرا از کادر زده بیرون؟
شاید چون متن ، یک تکه بوده ، زده بیرون.

ولی برای این لینکهای دراز باید کاری کرد.

ثانیا باید لینک میشده به اون سایت ولی نشده.

راه حل ساده تر اینکه که کاربر دکمه لینک را بزنه و داخلش لینک بسازه.
ولی راه حل دوم اینه که خود فروم تشخیص بده یک لینک است و مدیریتش کنه. فروم مجیدآنلاین هر دو روش را داره. با رگولار اکسپرژن فکر کنم باید اینها را پیدا کرد. تاپیکی به این نام من دارم و رگولار اکسپرژن را بحث کرده ام.


 
آخرین ویرایش:

جدیدترین ارسال ها

بالا