وب (PHP و Laravel)

برنامه نویسی وب شامل PHP و Laravel است.

درس بعدی ||||| درس قبلی

در این آموزش قصد دارم با استفاده از ساختار شی گرایی صفحه وبی برای ثبت اطلاعات کاربر در MySQL ایجاد کنیم بطوریکه بتوان از فرم های مختلف در وب و اندروید اطلاعات را در آن ذخیره کرد. برای این منظور ابتدا یکسری توضیحات در مورد ساختار شی گرایی داده می شود:

تعریف کلاس: کلاس با استفاده از کلمه کلیدی class تعریف می شود و محتویات کلاس که شامل خصوصیات و متدها هستند در داخل آکولاد قرار می گیرند:

<?php
class DBConncect {
  // code goes here...
}
?>

تعریف سازنده (Constructor):

یک سازنده به شما امکان می دهد تا خصوصیات یک شی را در هنگام ایجاد شی آغاز کنید. اگر یک تابع __construction () ایجاد کنید ، PHP هنگام ایجاد یک شی از یک کلاس به طور خودکار این تابع را فراخوانی می کند. توجه داشته باشید که عملکرد سازه با دو زیر خط (__) شروع می شود! مثال:

function __construct()
	{
		
	}

تابع prepare و bind_param
تابع prepare برای اجرای همان عبارات SQL (یا مشابه) به طور مکرر با بازده بالا استفاده می شود.

تابع prepare اساساً مانند این عمل می کنند:

آماده سازی: یک الگوی دستور SQL ایجاد شده و به پایگاه داده ارسال می شود. مقادیر با برچسب ؟ مشخص می شوند . مثال:

INSERT INTO MyGuests VALUES(?, ?, ?)


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

دستورات آماده شده زمان تجزیه را کاهش می دهند زیرا آماده سازی روی پرس و جو فقط یک بار انجام می شود (اگرچه دستور چندین بار اجرا می شود)
پارامترهای Bound پهنای باند را به سرور کاهش می دهند زیرا شما باید هر بار فقط پارامترها را ارسال کنید ، و نه کل پرس و جو
دستورات آماده شده در برابر تزریق SQL بسیار مفید هستند ، زیرا از مقادیر پارامترهایی که بعداً با استفاده از پروتکل دیگری منتقل می شوند ، نیازی به درست فرار نیست. اگر الگوی بیانیه اصلی از ورودی خارجی مشتق نشده باشد ، تزریق SQL امکان پذیر نیست.

ابتدا بانک اطلاعاتی با نام user ایجاد می کنیم. سپس در آن یک جدول با مشخصات زیر می سازیم:

پس از معرفی مطالب گفته شده قصد داریم برنامه را ایجاد کنیم. ابتدا یک پوشه با نام Android ایجاد می کنیم. در آن یک پوشه دیگر به نام includes می سازیم. در پوشه includes فایل constansts.php را می سازیم. کدهای اولیه مقداردهی به پایگاه داده را در آن قرار می دهیم.


<?php
	define('DB_NAME', 'user');
	define('DB_USER', 'root');
	define('DB_PASSWORD', '');
	define('DB_HOST', '127.0.0.1');
?>

جهت برقرار ارتباط با بانک اطلاعاتی ، یک فایل دیگر در پوشه includes با نام DBConnector.php ایجاد می کنیم. محتوی این کلاس یک خصوصیت با نام con است که به صورت زیر تعریف می شود:

private $con;

سازنده نیز به صورت زیر تعریف می شود:

function __construct()
	{
		
	}

یک متد به نام connect جهت اتصال با بانک اطلاعاتی ساخته می شود. جهت اتصال به مقادیر موجود در فایل constant.php نیاز است. برای این منظور از دستور inclue_once استفاده می شود:

include_once dirname(__FILE__).'/constant.php';

سپس با تابع mysqli درخواست اتصال زده می شود:

$this->con=new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);

کد کامل کلاس DBConnect به صورت زیر است:

<?php

class DBConnect
{
	private $con;
	
	function __construct()
	{
		
	}

	function connect(){
		include_once dirname(__FILE__).'/constant.php';
		
		$this->con=new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);

		if (mysqli_connect_errno()) {
			echo "failed to connect";
		}
		return $this->con;
	}


}
?>

یک فایل دیگر در پوشه ی includes با نام DBOperations.php ایجاد می کنیم. در این فایل قصد داریم متدی قرار دهیم که رکورد جدید به جدول اضافه می کند. ابتدا در سازنده کلاس به بانک اطلاعاتی متصل می شویم:

private $con;
function __construct(){

    require_once dirname(__FILE__).'/DBConnect.php';
    $db=new DBConnect();
    $this->con=$db->connect();
}

