ساختن یک صفحه وب :
برای این که اطلاعات یا درخواستهای کاربر را دریافت کنیم، 3 روش وجود دارد استفاده از URLs/Links (GET) استفاده از Forms(POST) استفاده از Cookies
دو فایل php خواهیم ساخت، یکی به نام firstPage و دیگری به نام secondPage، حال میخواهیم از صفحه اول به صفحه دوم برویم برای این کار از تگ a مربوط به html استفاده میکنیم و آدرس صفحهای را که میخواهم در href قرار میدهیم، وقتی بر روی لینک ایجاد شده کلیک کنیم به صفحه دوم میرویم، اگر بخواهیم پارامتری به صفحه دوم بفرستیم میتوانیم با استفاده از کویری استرینگ این کار را انجام دهیم. برای این کار بعد از آدرس صفحه مورد نظر علامت سوال قرار میدهیم و نام کاراکتر علامت مساوی و سپس مقداری که میخواهیم انتقال پیدا کند را مینویسیم، در مثال وقتی روی لینک ایجاد شده کلیک کنیم، به صفحه دوم میرویم اگر به URL دقت کنید میبینید که http://localhost/codes/secondPage.php?id=2 چاپ شده است .
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>First</title> </head> <body> <?php $linkName = 'Second Page'?> <?php $id=2;?> <a href="secondPage.php?id=<?php echo $id;?>"><?php echo $linkName;?></a> </body> </html>
حال باید این داده را در صفحه دوم بگیریم برای این کار از سوپرگلوبالی به نام $_GET استفاده میکنیم، به صفحه دوم بروید و متغیری به نام id یا هر نام دیگری ایجاد کنید، سپس با استفاده از $_GET مقدار id را درون آن بریزید و چاپ کنید، برای آن که ببینید در $_GET چه چیزهایی وجود دارد میتوانید آن را print_r کنید.
<pre> <?php print_r($_GET); ?> </pre> <?php echo 'My Id is: '.$id = $_GET['id'];; ?>
در هنگام استفاده از URL ممکنه است مشکلاتی ایجاد شود. بعضی از کلمات برای url معنی خاصی دارند مثلا &، اگر بخواهیم دو پارامتر را در url ارسال کنیم از این علامت استفاده میکنیم
<?php $linkName = 'Second Page'?> <?php $id=2;?> <?php $company='darkoob & web';?> <a href="secondPage.php?id=<?php echo $id;?>&company=<?php echo $company;?>"><?php echo $linkName;?></a>
همان طور که میبینید در صفحه اول پارامتر company را در url ارسال کردیم که داخل آن darkoob & we وجود دارد اما وقتی در صفحه دوم این پارامتر را میگیریم فقط darkoob برای من چاپ میشود چرا چون علامت & برای تعریف یک کاراکتر دیگر در url استفاده میشود، در اینجا web به عنوان یک پارامتر دیگر در نظر گرفته شده است. برای رفع این مشکل از urlencode استفاده میکنیم .
<?php $linkName = 'Second Page'?> <?php $id=2;?> <?php $company='darkoob & web';?> <a href="secondPage.php?id=<?php echo $id;?>&company=<?php echo urlencode($company);?>"><?php echo $linkName;?></a>
ممکن است بخواهیم آدرسی را در url ارسال کنیم، نه فقط یک پارامتر را برای این کار از rawurlencode استفاده میکنیم.
urlencode برای کویری استرینگها و rawurlencode برای مسیرها است به مثال زیر دقت کنید.
<?php $linkName = 'Second Page'; $page = 'Molana Jalalodin Balkhi'; $quote = 'besh no az ney chon he ka yat mikonad'; $link1 = '/bio/'.rawurlencode($page).'?quote='.urlencode($quote); $link2 = '/bio/'.urlencode($page).'?quote='.rawurlencode($quote); echo $link1.'<br>'; echo $link2.'<br>'; ?>
اگر کدبالا را اجرا کنیم خروجی زیر را خواهید دید .
در لینک اول سیستم به دنبال bio/Molana فاصله jalalodin … میگردد اما در لینک دوم سیستم به دنبال /bio/Molana+Jalalodin+Balkhi خواهد گشت، اما ما چیزی به اسم Molana+Jalalodin+Balkhi نداریم. این تفاوت استفاده از rawurlencodeو urlencode است.
فقط url ها نیستند که کاراکترهای رزرو شده دارند بلکه html نیز همین گونه است. فرض کنید میخواهم لینکی بسازیم و در آن بنویسم<Click>&lean more در این صورت html این عبارت را به عنوان یک تگ میشناسد و <Click> نمایش داده نمیشود.
<a href=""> <Click> & Learn more </a> برای رفع این مشکل از htmlspecialchars استفاده میکنم. <a href=""> <?php echo htmlspecialchars('<Click> & Learn more'); ?> </a>
بعد از استفاده از htmlspecialchars
حال که مطالب جلسه گذشته را فرا گرفتیم، یک url فرضی خواهیم ساخت.
<?php $urlPage = 'php/created/page/url.php'; $param1 = 'This is a string < >'; $param2 = '&#?*$[]+ are bad characters'; $linktext = '<Click> & learn more'; $url = 'http://localhost/'; $url .= rawurlencode($urlPage); $url .= '?' . 'param1=' . urlencode($param1); $url .= '&' . 'param2=' . urlencode($param2); ?> <a href="<?php echo htmlspecialchars($url); ?>"> <?php echo htmlspecialchars($linktext); ?> </a>
چنین لینکی وجود ندارد، اما روی لینک به کلیک کنید و در نوار آدرس، آدرس ایجاد شده را ببینید.
کاملا صحیح ایجاد شده است و درست همان چیزی چاپ میشود که میخواهیم .
اگر بخواهیم از فانکشنی که در یک صفحه php وجود دارد داخل صفحه دیگری استفاده کنیم چه کاری باید انجام دهیم ؟؟؟
از include یا require ، include_once ، require_once استفاده میکنیم.
تفاوت آنها در این است که اگر از include استفاده کنید، اما صفحه مورد نظر وجود نداشته باشد، برنامه هم چنان به کار خود ادامه خواهد داد. اما در هنگام استفاده از require اگر صفحه وجود نداشته باشد میگوید “هی صفحه مورد نظر وجود نداره و این صفحه خیلی مهمه”، برای مثال در صفحهای که مربوط به اتصالات دیتابیس شما میباشد بهتر است از reqire استفاده کنید .
Include_once() فقط یک بار عمل اینکلود را انجام میدهد و اگر دوباره بخواهیم این عمل انجام شود این کار انجام نخواهد شد .
فکر میکنم عمل کرد require_once نیز مشخص شده باشد.
من 3 فایل php ایجاد میکنم به نامهای
:inclideFunctions <?php function hello($name){ return "Hello {$name}"; } includesHeader : <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Includes</title> </head> <body>
سپس از این صفحهها در صفحه سوم خود یعنی includes استفاده میکنم :
<?php include('includedHeader.php'); include('includedFunctions.php'); ?> <?php echo hello('EveryOne'); ?> </body> </html>
Page Redirection :
فرض کنید کاربر میخواهد وارد سایت ما شود، اگر اطلاعات را اشتباه وارد کرد باید او را یه یک صفحه مشخص و اگر درست وارد کرد به صفحهی دیگری راهنمایی کنیم.
برای این کار از header استفاده خواهیم کرد.
<?php function redirectTo($newLocation){ header('Location:'.$newLocation); exit; } redirectTo('basic.php'); ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Redirect</title> </head> <body> </body> </html>
در مثال فوق هر موقع به صفحهی redirect.php برویم بدون معطلی به صفحه basic.php انتقال خواهیم یافت.
کار با فرم :
دو فایل php میسازم اولی form.php نام دارد، داخل آن فرمی قرار دارد که اطلاعات را با متد post ارسال میکند. بعد از زدن دکمه submit در این صفحه به صفحه formProcessing.php منتقل میشویم، در formProcessing.php اطلاعات دریافت و چاپ میشوند.
Form.php: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Form</title> </head> <body> <form action="formProcessing.php" method="post"> <p>Username:<input type="text" name="username" value=""></p> <p>Username:<input type="password" name="password" value=""></p> <p><input type="submit" name="submit" value="submit"></p> </form> </body> </html> formProcessing.php <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Form Processing</title> </head> <body> <pre> <?php print_r($_POST); echo '</pre>'; echo '<br>'; if(isset($_POST['submit'])){ echo 'form was submited<br>'; if (isset($_POST['username'])){ $username = $_POST['username']; }else{ $username = 'default'; } if(isset($_POST['password'])){ $password = $_POST['password']; }else $password = 'default'; } $username = isset($_POST['username']) ? $_POST['username'] : 'default'; $password = isset($_POST['password']) ? $_POST['password'] : 'default'; echo 'My username is: '.$username.' My password is: '.$password; ?> </body> </html>
برای اینکه ببینیم چه چیزی در $_POST قرار دارد می توانیم آن را print_r کنیم، میدانیم که چگونه از $_POST اطلاعات را بگیریم اما مشکل اینجاست که ممکنه است اصلا اطلاعات پست نشده باشند در این صورت با خطا مواجه میشیم، برای رفع خطا چک میکنیم اگر دکمه سابمیت زده شده بود (اگر دکمه سابمیت زده شود مقدار کلید سابمیت، سابمیت خواهد بود. پس میتوانیم با isset آن را چک کنیم ).آنگاه چک کن اگر username ست شده بود مقدار آن داخل متغییر username قرار گیرد (می توانید همان لحظه چاپش کنید ) در غیر این صورت داخل متغییر username کلمه default قرار گیرد.
برای password نیز همین کار را کردم
$username = isset($_POST['username']) ? $_POST['username'] : 'default'; $password = isset($_POST['password']) ? $_POST['password'] : 'default';
بعد از آن به این دو خط کد میرسید این دو خط همان کار if else را برای ما انجام میدهند، قسمت اول شرط یک شرط بولین است یعنی جواب یا true یا false میباشد. سپس علامت سوال بعد از آن کاری که اگر جواب true بود میخواهیم انجام شود را مینویسیم، بعد علامت دو نقطه بعد از آن کاری که اگر شرط false بود میخواهیم انجام شود را مینویسیم. اگر مستقیما وارد صفحه formProcessing.php شوید میبینید که مقادیر دیفالت برای ما چاپ میشوند و منظور مرا بهتر متوجه میشوید.
اگر بخواهیم یک فرم تنها را پروسس کنیم چگونه این عمل را انجام دهیم ؟؟
برای این کار آدرس همان صفحه را در action فرم قرار میدهیم، در مثال زیر من چک میکنم اگر submit زده شد مقدار username , password در داخل متغییرهای username , password قرار گیرد سپس اگر username ما برابر پوریا و password برابر 222 بود به صفحه basic.php برو در غیر این صورت پیام خطا چاپ شود.
<?php require_once('includedFunctions.php'); if (isset($_POST['submit'])) { $username = $_POST['username']; $password = $_POST['password']; if ($username == 'pouria' && $password == '222') { redirectTo('basic.php'); } else { $message = 'Wrong username or password'; } } else { $username = ''; $message = 'Please log in '; } ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Form Single</title> </head> <body> <?php echo $message; ?> <form action="formSingle.php" method="post"> <p>Username:<input type="text" name="username" value=""></p> <p>Password:<input type="password" name="password" value=""></p> <p><input type="submit" name="submit" value="submit"></p> </form> </body> </html>
همین طور صفحهای به نام includedFunctions.php ساختم که در آن فانکشنی برای ریدایرکت کردن ایجاد شده است، در کد بالا میبینید که این صفحه را include_once کردم.
includedFunctions.php :
<?php function redirectTo($newLocation) { header('Location' . $newLocation); exit(); }
دیدید که چگونه، یک صفحه را پروسس و خطاه ارا چاپ کردیم، حال برای اعتبارسنجی validation خود چند فانکشن ایجاد میکنیم، فایلی به نام validationFunction.php میسازیم و کدهای زیر را در داخل آن قرار میدهیم در این فایل قرار است طول رشته و اینکه وجود دارد یا نه چک شود.
<?php function hasPresence($value) { return isset($value) && $value !== ""; } function hasMaxLength($value, $max) { return strlen($value) <= $max; } function formErrors($errors = array()) { $output = ''; if (!empty($errors)) { $output .= '<div class="error"> Please fix the following errors'; $output .= '<ul>'; foreach ($errors as $key => $error) { $output .= "<li>{$error}</li>"; } $output .= '</ul></div>'; } return $output; } ?>
فانکشن hasPresence چک میکند اگر ورودی ما وجود داشت و خالی نبود مقدار true و در غیر این صورت مقدار false را به ما بر میگرداند، فانکشن hasMaxLength طول رشته را چک میکند، فانکشن formErrors آرایهای از خطا ها را دریافت میکند، قرار است ما خطاهای خود را در داخل آرایه ریخته و به این فانکشن پاس دهیم، تا این فانکشن خطاها را برای ما چاپ کند.
به فایل formSingle باز میگردیم :
<?php require_once('includedFunctions.php'); require_once('validationFunctions.php'); $errors = array(); $message = ''; if (isset($_POST['submit'])) { $username = trim($_POST['username']); $password = trim($_POST['password']); $fieldsRequired = array('username', 'password'); foreach ($fieldsRequired as $field) { $value = trim($_POST[$field]); if (!hasPresence($value)) { $errors[$field] = ucwords($field) . ' Cant be blank'; } } $fieldsWithMaxLengths = array('username'=>30,'password'=>8); foreach ($fieldsWithMaxLengths as $field =>$maxVal){ $value = trim($_POST[$field]); if(!hasMaxLength($value,$maxVal)){ $errors[$field] = ucfirst($field).' is too long'; } } if (empty($errors)) { if ($username == 'pouria' && $password == '222') { redirectTo('basic.php'); } else { $message = 'Username/Password not match'; } } } else { $username = ''; $message = 'Please log in '; } ?> <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Form Single</title> </head> <body> <?php echo $message; ?> <?php echo formErrors($errors); ?> <form action="formSingle.php" method="post"> <p>Username:<input type="text" name="username" value=""></p> <p>Password:<input type="password" name="password" value=""></p> <p><input type="submit" name="submit" value="submit"></p> </form> </body> </html>
و اما کدهای اضافه شده، ابتدا با دستور require_once فایل validationFunctions.php را فراخوانی میکنیم، میخواهم چک کنیم تا فیلدهای مان خالی نباشد. برای این کار باید از hasPresence که نوشته بودیم استفاده کنیم.
برای چک کردن username , password آرایهای به نام fieldsRequired میسازیم. که داخل این آرایه username, password وجود دارد. البته نام آنها، سپس با یک foreach هرکدام از آنها را در داخل فانکشن hasPresence قرار میدهیم و چک میکنیم .
بیاید طول username , password را نیز چک کنیم تا از 30 و 8 بیشتر نباشد برای این کار هم مشابه قبل عمل میکنیم .
در قسمت پایین نیز برای اینکه بتواینم خطاها را مشاهده کنیم بعد از چاپ messege فانکشن formErrors را صدا زدیم. در آخر چک میکنیم اگر آرایه errors خالی بود، انتقال انجام شود.
به صفحه formSingle.php باز گردید یک بار username و یک بار password را خالی رها کنید میبینید که به برای شما پیغام خطا چاپ میشود یا پسورد را بیش از 8 کاراکتر قرار دهید خطای مربوطه نمایش داده خواهد شد.
به خاطر داشته باشید که شما میتوانید این اعمال را به گونهای دیگر نیز انجام دهید.