در این بیاموز و همچنین بیاموز بعدی، نحوه ی اعتبارسنجی داده های فرم با استفاده از PHP آموزش داده خواهد شد.
اعتبارسنجی فرم در PHP
![]() | زمان پردازش فرم های PHP، به امنیت بیاندیشید! در این بیاموز نحوه ی پردازش فرم های PHP بصورتی که حداقل موارد امنیتی که در ذهن دارید حفظ شود، نشان داده خواهد شد. اعتبار سنجی مناسب اطلاعات فرم، بمنظور جلوگیری از حمله هکرها دارای اهمیت است. |
---|
فرم HTMLی که در این بیاموز روی آن کار خواهیم کرد شامل فیلدهای مختلفی است: فیلدهای متنی الزامی و اختیاری، radio button و یک دکمه submit:
در جدول زیر قوانین اعتبارسنجی ذکر شده است:
فیلد | قوانین اعتبارسنجی |
---|---|
نام | الزامی است. فقط باید شامل حروف الفبا و خط فاصله باشد. |
ایمیل | الزامی است. باید شامل فرمت صحیح ایمیل باشد (همراه با علامت @ و .) |
وب سایت | اختیاری است. اگر پر شد، باید شامل فرمت صحیح URL باشد. |
توضیحات | اختیاری است. می تواند شامل چند خط متن باشد (textarea) |
جنسیت | الزامی است. یکی از دو مورد باید انتخاب شود. |
اجازه دهید تا در ابتدا نگاهی به کد HTML فرم بیاندازیم.
فیلدهای متنی
برای فیلدهای متنی "نام"، "ایمیل" و "وب سایت" از عنصر متنی <input> و برای فیلد "توضیحات" از عنصر <textarea> استفاه می کنیم:
ایمیل: <input type="text" name="email">
وب سایت: <input type="text" name="website">
توضیحات: <textarea name="comment" rows="5" cols="40"></textarea>
فیلد "جنسیت"
برای فیلد "جنسیت" از Radio Button استفاده می کنیم: (عنصر <input> از نوع radio)
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
عنصر <form>
کد HTML فرم شبیه زیر است:
زمانی که روی دکمه submit کلیک می شود، اطلاعات با متد "post" به سرور ارسال می شود.
![]() | متغییر SERVER_$ متغییر SERVER_$ یکی از متغییرهای عمومی از پیش تعریف شده است (آرایه). "PHP_SELF" نام فایلِ اسکریبت جاری را برمی گرداند. |
---|
بنابراین زمانی که کاربر روی دکمه submit کلیک می کند، بجای اینکه داده ها به یک فایل متفاوت دیگر ارسال شود به خودش ارسال خواهد شد. در این روش، کاربر خطاها را در همان صفحه ای که فرم وجود دارد مشاهده خواهد کرد.
![]() | تابع ()htmlspecialchars با استفاده از تابع ()htmlspecialchars، می توان کاراکترهای خاص را به HTML entity تبدیل نمود. منظور این است که کاراکترهایی مثل علامت کوچکتر(<) و بزرگتر(>) در پارامتر ورودی را به ;lt$ و ;gt$ تبدیل می کند. با این کار از حمله ی هکرهایی که می خواهند از طریق تزریق HTML یا JavaScript اخلال ایجاد کنند، جلوگیری می شود. |
---|
یک تذکر مهم درباره امنیت فرم PHP
PHP_SELF می تواند توسط هکرها مورد استفاده قرار گیرد.
یک هکر می تواند در آدرس بار مرورگرش بعد از آدرس فایل، یک اسلش (/) قرار دهد و سپس دستورات XSS را برای اجرا تایپ کند.
![]() | XSS یا Cross-site scripting دلیل به وجود آمدن این آسیب پذیری عدم اعتبارسنجی ورودیهای کاربر می باشد، و مهاجم می تواند با تزریق اسکریپتهای مخرب در سایت از این آسیب پذیری سو استفاده کند. |
---|
فرض کنید، فرم زیر را در یک فایل بنام "test_form.php" داریم:
حالا اگر یک کاربر در آدرس بار مرورگرش "http://www.example.com/test_form.php" را وارد کند، کد بالا بصورت زیر ترجمه خواهد شد:
خوب تا اینجا همه چیز خوب است.
اما درنظر بگیرید که کاربری URL زیر را در آدرس بار وارد کند:
در این صورت کد بالا بصورت زیر ترجمه خواهد شد:
دومین URL، باعث اضافه شدن تگ <script> و یک دستور alert در بین کدهای ما شده است. و زمانی که صفحه لود می شود، کد JavaScript اجرا می شود (کاربر یک جعبه پیغام خواهد دید). این فقط یک مثال ساده و بی ضرر است که نحوه هک کردن متغییر PHP_SELF را نشان می دهد.
توجه داشته باشید که هر کد JavaScript دیگری را می توان در تگ <script> قرار داد...! یک هکر می تواند کاربر را به یک فایل دیگر روی سروری دیگر redirect کند، و از طریق آن فایل، اطلاعات کاربر را ذخیره کند.
نحوه مقابله با هک از طریق"PHP_SELF"
با استفاده از تابع ()htmlspecialchars، می توان با هک از طریق "PHP_SELF" مقابله نمود.
کد آن شبیه زیر است:
تابع ()htmlspecialchars، کاراکترهای خاص را به HTML entity تبدیل می کند. حالا اگر کاربر بخواهد از متغییر "PHP_SELF" سوء استفاده کند، با نتیجه زیر روبرو خواهد شد:
و از این طریق هیچ آسیبی وارد نخواهد شد...!
اعتبارسنجی داده های فرم با PHP
اولین کاری که باید انجام دهید این است که تمام متغییرها را به تابع ()htmlspecialchars پاس دهیم.
حالا اگر کاربر تلاش کند که متنی مانند زیر را ارسال کند:
<script>location.href('http://www.hacked.com')</script>
در اینصورت اسکریپت بالا اجرا نخواهد شد، چونکه کاراکترهای خاص در متن بالا به HTML entity معادلاشان تبدیل شده اند:
<script>location.href('http://www.hacked.com')</script>
حالا این کد برای نمایش در یک صفحه یا داخل یک ایمیل، امن شده است.
همچنین ما دو کار دیگر را هنگام ارسال داده ها به سرور انجام می دهیم:
- با استفاده از تابع ()trim کاراکترهای غیرضروری (مثل: فاصله های اضافی، tab و خطوط خالی) را حذف می کنیم.
- با استفاده از تابع ()stripslashes، بک اسلش ها (\) را حذف می کنیم
گام بعدی، ایجاد یک تابع، برای انجام تمام کارهای بالاست (بجای اینکه کدهای مربوط به این قسمت را بارها و بارها بنویسیم، مناسب تر است که از یک تابع استفاده کنیم)
ما این تابع را ()test_input می نامیم.
حالا ما می توانیم به ازای هر متغییر POST_$ مقدار آنرا با تابع ()test_input چک کنیم و کد آن شبیه زیر است:
مثال (اعتبارسنجی فرم در PHP)
<html>
<head>
<style>
span{min-width: 200px;float: right;}
</style>
</head>
<body style="direction:rtl;">
<?php
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST")
{
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>مثال اعتبارسنجی فرم ها در PHP</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<div><span>نام:</span><input type="text" name="name"></div>
<div><span>ایمیل:</span><input type="text" name="email"></div>
<div><span>وب سایت:</span><input type="text" name="website"></div>
<div><span>توضیحات:</span><textarea name="comment" rows="5" cols="40"></textarea>
</div>
<div><span>جنسیت:</span>
<input type="radio" name="gender" value="female">زن
<input type="radio" name="gender" value="male">مرد
</div>
</div><input type="submit" name="submit" value="ارسال اطلاعات"></div>
</form>
<?php
if (isset($name) || isset($email) || isset($gender) || isset($comment) || isset($website))
{
echo "<br /><h2>خروجی کدتان</h2>";
echo "نام :$name";
echo "<br />";
echo "ایمیل: $email";
echo "<br />";
echo "وب سایت: $website";
echo "<br />";
echo "توضیحات: $comment";
echo "<br />";
echo "جنسیت: $gender";
}
?>
</body>
</html>
خروجی کد بالا:
مثال اعتبارسنجی فرم ها در PHP
توجه داشته باشید که در ابتدای اسکریپت، با استفاده از متغییر "REQUEST_METHOD" نحوه ارسال داده های فرم را چک می کنیم. اگر نحوه ی ارسال داده های فرم، از طریق متد "POST" است، اطلاعات فرم پردازش خواهد شد وگرنه با یک صفحه خالی روبرو خواهیم شد.
توجه: برای بار اول که کاربر درخواست مشاهده فایل مثال بالا را به سرور ارسال می کند، بدلیل اینکه متد پیش فرض برای مشاهده صفحات از نوع get است، بنابراین شرط "$_SERVER["REQUEST_METHOD"] == "POST درست نخواهد بود و دستورات داخل شرط اجرا نخواهد شد. اما بعد از اینکه کاربر اطلاعات فرم را پر کرده و روی دکمه ارسال (submit) کلیک کرد، چون ویژگی method فرم را با مقدار "post" تنظیم کرده ایم، شرط ذکر شده درست خواهد بود و دستورات داخل آن اجرا خواهد شد.
اما در مثال بالا، تمام فیلدهای ورودی اختیاری است. حتی اگر کاربر هیچ کدام از فیلدها را پر نکند، اسکریپت بالا باز هم کار خواهد کرد.
در بیاموز بعدی برای فیلدهای الزامی، یک پیغام مناسب نمایش خواهیم داد.
برای مشاهده فیلم ها و آموزش های پروژه محور برنامه نویسی PHP کلیک کنید.
ببخشید من وقتی تمام دستورات رو مو به مو اجرا می کنم یه همچین اروری میده:
[dir=#555]Fatal error: cannot use isset() on the result of an Exppression(you can use "null!==expression"insted)in ..... on line 76
[/dir]خط 76 مربوط به خطی است که تابع isset() رو نوشتم!
ممنونم از سایت خوبتون.
ممکنه از تابع isset ببصورت زیر استفاده کرده باشید، که نیاز به بستن پرانتز در انتهای دستور هست:
[dir=#555]isset($_POST['idPresented'][/dir]
این تابع چک میکنه که آیا متغیر موردنظر تعریف شده است یا خیر.
کاری به مقدار متغیر نداره، و فقط چک میکنه که تعریف شده باشه.
این نکته رو باید در نظر بگیرید.
1) ببینید شما قصد ارسال یک فرم رو دارید. آدرس مقصد فرم میتونه همون آدرس یا یک آدرس دیگه در سایت باشه. این آدرس داخل خصوصیت action فرم نوشته میشه.
2) زمانی که شما فرم رو ارسال میکنید، با توجه به اینکه متد فرم چی بوده، اطلاعات باید در صفحه مقصد خونده بشه. (فرض میگیریم شما از متد POST_$ استفاده کردین.)
3) در آدرس مقصد اگه مقادیر ارسال شده باشند، توسط کد echo '<pre>' . print_r($_POST, true) . '</pre>'; //comment قابل مشاهده خواهند بود.
از اینجا به بعد میتونید مطمئن باشید که فرم شما درست ارسال شده. اگه این مرحله نشون داده نمیشه، مشکل رو باید از جای دیگه پیدا کرد...
مشکل من اینه که وقتی اطلاعات رو سند میکنم..یه پیج دیگه برام باز نمیشه!
حتی توی خودش هم جواب نمیده..
جوابهایی که توی کادرها زدم رو توی آدرس بار مرورگر نشون میده!
چرا اینجوری میشه؟!
لطفا کد رو قرار بدید تا ببینم مشکل از کجاست.
به علامتهای > و < برای تگها دقت کنید. باید از عبارت :lt& برای > و ;gt& برای < استفاده کنید.
بهتر است برای اعتبارسنجی هم از جاوااسکریپت و هم از PHP استفاده کنیم. اما اگه بخوایم بین این دو اولویت قایل بشیم، اعتبارسنجی از طریق PHP از اهمیت خیلی بیشتری برخوردار هست.
دلیل این امر هم بر میگرده به ماهیت جاوااسکریپت و PHP.
جاوااسکریپت زبان سمت کلاینت هست. در واقع دادهها و اطلاعات در سمت کلاینت پردازش میشه. در این بین خیلی راحت میشه کدهای سمت جاوااسکریپت رو با استفاده از ابزارهایی مثل firebug و ... دور زد و یا حتی برخی مواقع نیاز به این ابزارها هم نیست و خیلی راحت میشه با تزریق یک اسکریپت در کد اعتبارسنجی از طریق جاوااسکریپت رو دور زد. وقتی هم که این اتفاق بیفته، میشه کدهای مخرب وارد سایت کرد و دیگه باقی ماجرا رو خودتون میتونید حدس بزنید.
اما PHP زبان سمت سرور هست. دادهها و اطلاعات در سمت سرور پردازش میشن. زمانی که شما در سمت سرور اعتبارسنجی رو انجام بدید، میتونید با استفاده از ابزارهای موردنیاز از تزریق کدها و دادههای مخرب جلوگیری کنید، حتی اگه کاربری اعتبارسنجی از طریق جاوااسکریپت رو دور زده باشه، تو اعتبارسنجی از طریق PHP گیر میفته.
بنابراین همیشه بهتر است اعتبارسنجی نهایی و اصولی رو در سمت سرور (PHP) انجام بدید. از اعتبارسنجی جاوااسکریپت برای زیبایی و عدم ارسال بیهوده اطلاعات به سرور استفاده کنید.
موفق باشید.
آموزش اتون عالی بود.
من نظر رو کلا فارسی مینویسم که جاییش حذف نشه!
میخوام بدون نقش اچ تی ام ال اسپشیال چارس توی تابع تست اینپوت چیه؟ البته توضیحات رو خوندم! ولی چیزی که هست این قسمت درست کار نمیکنه!
البته توی کدی که شما نوشتید این مورد عمل میکنه! ولی نه توی سایت w3 و نه توی کدی که خودم مینویسم این قسمت کار نمیکنه و میتونم هر کاراکتری رو بنویسم مثل ;lt& .
اگه تو سایت w3 هم تست کنید میبینید!
تابع htmlspecialchars کاراکترهای خاص را به معادل اچ تی ام ال آنها تبدیل می کند. مثلا کاراکتر علامت "کوچکتر از" را به معادل اچ تی ام ال آن که عبارت است از ;lt&، تبدیل می کند. با انجام این کار از ایجاد یک باگ به نام باگ xss جلوگیری میشه و هکرها نمی توانند به پایگاه داده از طریق فرم ، اطلاعات را تزریق کنند.
قسمت های قرمز رنگ رو در کد زیر مشاهده کنید، این قسمت ها رو اگه به کد اصلی اضافه کنید اونوقت همه چیز درست میشه:
[dir=#555]<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
</head>
<body>
<?php
// define variables and set to empty values
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
// check if name only contains letters and whitespace
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "Only letters and white space allowed";
[color=#FF0000]$name="";[/color]
}
}
if (empty($_POST["email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_POST["email"]);
// check if e-mail address is well-formed
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$emailErr = "Invalid email format";
[color=#FF0000]$email="";[/color]
}
}
if (empty($_POST["website"])) {
[color=#FF0000] $website = "";[/color]
} else {
$website = test_input($_POST["website"]);
// check if URL address syntax is valid (this regular expression also allows dashes in the URL)
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "Invalid URL";
[color=#FF0000]$website="";[/color]
}
}
if (empty($_POST["comment"])) {
[color=#FF0000]$comment = "";[/color]
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"])) {
$genderErr = "Gender is required";
} else {
$gender = test_input($_POST["gender"]);
[color=#FF0000]$gender="";[/color]
}
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
<h2>PHP Form Validation Example</h2>
<p><span class="error">* required field.</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Name: <input type="text" name="name">
<span class="error">* <?php echo $nameErr;?></span>
<br><br>
E-mail: <input type="text" name="email">
<span class="error">* <?php echo $emailErr;?></span>
<br><br>
Website: <input type="text" name="website">
<span class="error"><?php echo $websiteErr;?></span>
<br><br>
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
<br><br>
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<span class="error">* <?php echo $genderErr;?></span>
<br><br>
<input type="submit" name="submit" value="Submit">
</form>
<?php
echo "<h2>Your Input:</h2>";
echo $name;
echo "<br>";
echo $email;
echo "<br>";
echo $website;
echo "<br>";
echo $comment;
echo "<br>";
echo $gender;
?>
</body>
</html>[/dir]
در واقع وقتی که یک error ایجاد میشه باید متغیر مربوطه رو خالی کرد...
اگه توضیحی نیاز بود همین جا اعلام کنید
بابت مطالب واقعاااا ممنون واینکه سوالم اینه که آیا مطالب آموزش php با فصل شی گرایی بسته میشه یا نیاز به این است که بعد از یادگیری مطالب شما ,من باید به دنبال مطالب بیشتر باشم یا کار آموزش در شی گرایی به ٰاتمام می رسد؟؟؟؟
ممنون میشم اگه راهنمایی کنید
در آموزش PHP سایت بیاموز، از مقدماتی تا پیشرفته، مطالب گفته شده است، فقط دو تا پیشنهاد براتون دارم:
1- برای طراحی فرم ها و جداول اطلاعاتی می توانید از Kendo UI استفاده کنید، بنابراین پیشنهاد می کنم که حتماً فریم ورک Kendo UI را نیز مطالعه فرمایید. برای کسب اطلاعات بیشتر در مورد Kendo UI به لینک زیر مراجعه فرمایید:
beyamooz.com/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-kendo-ui
2- به سایت رسمی PHP یعنی www.php.net هم سر بزنید و با نحوه ی استفاده از آن کاملاً آشنا بشید، در آینده اگر پروژه ای را شروع کردید، مطمئن باشید که زیاد به سراغش می رید.
کنترل مورد نظر شما با نام "چک باکس لیست" معروف است و طریقه ساخت آن بصورت زیر است:
1- کد HTML چک باکس لیست:[dir=#555]<input type="checkbox" name="fruit[]" value="apple" />
<input type="checkbox" name="fruit[]" value="grapefruit" />[/dir]
همان طور که در مثال بالا مشاهده می کنید لیستی از میوه ها موجود است و قرار است کاربر از بین چند میوه مختلف، آنهایی که دوست دارد را انتخاب یا تیک بکند. اما تنها نکته ای که باید به آن دقت کنید، مقدار ویژگی name است که با مقدار []fruit تنظیم شده است، با این روش یعنی استفاده از [color=#FF0000]آکولاد باز و بسته[/color] یک آرایه ایجاد می شود و سمت سرور به راحتی می توانید انتخاب شدن یا نشدن هر کدام از میوه ها را بدست آورید.
2- گرفتن مقادیر سمت سرور (PHP):[dir=#555]if( isset($_POST['fruit']) && is_array($_POST['fruit']) ) {
foreach($_POST['fruit'] as $fruit) {
// برای مثال، تصور فرمایید می خواهیم جمله "من یک سیب دارم" را چاپ کنیم.
echo "I have a {$fruit}!";
// کد مربوط به درج در پایگاه داده اینجا قرار می گیرد.
}
// تصور فرمایید، میخواهیم، تمام میوه ها را با کاما از هم جدا کنیم.
$fruitList = implode(', ', $_POST['fruit']);
// کد مربوط به درج در پایگاه داده اینجا قرار می گیرد.
}[/dir]
لطفا اگه ممکنه در مورد خط زیر بیشتر توضیح بدید ممنون:
اولين کاري که بايد انجام دهيد اين است که تمام متغیيرها را به تابع ()htmlspecialchars پاس دهيم.
برای کسب اطلاعات بیشتر در مورد کاراکترهای خاص و HTML entity به لینک زیر مراجعه فرمایید:
beyamooz.com/html/138-advanced/358-%DA%A9%D8%A7%D8%B1%D8%A7%DA%A9%D8%AA%D8%B1%D9%87%D8%A7%DB%8C-%D8%B1%D8%B2%D8%B1%D9%88-%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-html
توجه داشته باشید، در همین سایت و در قسمت دیدگاه ها، کاربران مجاز به وارد کردن مثلاً تگ <script> نیستند و بصورت اتوماتیک حذف خواهد شد. بنابراین رعایت این نکته مهم است و باید مقادیر ارسال شده از طریق فرم را از لحاظ کاراکترهای خاص، چک کنیم.
1- وقتی برای اعتبار سنجی فرم از htmlspecialchars استفاده می کنیم که اطلاعات به جای ارسال به یک فایل به خود صفحه ارسال می شود.
2- فرض کنید شخصی اطلاعات خودش را برای ثبت نام در سایتی وارد کرده، دکمه Submit را می زند در این لحظه ادمین چطور میتونه به این اطلاعات دسترسی داشته باشه یا این اطلاعات در کجا ذخیره می شه؟
3- خصوصیت action فرم فقط زمانی کاربرد دارد که کاربر دکمه Submit را فشار دهد و اطلاعات فرم به فایلی که برای action تنظیم کرده ایم ارسال شود؟؟؟؟
1- خیر برداشت شما درست نیست ...! تابع ()htmlspecialchars، کاراکترهای خاص را به HTML entity تبدیل می کند، یعنی ">" را به ";lt&" تبدیل خواهد کرد.
2 و 3: در مثال های بالا، خصوصیت action را بنحوی تنظیم نموده ایم که اطلاعات به خود صفحه جاری ارسال می شود و این کار را بخاطر افزایش نیافتن تعداد فایل ها انجام دادیم، همچنین این روش به ما کمک می کند تا مطالب را برای کسانی که تازه کار هستند بهتر ارائه کنیم. بنابراین در پروژه های واقعی سعی می کنیم خصوصیت action را به نحوی تنظیم کنیم که اطلاعات فرم به یک فایل دیگر ارسال شود.
و سوال دیگه، چرا وقتی فانکشنمون رو در if بالاییش قرار میدیم، فانکشن کار نمیکنه؟
وقتی برای اولین بار فرم بالا میاد، شرط if کار نمیکنه. پس کاری بهش نداریم. کنترلها و فرم در صفحه ظاهر میشن. اکشن فرم همین صفحه هست، بنابراین وقتی فرم رو ارسال میکنیم، دوباره به همین صفحه بر میگردیم. با این تفاوت که فرم ارسال شده و مقادیر کنترلها از طریق متدی که در فرم مشخص شده (در اینجا post) پاس داده میشه.
اینجا شرط if درست میشه، بنابراین داخل if میشه و کارهای مربوطه رو انجام میده.
در اینجا شرط برابر این هست که اگر درخواست از طریق post بود، کار لازم رو انجام بده.
قضیه فانکشن رو نگفتید ! خط آخر
اگر به جواب قبلی خوب دقت کنید، میبینید که به این سوال هم به نوعی اشاره کردم.
فانکشن زمانی اجرا میشه که داخل شرط if بشه. وقتی که داخل شرط if نشیم، عملا کاری به تابع نداریم. بنابراین اجرا یا عدم اجراش فرقی نمیکنه.
برای حفظ امنیت سایت، زمان ثبت دیدگاه، تمام کلماتی که با علامت کوچکتر و بزرگتر محصور شده باشند، حذف می شوند. بنابراین برای ارسال کدی که شامل علامت های ذکر شده است باید از HTML Entity مربوطه استفاده کنید. (علامت بزرگتر: ;lt& و علامت کوچکتر: ;gt&)
چرا شرط میگذاریم که وقتی فرم با متد post میاد اعتبار سنجی بشه؟پس تکلیف فرم هایی با متد get چی میشه اونا نیاز به اعتبار سنجی ندارن؟
البته میدونم که این فرم از متد post استفاده کرده ولی حالا اگه برنامه رو بدون اون شرط اولی بنویسیم که فقط برای متد post باشه مشگلی داره؟
یک سوال؟ برای اولین بار که فرم بالا لود می شود، آیا کدهای PHP مربوط به اعتبارسنجی باید اجرا شوند؟
خیر نباید اجرا شوند ...! حالا چه کار کنیم که اجرا نشوند ...!؟
همان طور که می دانید زمانی که آدرس یک صفحه را در مرورگرتان تایپ می کنید و Enter می کنید، درخواست شما با استفاده از متد get به سرور ارسال می شود، بنابراین با قرار دادن شرط زیر می توانیم از اجرای کدهای مربوط به اعتبارسنجی جلوگیری کنیم:[dir=#555]if ($_SERVER["REQUEST_METHOD"] == "POST")
{
...
}[/dir]
همان طور که در مثال بالا مشاهده می کنید، کدهای PHP و HTML در کنار هم قرار گرفته اند و اطلاعات فرم بعد از submit به همین فرم جاری ارسال می شود ...
در روش ذکر شده توسط شما، قبل از اینکه داده های فرم به سرور ارسال شود (submit)، داده های فرم یکی یکی با استفاده از JavaScript یا jQuery بررسی می شوند و اگر مشکلی وجود داشت، پیغام خطا سمت کاربر تولید و نمایش داده خواهد شد. و تا زمانی که خطایی وجود داشته باشد، فرم به سرور ارسال نمی شود.
و زمانی که تمام فیلدها درست و صحیح مقدار دهی شوند، اطلاعات فرم اینبار به سمت فایلی که در قسمت [color=#FF0000]action [/color] فرم گفته اید ارسال خواهد شد. و در ادامه این شمایید که بعنوان برنامه نویس چگونگی برگشت دادن اطلاعات را مشخص می کنید، شاید بخواهید کاربر در انتهای فایل مذکور به صفحه دیگری ارجاع داده شود.
يه موضوع ديگه اينكه قبلا زماني كه شما ما رو راهنمايي ميكردين جواب براي بنده ايميل ميشد اما جديدا اين اتفاق نميافته
beyamooz.com/javascript/107-basic/407
برای دریافت ایمیل به ازای تغییر در دیدگاه ها باید در انتهای لیست دیدگاه ها روی لینک "می خواهم مشترک شوم" کلیک کنید.
if ($stmt = $conn->prepare("SELECT u_id FROM users WHERE u_username=? and u_password=? and u_usertype='admin'"))
{
//بایند کردن پارامترها
$stmt->bind_param("ss", $u_username, $u_password);
//اجرای کوئری
$stmt->execute();
//ذخیره کردن نتیجه
$stmt->store_result();
//اگر تعداد رکوردها بزرگتر از صفر باشد، کاربر بدرستی اطلاعات را وارد کرده است
if($stmt->num_rows>0)
{
$_SESSION['u_username_admin']=$u_username;
[color=#FF0000]header[/color]('Location: all_reserve.php');
}
else
{
$error = "نام کاربری یا کلمه عبور اعتبار ندارد";
display_form_login();
return;
}
} [/dir]
اگر نام کاربری و کلمه عبور وارد شده توسط کاربر صحیح باشد، با استفاده از تابع header، کاربر را به صفحه ای دیگر منتقل می کنیم و اگر اطلاعات ارسال شده صحیح نباشد، در همان صفحه ی جاری یعنی صفحه ای که فرم لاگین در آن قرار دارد، پیغام خطا نمایش داده می شود.
این روش در پروژه رزرو هتل استفاده شده است: beyamooz.com/php/339-project-hotel/2594
file:///C:/xampp/htdocs/Untitled3.php
اصلا وقتي اينطور آدرس داده ميشه ب مرورگر برنامه ي xampp درست كار نميكنه انگار....امكان داره از تنظيمات برنامه ي xampp باشه؟من بايد چكار كنم تا اين مشكل حل بشه؟مراحلي رو ك قبلا گفتين تست كردم و همش صحيح بود اما باز هم مشكل حل نشد!
اما همان طور که گفتم برای اجرای پروژه باید در آدرس بار مرورگر ابتدا localhost رو تایپ کنید. با این کار مرورگر می ره داخل پوشه htdocs و اگر در ادامه آدرس localhost اسم فایلتون رو ندید، بصورت پیش فرض فایل index.php رو اجرا می کنه ...!
حالا با تصور اینکه، پروژه شما داخل یک پوشه بنام Myproj است و اون رو گذاشید داخل htdocs برای اجرای پروژه در آدرس بار مرورگر تایپ می کنیم، localhost://myproj/login.php در این صورت فرم لاگین پروژه شما به نمایش در می یاد. که شامل یک فرم با دوتا تکس باکس است.
حالا اگر بخواهیم توضیحی کلی درباره ساختار HTML فرم لاگین بدیم، به این صورت هست که از تگ form برای محصور کردن دو تا تکس باکس و یک دکمه submit استفاده کرده ایم، نکته بسیار مهم در مورد سوال شما همین جاست که باید دقت کنید خصوصیت action فرم را با مقدار مثلاً process.php تنظیم کنید.
در این صورت بعد از کلیک شدن روی دکمه submit اطلاعات کاربر به فایل process.php ارسال خواهد شد و بعد از پردازش اطلاعات توسط این فایل، نتیجه هر چیزی که بود برای نمایش در مرورگر، ارسال خواهد شد.
1-اولين سوال اينكه چرا دستورات php وسط html نوشته شده؟از مطالب قبل بنده اينطور برداشت كردم ك زماني ك كاربر فرمي رو پر ميكنه (البته طبق مثال بالا)فرم به يك صفحه ي ديگه ارسال ميشه ك ما قبلا دستورات php رو اونجا وارد كرديم .اما تو اين مثال ب نظر ميرسه ك ب سرور ديگه احتياج نيست...
2-اين قسمت براي چيه؟(اگه نذاريم چي ميشه؟):
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
3-زماني ك از trimو htmlspecialchars و ... استفاده كرديم باز هم در فرم تغييري ايجاد نشد.
در كل مثال يكم پيچيدست....اگه ميشه بيشتر راجبش توضيح بديد....با تشكر
2 و 3- برای بار اول که کاربر درخواست مشاهده فایل مثال بالا را به سرور ارسال می کند، بدلیل اینکه متد پیش فرض برای مشاهده صفحات از نوع get است، بنابراین شرط $_SERVER["REQUEST_METHOD"] == "POST درست نخواهد بود و دستورات داخل شرط اجرا نخواهد شد. و البته وقتی به انتهای فایل می رسیم، یک شرط دیگر وجود دارد که در صورت خالی نبودن متغییرها، مقادیر مربوط به هر کدوم رو چاپ می کند، حالا شاید متوجه بشید که چرا در ابتدای فایل، متغییرهامون را با مقدار خالی تنظیم کردیم، اما بعد از اینکه کاربر اطلاعات فرم را پر کرده و روی دکمه ارسال (submit) کلیک کرد، چون ویژگی method فرم را با مقدار "post" تنظیم کرده ایم، شرط ذکر شده در ابتدا درست خواهد بود و دستورات داخل آن اجرا خواهد شد.
زماني ك فرمي رو ميسازم و اونو به ي صفحه ي ديگه منتقل ميكنم اطلاعاتي ك بر ميگرده ب صورت متن مياد....طوري ك ب نظر ميرسه اصلا دستورات php رو تفصير نكرده....(يعني تمام دستورات رو ب صورت متن مينويسه!)
من موقع نصب برنامه ي xampp هر دو گزينه ي ,apache و mysql رو هم نصب كردم و فعالن اما باز هم اين مشكل هست....حتي بنده مثال شما رو هم عينا اجرا كردم....اما باز هم قسمت هاي مربوط ب دستورات php ب صورت متن مينويسه....دليلش چي هست؟
1- نصب صحیح xampp: در آدرس بار مرورگرتون localhost رو تایپ کنید و Enter کنید، اگر صفحه ی نارنجی رنگ مربوط به برنامه Xampp اومد پس، همه چیز برای نصب xampp درست پیش رفته.
2- قرار دادن پروژه در پوشه htdocs: برای اجرای فایل های PHP توسط xampp حتما باید فایل های PHP تون رو در شاخه ی htdocs محل نصب xampp قرار بدید.
3- فایل با پسوند php.: فایل هاتون حتماً باید با فرمت یا پسوند php. باشند تا توسط سرور پردازش بشن ...!
حالا اگر همه چیز درست پیش رفته باشه، فقط کافی است، در آدرس بار مرورگرتون تایپ کنید localhost://test.php
خب ميشه از طريق مرورگر راحت تو صفحه php مورد نظر رفت و همه چيز درسته...اما زماني ك ما ميخوايم ي فرم رو ب صفحه ي php خاصي ارتباط بديم ديگه نميشه در قسمت action فرم آدرس رو ب صورت localhost داد....زماني ك فرم ب صفحه ي php وصل ميشه آدرس ب اين صورت ميشه:مثلا
file:///C:/xampp/htdocs/Untitled3.php
كه در اين صورت هم دستورات php اصلا نمايش داده نميشه....پس بايد چطور آدرس داد؟
موفق باشید :)
فعالیت خیلی خوبی شروع کردید