متد createUser جهت اضافه کردن یک رکورد جدید به کلاس DBOperations اضافه می شود. برای این منظور از طریق سه آرگومان سه مقدار دریافت می شود. ابتدا پسورد رمزگذاری می شود. سپس به کمک تابع prepare به صورت زیر دستور SQL وارد می شود:

$password=md5($password);
$stmt=$this->con->prepare("INSERT INTO `tbl_user`(`id`,`username`,`password`,`email`)values(null,?,?,?)");

در مرحله بعد پارامترها به کمک تابع bind_param داده می شود. چون سه مقدار باید قرار بگیرند(بجای هر علامت سوال) بنابراین sss تعیین می شود و آرگومان ها به عنوان نام کاربری رمز عبور و ایمیل مشخص می شوند:

$stmt->bind_param("sss",$username,$password,$email);

در انتها باید رشته SQL اجرا شود. چنانچه مشکلی نداشت متد createUser مقدار true و در غیراینصورت مقدار false را برمی گرداند:

if ($stmt->execute()) {
	
	return true;

}else
{
	return false;
}

کل کد مربوط به فایل DBOperations به صورت زیر است:

<?php
	
	/**
	 * 
	 */
	class DbOperations{

		private $con;
		function __construct(){

			require_once dirname(__FILE__).'/DBConnect.php';
			$db=new DBConnect();
			$this->con=$db->connect();
		}

		function createUser($username,$password,$email){
			$password=md5($password);
			$stmt=$this->con->prepare("INSERT INTO `tbl_user`(`id`,`username`,`password`,`email`)values(null,?,?,?)");
			$stmt->bind_param("sss",$username,$password,$email);
			if ($stmt->execute()) {
				
				return true;

			}else
			{
				return false;
			}

		}
	}

?>

حالا یک پوشه به نام v1 در پوشه ی Android می سازیم و در آن فایل registerUser.php را قرار می دهیم. ابتدا به محتویات DBOperations باید دسترسی داشته باشیم تا از طریق آن رکورد جدید به جدول اضافه شود:

include_once '../includes/DbOperations.php';

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

$response=array();

ابتدا بررسی می شود اطلاعات با متد POST باشد. سپس نام پسورد و ایمیل بدرستی وارد شده باشد.

if ($_SERVER['REQUEST_METHOD']=='POST') {
	if (isset($_POST['username'])
		and isset($_POST['password'])
		and isset($_POST['email'])) {

اتصال برقرار می شود و متد createUser فراخوانی می شود در صورتیکه مشکلی پیش نیامده باشد مقدار error false می شود و مقدار message پیغام user registered successfully می باشد:

$db=new DbOperations();
if ($db->createUser($_POST['username'],$_POST['password'],$_POST['email'])) {
	$response['error']=false;
	$response['message']="user registered successfully";
}

در انتها محتویات آرایه ی respone به صورتJSON توسط تابع json_encode نشان داده می شود:

echo json_encode($response);

کد کامل فایل registerUser.php بصورت زیر می باشد:

<?php
	
	include_once '../includes/DbOperations.php';
	$response=array();
	if ($_SERVER['REQUEST_METHOD']=='POST') {
		if (isset($_POST['username'])
			and isset($_POST['password'])
			and isset($_POST['email'])) {
			
			$db=new DbOperations();
			if ($db->createUser($_POST['username'],$_POST['password'],$_POST['email'])) {
				$response['error']=false;
				$response['message']="user registered successfully";
			}else{
				$response['error']=true;
				$response['message']="Undefined error ";
			}
		}else{
			$response['error']=true;
			$response['message']="Requied fields are invalid";
		}
	}else{
		$response['error']=true;
		$response['message']="Invalid request method";
	}
	echo json_encode($response);
?>

جهت تست خروجی از نرم افزار Postman استفاده می شود که تنظیمات را بصورت شکل زیر در آن تنظیم می کنیم و خروجی در صورتیکه خطایی نباشد بصورت شکل نشان داده می شود:

درس بعدی ||||| درس قبلی

یکی دیگر از کاربردهای نشست ها ساخت سبد خرید می باشد. علت این است که برای ساخت سبد خرید باید اطلاعات مربوط به سبد خرید یعنی کالاهای سفارش داده شده، تعداد هر کالا و قیمت هر کالا و قیمت کل در تمام صفحات وب قابل دسترس باشند. برای این مننظور اطلاعات جدول shopping را به صورت زیر در نظر می گیریم.

اطلاعات جدول shopping

همانطوریکه مشاهده می شود لیست محصولات شامل کد محصول، نام محصول و قیمت محصول می باشد. قصد داریم صفحه وبی بسازیم که محصولات را در یک جدول نمایش دهد و یک ستون اضافی در جدول برای سفارش محصول در نظر بگیرد. برای این منظور کد صفحه وب sh.php به صورت زیر نوشته می شود:

<body>
    <div align="center">
        <table border="1">
            <tr>
                <th>Username</th>
                <th>Password</th>
                <th>Role</th>
                <th>Add to Cart</th>
            </tr>

<?php
    $db=mysqli_connect("127.0.0.1","root","","usrs");
    if(!$db){
        echo mysqli_error($db);
    }else{
        echo "connect";
    }
    $query="SELECT * FROM `shopping`" ;

    $r=mysqli_query($db,$query);

    if($r)
    {
       $num = mysqli_num_rows($r);
           echo $num;
        for($i=0;$i<$num;$i++)
        {
               $row=mysqli_fetch_row($r);
               echo "<tr>";
               echo "<td>".$row[0]."</td>";
               echo "<td>".$row[1]."</td>";
               echo "<td>".$row[2]."</td>";
               echo "<td><a href='add2cart.php?card=".$row[1]."'>add</a></td>";
               
               echo "</tr>";
        }
    }
 ?>

   </table>
    </div>
</body>

خروجی این صفحه به صورت زیر است:

خروجی صفحه وب sh.php

در کد فوق مطلبی که مهم است لینک موجود برای هر کالا در ستون Add to Cart است. این لینک به همراه انتقال به صفحه add2cart.php به کمک متد GET نام هر آیتم را نیز ارسال می کند. کد به صورت زیر آمده است:

echo "<td><a href='add2cart.php?card=".$row[1]."'>add</a></td>";

پس از کلیک بر روی دکمه add در هریک از محصولات به صفحه add2cart.php منتقل می شویم. ابتدا محصول درخواست شده در متغیر new قرار می گیرد.

$new=$_GET['card'];

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

if(!isset($_SESSION['card'])){
        $_SESSION['card']=array();
        
        $_SESSION['total_price']='0.00';
    }

اگر محصول انتخاب شده قبلا در سبد بود یکی به آن اضافه می شود و در غیر اینصورت مقدار آن یک می شود.

if(isset($_SESSION['card'][$new])){
        $_SESSION['card'][$new]++;
    }
    else{
        $_SESSION['card'][$new]=1;
    }

در انتها باید مجموع قیمت ها را محاسبه کرد. برای این منظور از تابع calculate_price استفاده می شود. کد کامل صفحه add2cart.php بصورت زیر است:

<?php
include('f.php');
session_start();

    $new=$_GET['card'];
    //echo $new;
    if(!isset($_SESSION['card'])){
        $_SESSION['card']=array();
        
        $_SESSION['total_price']='0.00';
    }
    
    if(isset($_SESSION['card'][$new])){
        $_SESSION['card'][$new]++;
    }
    else{
        $_SESSION['card'][$new]=1;
    }
    $_SESSION['price']=calculate_price($_SESSION['card']);
    echo "total price is: ".$_SESSION['price'];

?>

تابع ()calculate_price در فایل f.php‌قرار دارد. کد فایل f.php بصورت زیر است.

<?php
function calculate_price($card){
    $price=0;
    $db=mysqli_connect("127.0.0.1","root","","usrs");
    if(!$db){
        echo mysqli_error($db);
    }else{
        //echo "connect";
    }
    foreach($card as $name=>$qty){
        echo $name." ".$qty;
        $query="SELECT price FROM `shopping` where product_name='$name'" ;
        $r=mysqli_query($db,$query);
        if($r){
            $item=$row=mysqli_fetch_row($r);
            $item_price=$item[0];
            $price+=$item_price*$qty;
            //echo $price;
        }
        echo  "<br>";
    }
    return $price;
}
?>

همانطوریکه مشاهده می شود لیست قیمت ها و تعداد ضرب می شوند و متغیر price بعنوان خروجی تابع می باشد.

$price+=$item_price*$qty;

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

خروجی سبد خرید

در هر سایتی احراز هویت کاربران یکی از مباحث اولیه در امنیت سایت می باشد. در این بحث قصد داریم یک فرم لاگین برای کاربران ایجاد کنیم. چنانچه کاربر نام کاربری و رمز عبور را مطابق آنچه در بانک اطلاعاتی ذخیره شد وارد کرد و درست بود یک نشست ایجاد شود و به صفحه ی admin.php هدایت شود. اما اگر اشتباه وارد کرد مجدد به صفحه login.php منتقل می شود. چنانچه کاربر بخواهد از طریق آدرس محتوای صفحه ی admin.php را ببیند باید ابتدا بررسی شود آیا نشست ایجاد شده یا خیر. اگر نشست ایجاد شده بود کاربر می تواند محتویات صفحه ی admin.php را ببیند در غیر اینصورت خیر. باید برگردد به صفحه ی login.php.

ابتدا یک بانک اطلاعاتی بنام usrs ایجاد می کنیم و در آن یک جدول بنام tbl_user ایجاد می کنیم. این جدول دارای سه فیلد username، pas و role است. چند رکورد به آن اضافه می کنیم به صورت شکل زیر:

محتوای جدول

جهت ایجاد فرم صفحه ی لاگین صفحه ی loginform.php بصورت زیر ایجاد می شود:

<body>
    <form method="POST" action="login.php">
        <table align="center" 
        style="background-color: burlywood;">
        <tr>
            <td>User Name:</td>
            <td><input type="text" name="uname"></td>
        </tr>
        <tr>
            <td>Password:</td>
            <td><input type="text" name="pas"></td>
        </tr>
        <tr>
            
            <td><input type="submit" value="LOGIN"></td>
        </tr>
        </table>
    </form>
</body>

با اجرای فرم لاگین به صورت زیر ساخته می شود:

خروجی صفحه loginform.php

سپس با کلیک بر دکمه ی login صفحه ی login.php نشان داده می شود. ابتدا تابع نشست ایجاد می شود. سپس مقادیر وارد شده در کادرهای متنی دریافت می شود. کد آنها به صورت زیر است:

<?php
session_start();

$uname=$_POST['uname'];
$pas=$_POST['pas'];

سپس باید به بانک اطلاعاتی متصل شویم :

$db=mysqli_connect("127.0.0.1","root","","usrs");
if(!$db){
    echo "Error!";
    exit;
}
//echo "Connected!";

حال بررسی می شود مقادیری که در کادرهای متنی وارد شد در جدول tbl_user وجود دارد یا خیر. تعداد رکوردهای یافته شده متناسب با نام کاربری و رمز عبور وارد شده در متغیر num ذخیره می شود.

$query="select * from tbl_user where username='" . 
        $uname . "' and pas='" . $pas . "'";
$result=mysqli_query($db,$query);
if($result){
    //echo "Yes";
    $num=mysqli_num_rows($result);
    //echo $num;

چنانچه مقدار num بیشتر از ۰ بود نشست باید ایجاد شود و به صفحه ی admin.php منتقل می شود.

if($num>0){
        $row=mysqli_fetch_row($result);
        if($row[2]=="admin"){
            //echo $row[2];
            $_SESSION['admin']=$uname;
            header("Location:admin.php");
        }else{
            header("Location:login_form.htm");
            //echo "You are not administrator!";
        }

چنانچه مقدار num صفر بود به صفحه ی loginform.php‌ منتقل می شود:

else{
        header("Location:login_form.htm");
    }

کد کامل صفحه ی login.php در زیر آمده است:

<?php
session_start();

$uname=$_POST['uname'];
$pas=$_POST['pas'];
$db=mysqli_connect("127.0.0.1","root","","usrs");
if(!$db){
    echo "Error!";
    exit;
}
//echo "Connected!";
$query="select * from tbl_user where username='" . 
        $uname . "' and pas='" . $pas . "'";
$result=mysqli_query($db,$query);
if($result){
    //echo "Yes";
    $num=mysqli_num_rows($result);
    //echo $num;
    if($num>0){
        $row=mysqli_fetch_row($result);
        if($row[2]=="admin"){
            //echo $row[2];
            $_SESSION['admin']=$uname;
            header("Location:admin.php");
        }else{
            header("Location:login_form.htm");
            //echo "You are not administrator!";
        }

    }else{
        header("Location:login_form.htm");
    }
}
?>

پس از ساخت صفحه ی login.php موقع آن است که صفحه admin.php را ایجاد کنیم. در این صفحه ابتدا بررسی می شود آیا نشستی برای admin ساخته شده یا خیر. برای این منظور از تابع isset استفاده می شود. اگر نشست ساخته شده بود صفحه admin.php نشان داده می شود و به کاربر خوش آمدگویی نشان میدهد. در غیر اینصورت به صفحه ی loginform.php منتقل می شود. کد کامل این صفحه در زیر آمده است:

<body>
    <h1 style="text-align:center;color:blue">
        Welcome, Administrator's profile
    </h1>
    <?php
        session_start();
        if(isset($_SESSION['admin'])){
            echo "welcome ".$_SESSION['admin'];
        }else{
            header("Location:login_form.htm");
        }
    ?>
     <form method="POST" action="logout.php">
         <input type="submit" value="LOGOUT">
    </form>
</body>

پس از ساخت بانک و جدول و درج رکوردها قصد داریم به جستجوی رکورد بپردازیم. برای این منظور ابتدا یک فرم در فایل search.php می سازیم:

<body>
    <form action="listofusers.php" method="GET">
        <table align="center" width="40%">
            <tr>
                <td>Username: </td>
                <td><input type="text" name="un"></td>
            </tr>
            
            <tr>
                <td><input type="submit" value="Save"></td>
            </tr>
        </table>
    </form>
</body>

سپس فایل listofusers.php را می سازیم ابتدا مقدار un را دریافت می کنیم:

<?php
    $un=$_GET['un'];
    echo "Results for your query " . $un;

?>

سپس قصد داریم رکوردهایی که نام یکسان داشته باشند در یک جدول نمایش داده شوند. ابتدا جدول ایجاد می شود و عنووان ها در آن قرار می گیرند:

<body>
    <div align="center">
        <table border="1">
            <tr>
                <th>Username</th>
                <th>Password</th>
                <th>Role</th>
            </tr>

سپس به بانک اطلاعاتی متصل می شویم :

$db=mysqli_connect("127.0.0.1","root","","usrs");

در ادامه با تابع mysqli_query دستورات SQL اجرا می شوند و در r$ ذخیره می شوند:

 $query="select * from `tbl_user` where `username` = '" . $un . "'";
        $r=mysqli_query($db,$query);

سپس ابتدا تعداد رکوردهای بازیابی شده با تابع mysqli_num_rows بدست می آیند.

 $num = mysqli_num_rows($r);

به کمک تابع mysqli_fetch_row فیلدهای بازیابی شده مورد دسترسی قرار می گیرند و به کمک حلقه for در جدول چیده می شوند:

 for($i=0;$i<$num;$i++){
               $row=mysqli_fetch_row($r);
               echo "<tr>";
               echo "<td>".$row[0]."</td>";
               echo "<td>".$row[1]."</td>";
               echo "<td>".$row[2]."</td>";
               echo "</tr>";
           }

کد کامل صفحه listofusers.php در زیر آمده است:

<?php
    $un=$_GET['un'];
    echo "Results for your query " . $un;

?>

<body>
    <div align="center">
        <table border="1">
            <tr>
                <th>Username</th>
                <th>Password</th>
                <th>Role</th>
            </tr>
<?php
    $db=mysqli_connect("127.0.0.1","root","","usrs");
    if(!$db){
        echo mysqli_error($db);
    }else{
        //echo "connect";
        $query="select * from `tbl_user` where `username` = '" . $un . "'";
        $r=mysqli_query($db,$query);
        if(!$r){
            echo "Query cannot be execute!";
        }
        else{
           // echo "OK";
           $num = mysqli_num_rows($r);
           //echo $num;
           for($i=0;$i<$num;$i++){
               $row=mysqli_fetch_row($r);
               echo "<tr>";
               echo "<td>".$row[0]."</td>";
               echo "<td>".$row[1]."</td>";
               echo "<td>".$row[2]."</td>";
               echo "</tr>";
           }
        }

    }
?>



        </table>
    </div>
</body>

ابتدا در phpmyAdmin بانک اطلاعاتی و جدول با نام tbl_user ساخته می شود. سپس یک فرم در فایل register.php ساخته می شود که کد آن در زیر آمده است:

<body>
    <form action="saveuser.php" method="GET">
        <table align="center" width="40%">
            <tr>
                <td>Username: </td>
                <td><input type="text" name="un"></td>
            </tr>
            <tr>
                <td>Password: </td>
                <td><input type="text" name="pas"></td>
            </tr>
            <tr>
                <td>Role: </td>
                <td><input type="text" name="role"></td>
            </tr>
            <tr>
                
                <td><input type="submit" value="Save"></td>
            </tr>
        </table>
    </form>
</body>

پس از ایجاد فرم باید صفحه ی saveuser.php را ایجاد کرد. در این صفحه ابتدا مقادیر دریافت می شوند:


    $username=$_GET['un'];
    $pas=$_GET['pas'];
    $role=$_GET['role'];
    //echo "$username";

سپس به بانک اطلاعاتی با تابع mysqli_connect متصل می شویم:

 $db=mysqli_connect("127.0.0.1","root","","usrs");

بررسی می شود اگر به بانک اطلاعاتی متصل نبودیم پیغام دهد در غیر اینصورت رکورد جدید درج شود:

if(!$db){
        echo mysqli_error($db);
    }else{
        //echo "connect";
    }
    $query="INSERT INTO tbl_user(`username`,`pas`,`role`) VALUES('" . $username."','" . $pas . "','".$role."')";

    $r=mysqli_query($db,$query);

    if($r){
        echo "New record inserted successfully!";
    }

تابع mysqli_query جهت اجرای کد SQL میباشد. تمام کد صفحه saveuser.php در کد زیر آمده است:

<?php
    $username=$_GET['un'];
    $pas=$_GET['pas'];
    $role=$_GET['role'];
    //echo "$username";

    $db=mysqli_connect("127.0.0.1","root","","usrs");
    if(!$db){
        echo mysqli_error($db);
    }else{
        //echo "connect";
    }
    $query="INSERT INTO tbl_user(`username`,`pas`,`role`) VALUES('" . $username."','" . $pas . "','".$role."')";

    $r=mysqli_query($db,$query);

    if($r){
        echo "New record inserted successfully!";
    }
?>

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

تابع () fopen
یک روش بهتر برای باز کردن پرونده ها با عملکرد ()fopen است. این تابع گزینه های بیشتری نسبت به تابع به شما می دهد. برخی از این گزینه ها بصورت زیر است:

r پرونده ای را فقط برای خواندن باز کنید. نشانگر پرونده از ابتدای پرونده شروع می شود
w پرونده ای را فقط برای نوشتن باز کنید. محتویات پرونده را پاک می کند یا اگر پرونده ای وجود ندارد پرونده جدیدی ایجاد می کند. نشانگر پرونده از ابتدای پرونده شروع می شود
a پرونده ای را فقط برای نوشتن باز کنید. داده های موجود در پرونده حفظ می شود. نشانگر پرونده در انتهای پرونده شروع می شود. در صورت عدم وجود پرونده ، یک پرونده جدید ایجاد می کند
x یک پرونده جدید فقط برای نوشتن ایجاد می کند. اگر پرونده از قبل وجود داشته باشد ، FALSE و خطا را برمی گرداند
r + فایلی را برای خواندن / نوشتن باز کنید. نشانگر پرونده از ابتدای پرونده شروع می شود
w + فایلی را برای خواندن / نوشتن باز کنید. محتویات پرونده را پاک می کند یا اگر پرونده ای وجود ندارد پرونده جدیدی ایجاد می کند. نشانگر پرونده از ابتدای پرونده شروع می شود
a + پرونده ای را برای خواندن / نوشتن باز کنید. داده های موجود در پرونده حفظ می شود. نشانگر پرونده در انتهای پرونده شروع می شود. در صورت عدم وجود پرونده ، یک پرونده جدید ایجاد می کند
x + یک پرونده جدید برای خواندن / نوشتن ایجاد می کند. اگر پرونده از قبل وجود داشته باشد ، FALSE و خطا را برمی گرداند

ما اطلاعات را در فایل متنی ، “newfile.txt” ذخیره خواهیم کرد:

ابتدا آدرس ip کاربری که به سایت متصل شده در خط زیر در متغیر ip$ ذخیره می شود.

$ip=$_SERVER['REMOTE_ADDR'];

سپس فایل به صورت خروجی باز می شود.

 $myfile=fopen("newfile.txt","a");

اطلاعات زمانی و ip کاربر در متغیر رشته ای txt$ قرار می گیرد.

$txt="\n IP: ". $ip . "   " . "Visit on " . date("y/m/d") ." " .date("h:m:s");

سپس اطلاعات در فایل ذخیره می شوند.

fwrite($myfile,$txt);

در انتها فایل بسته می شود.

   fclose($myfile);

تمام کد بصورت زیر آمده است:

<?php

    $ip=$_SERVER['REMOTE_ADDR'];
    //echo $ip;
    $myfile=fopen("newfile.txt","a");
    date_default_timezone_set("Iran");
    $txt="\n IP: ". $ip . "   " . "Visit on " . date("y/m/d") ." " .date("h:m:s");
    fwrite($myfile,$txt);
    fclose($myfile);
?>

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

در این نوشته ابتدا فرم آپلود را آماده می کنیم. قصد داریم در این فرم یک فایل عکس به سایت آپلود شود.

<html>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
  Select image to upload:
  <input type="file" name="fileToUpload" id="fileToUpload">
  <input type="submit" value="Upload Image" name="submit">
</form>

</body>
</html>

برخی از قوانین برای فرم HTML بالا را دنبال کنید:

  • مطمئن شوید که فرم از “method=”POST استفاده می کند.
  • فرم همچنین به ویژگی زیر احتیاج دارد: “enctype = “multipart / form-data. این نوع نوع محتوا را هنگام ارسال فرم مشخص می کند.


بدون شرایط بالا ، بارگذاری پرونده کار نمی کند.

موارد دیگری که باید توجه کنید:

ویژگی “type = “fileاز برچسب <input> را به عنوان یک کنترل انتخاب پرونده ، با یک دکمه “Browse” در کنار کنترل ورودی نشان می دهد
فرم بالا داده ها را به فایلی به نام “upload.php” ارسال می کند ، پرونده ای که در ادامه ایجاد خواهیم کرد.

اسکریپت PHP بارگذاری پرونده را ایجاد کنید
پرونده “upload.php” حاوی کد بارگذاری پرونده است:

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
  if($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
  } else {
    echo "File is not an image.";
    $uploadOk = 0;
  }
}
?>

توضیح اسکریپت PHP به شرح زیر است:

“/target_dir = “uploads$- دایرکتوری محل قرارگیری پرونده را مشخص می کند
target_file$ مسیر پرونده بارگذاری شده را مشخص می کند
upload_ok$ هنوز استفاده نشده است (بعداً استفاده خواهد شد)
imageFileType$ پسوند پرونده را نگه دارد (با حروف کوچک)
بعد ، بررسی کنید که آیا فایل تصویر یک تصویر واقعی است یا خیر.
توجه: شما باید دایرکتوری جدیدی به نام “uploads” را در دایرکتوری که پرونده “upload.php” در آن قرار دارد ، ایجاد کنید. پرونده های بارگذاری شده در آنجا ذخیره می شوند.

بررسی کنید آیا پرونده از قبل موجود است
اکنون می توانیم محدودیت هایی اضافه کنیم.

ابتدا بررسی خواهیم کرد که آیا پرونده از قبل در پوشه “uploads” وجود دارد یا خیر. اگر اینگونه باشد ، پیام خطایی نمایش داده می شود و upload_ok$ روی 0 تنظیم می شود:

// Check if file already exists
if (file_exists($target_file)) {
  echo "Sorry, file already exists.";
  $uploadOk = 0;
}

اندازه پرونده را محدود کنید
قسمت ورودی فایل در فرم HTML ما در بالا “fileToUpload” نامگذاری شده است.

اکنون ، می خواهیم اندازه پرونده را بررسی کنیم. اگر پرونده از 500 کیلوبایت بزرگتر باشد ، پیام خطایی نمایش داده می شود و $ uploadOk روی 0 تنظیم می شود:

// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}

محدود کردن نوع پرونده
کد زیر فقط به کاربران امکان بارگذاری پرونده های JPG ، JPEG ، PNG و GIF را می دهد. قبل از تنظیم $ uploadOk روی 0 ، همه انواع فایل های دیگر پیغام خطایی می دهد:

// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
  $uploadOk = 0;
}

بارگذاری کامل فایل PHP اسکریپت
پرونده کامل “upload.php” اکنون به این شکل است:

<?php
$target_dir = "uploads/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION));

// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
  $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
  if($check !== false) {
    echo "File is an image - " . $check["mime"] . ".";
    $uploadOk = 1;
  } else {
    echo "File is not an image.";
    $uploadOk = 0;
  }
}

// Check if file already exists
if (file_exists($target_file)) {
  echo "Sorry, file already exists.";
  $uploadOk = 0;
}

// Check file size
if ($_FILES["fileToUpload"]["size"] > 500000) {
  echo "Sorry, your file is too large.";
  $uploadOk = 0;
}

// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
  echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed.";
  $uploadOk = 0;
}

// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
  echo "Sorry, your file was not uploaded.";
// if everything is ok, try to upload file
} else {
  if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
    echo "The file ". htmlspecialchars( basename( $_FILES["fileToUpload"]["name"])). " has been uploaded.";
  } else {
    echo "Sorry, there was an error uploading your file.";
  }
}
?>

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

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

PHP شامل بیانیه هایی است و به آنها نیاز دارد
می توان محتوای یک فایل PHP را در یک فایل PHP دیگر (قبل از اینکه سرور آن را اجرا کند) ، با جمله include دارد.

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

مثال: فرض کنید ما یک فایل پاورقی استاندارد داریم به نام “footer.php” ، به این شکل است:

<?php
echo "<p>Copyright &copy; 1999-" . date("Y") . " W3Schools.com</p>";
?>
<html>
<body>

<h1>Welcome to my home page!</h1>
<p>Some text.</p>
<p>Some more text.</p>
<?php include 'footer.php';?>

</body>
</html>

آموزش قبلی | | | | | آموزش بعدی

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

فرم دریافت اطلاعات

برای طراحی فرم شکل بالا کد آنرا به صورت زیر را در یک فایل با پسوند php وارد می کنیم.

  <h2>مثال اعتبارسنجی فرم</h2>
        <p>* فیلدهایی که باید پر شوند</p>
        <form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
            نام:
            <input type="text" name="name">*
            <span class="Err"><?php echo $nameErr; ?> </span>
            <br>
            جنسیت:
            <input type="radio" name="gender" value="مرد"> مرد
            <input type="radio" name="gender" value="زن">  زن *
            <span class="Err"><?php echo $genderErr; ?></span>
           <!-- <select>
                <option value="معاف">معاف
                <option value="خدمت کرده" > خدمت کرده
            </select> -->
            <br>
          
            <br>

            <input type="submit" value="نمایش و اعتبارسنجی اطلاعات">

        </form>

جهت عدم ارسال اطلاعات به صفحه دیگر مقدار PHP_SELF برای SERVER_$ در صفت action قرار گرفته است. کلاس Err به صورت زیر در قسمت head به عنوان یک شیوه نامه تعریف می شود.

<style>
            .Err{
                color:red;

            }
        </style>

متغیرهای nameErr و genderErr ابتدا مقدار خالی دریافت می کنند اگر مقادیر فرم معتبر نبودند عباراتی در آنها قرار می گیرد. کد زیر به بررسی وضعیت فرم می پردازد.

 <?php
            $nameErr=$name=$genderErr=$gender="";
            if($_SERVER["REQUEST_METHOD"]=="POST")
            {
               if(empty($_POST["name"])) 
               {
                $nameErr="نام را باید وارد کنید";
               }else{
                   $name=test_input($_POST["name"]);
               }
               if(empty($_POST["gender"])){
                    $genderErr="جنسیت را مشخص کنید";
               }else{
                   $gender=test_input($_POST["gender"]);
               }
            }
                    
           function test_input($data)
           {
               $data=trim($data);
                return $data;
           }     
           
        ?>

همانطوریکه مشاهده می شود ابتدا بررسی می شود که اطلاعات فرم با متد post ارسال شده یا خیر. چنانچه با متد post ارسال شده باشد و مقدارش خالی باشد پیغامی در متغیر nameErr قرار می گیرد. در غیراینصورت متغیر name مقدار وارد شده را دریافت می کند.تابع test_input فاصله های ابتدا و انتهای نوشته های کاربر را حذف می کند. برای جنسیت نیز به همین صورت متغیرهای genderErr و gender مقداردهی می شوند.

چنانچه اطلاعات وارد شده معتبر باشند در پایین فرم مقادیر متغیرهای name و gender نمایش داده می شوند. برای این منظور کد زیر استفاده می شوند.

<?php
            echo "<hr>";
            echo "<h2>اطلاعات وارد شده ی شما:</h2>";
            echo "نام :". $name;
            echo "<br>";
            echo  "جنسیت:‌ ". $gender;
        ?>

چنانچه بخواهیم به کمک دستورات php به فرم یک عنصر لیست بازشو اضافه کنیم که دارای مقادیر خدمت رفته ، معافیت پزشکی و معافیت کفالت باشد کد زیر استفاده می شود.

وضعیت خدمت:
            <?php
                 echo "<select>";
                 $k=array("خدمت رفته","معافیت پزشکی","معافیت کفالت");
                 foreach($k as $value){
                     echo "<option value='" . $value. "'>".$value . "</option>";
                 }
                 echo "</select>"."*";
            ?>
            <br>

کل کد نوشته شده به صورت زیر است:

<html>
    <head>
        <style>
            .Err{
                color:red;

            }
        </style>
    </head>
    <body dir="rtl">
        <?php
            $nameErr=$name=$genderErr=$gender="";
            if($_SERVER["REQUEST_METHOD"]=="POST")
            {
               if(empty($_POST["name"])) 
               {
                $nameErr="نام را باید وارد کنید";
               }else{
                   $name=test_input($_POST["name"]);
               }
               if(empty($_POST["gender"])){
                    $genderErr="جنسیت را مشخص کنید";
               }else{
                   $gender=test_input($_POST["gender"]);
               }
            }
                    
           function test_input($data)
           {
               $data=trim($data);
                return $data;
           }     
           
        ?>

        <h2>مثال اعتبارسنجی فرم</h2>
        <p>* فیلدهایی که باید پر شوند</p>
        <form method="post" action="<?php echo $_SERVER["PHP_SELF"]; ?>">
            نام:
            <input type="text" name="name">*
            <span class="Err"><?php echo $nameErr; ?> </span>
            <br>
            جنسیت:
            <input type="radio" name="gender" value="مرد"> مرد
            <input type="radio" name="gender" value="زن">  زن *
            <span class="Err"><?php echo $genderErr; ?></span>
           <!-- <select>
                <option value="معاف">معاف
                <option value="خدمت کرده" > خدمت کرده
            </select> -->
            <br>
            وضعیت خدمت:
            <?php
                 echo "<select>";
                 $k=array("خدمت رفته","معافیت پزشکی","معافیت کفالت");
                 foreach($k as $value){
                     echo "<option value='" . $value. "'>".$value . "</option>";
                 }
                 echo "</select>"."*";
            ?>
            <br>

            <input type="submit" value="نمایش و اعتبارسنجی اطلاعات">

        </form>

        <?php
            echo "<hr>";
            echo "<h2>اطلاعات وارد شده ی شما:</h2>";
            echo "نام :". $name;
            echo "<br>";
            echo  "جنسیت:‌ ". $gender;
        ?>

    </body>
</html>