توانایی خود را افزایش دهیم

فرهنگ و هنر
توانایی خود را افزایش دهیم

بسم الله الرحمن الرحیم

با سلام

• لطفا مطالب سایت را به صورت منظم پیگیری کنید
• ارائه پیشنهادات و نظرات شما باعث بهبود کیفیت ارائه مطالب خواهد شد

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

طبقه بندی موضوعی
آخرین نظرات
  • ۲۱ خرداد ۹۶، ۲۲:۰۲ - مهدی
    سپاس

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

در این درس با تکنیک دیگری آشنا می شویم که این قدرت را به ما می دهد که داده ها را تغییر دهیم و یا به قول معروف به روزرسانی کنیم. برای توضیح این مهم از تغییر رمز ثبت شده در پایگاه به عنوان یک مثال کارآمد استفاده می کنیم.

 

به روزرسانی داده ها در پایگاه
برای تغییر داده ها در پایگاه باید از دستور دیگری از SQL که برای این کار نوشته شده است استفاده کنیم. صورت کلی دستور به شرح زیر است:

UPDATE نام جدول SET مقدار = ستون, مقدار = ستون بعدی

این دستور با کلمه  UPDATE  یعنی به روزرسانی آغاز می شود و بعد باید نام جدول مورد نظر را داشته باشد.

قسمت بعدی کلمه SET است که باید بعد از آن نام ستون و مقداری که می خواهید در آن قرار گیرد را وارد کنید. به همین ترتیب ستون بعدی و مقدار آن.

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

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

SELECT ID FROM users // انتخاب شماره کاربر از جدول
WHERE email = 'peyman@yahoo.com
AND username = 'peyman' ; //    از جایی که رایانامه و شناسه آن برابر این مقدار است

 تا به اینجا ما شماره ID آن کاربر را از جدول users  از جایی که رایانامه او برابر 'peyman@yahoo.com' و شناسه کاربری او برابر peyman است بدست می آوریم. فرض کنید که این شماره ۵۲ است. قدم بعدی به روزرسانی نام از طریق همین شماره است.

UPDATE users  // به روزرسانی جدول
SET first_name = 'pejman'  //  مقدار نام را قرار بده 
WHERE ID = 52 ; //  در جایی که شماره آن برابر مقدار روبرو است

نکته مورد توجه اینجا استفاده از عبارت WHERE است که در هر دو قسمت برای مشخص کردن ناحیه جستجو و یا به روزرسانی به کار برده شده است.

برای درک بیشتر این دستورات و نحوه کاربرد آن در پی اچ پی سراغ برگه دیگری می رویم.

 

به روزرسانی رمز کاربری
برای انجام این مهم یک برگه دیگر در پوشه خود درست می کنیم، نام برگه را password.php می گذاریم و کدهای زیر را در آن می نویسیم:

<?php
$page_title = ' بروزرسانی رمز ' ;
include ('includes/header.html' ) ;
// بررسی ارسال فرم
if (isset($_POST['submitted']))  {
require_once ('db_connection.php') ; 
$errors = array(); 
// بررسی رایانامه
if (empty($_POST['email']))  {
$errors[] = 'لطفا رایانامه را وارد کنید';
} else {
$e = mysqli_real_escape_string($dbc, trim($_POST['email'])) ;
}
// بررسی رمز فعلی
if (empty($_POST['pass']))  {
$errors[] = ' رمز فعلی را وارد کنید';
} else {
$p = mysqli_real_escape_string($dbc, trim($_POST['pass']));
}
// برابری رمز تازه و تکرار آن 
if (!empty($_POST['pass1']))  {
if ($_POST['pass1'] != $_POST['pass2'])  {
$errors[] = ' رمزهای تازه باید یکسان باشند ' ;
} else {
$np = mysqli_real_escape_string($dbc, trim($_POST['pass1'])) ;
}
} else {
$errors[] = 'رمز تازه را وارد نکردید ' ;
}
if (empty($errors)) {   // در صورت درستی یعنی اگر اشکالی نبود و آرایه خطاها خالی بود
// بررسی رایانامه و رمز وارد شده
$q = "SELECT ID FROM users WHERE (email='$e' AND password=SHA1('$p') )" ;
$r = @mysqli_query($dbc, $q) ;
$num = @mysqli_num_rows($r) ;
if ($num == 1) { // اگر برابر بودند مقدار یک درست می شود
// شماره کاربر را می گیرد
$row = mysqli_fetch_array($r, MYSQLI_NUM);
// پرسوجو برای بروزرسانی 
$q = "UPDATE users SET password=SHA1('$np') WHERE ID = $row[0] " ;
$r = @mysqli_query($dbc, $q);
if (mysqli_affected_rows($dbc) == 1) { // اگر درست کار کرد
// خروجی موفقیت
echo '<h1> سپاسگزاریم</h1>
<p> رمز شما به روزرسانی شد </p><p><br /></p>';
} else { // اگر درست کار نکرد
// پیام خطا
echo '<h1> خطای سیستم </h1>
<p class="error">رمز شما به خاطر خطای سیستم تغییر نیافت  </p>'; 
// پیغام کد خطا
echo '<p>' . @mysqli_error($dbc) . '<br /><br /> پرسوجو : ' . $q . '</p>';
}
include ('includes/footer.html'); 
exit();
} else { // اگر روز و شناسه درست نبودند
echo '<h1> خطا </h1>
<p class="error"> رمز و رایانامه وارد شده یافت نشد </p>';
}
} else { // چاپ خطاها
echo '<h1> خطا </h1>
<p class="error">خطای زیر اتفاق افتاد  <br />';
foreach ($errors as $msg) { 
echo " $msg - <br /> ";
}
echo '</p><p> لطفا دوباره امتحان کنید</p><p><br /></p>';

mysqli_close($dbc); // ارتباط با پایگاه بسته می شود

?>
</form>
<!-- کد برای ساخت فرم - form.html -->
<form action="password.php" method="post">
<fieldset>
<legend align="right"> فرم به روزرسانی رمز</legend>
<label> رایانامه </label>
<input type="text" name="email" value="<?php if (isset($_POST['email'])) echo $_POST['email']; ?>"  />
<label> رمز فعلی </label>
<input type="password" name="pass" />
<label> رمز تازه </label>
<input type="password" name="pass1" />
<label>  تکرار رمز </label>
<input type="password" name="pass2"  />
</fieldset>
<input type="submit" name="submit" value="ارسال" class="submit"/>
<input type="hidden" name="submitted" value="TRUE" />
</form>
<?php
include ('includes/footer.html');
?>

 

تغییر برگه سربرگ
برای آورده شدن این برگه لطفا ابتدا کد زیر را در برگه header.html وارد کنید:

<li><a href="password.php">  به روزرسانی رمز </a></li>

حتما می دانید که این کد باید در زیر کدهای دیگر فهرست ناوبری ما قرار گیرید:

<ul>
<li><a href="index.php"> خانه</a></li>
<li><a href="register.php">  ثبت نام </a></li>
<li><a href="view.php">  کاربران </a></li>
<li><a href="password.php">  به روزرسانی رمز </a></li>
</ul>

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

همانطور که مشاهده می کنید دکمه به روزرسانی رمز اضافه شده و فرم تغییر رمز در آن پدیدار گشته است.

شرح کد برگه بروزرسانی رمز  password.php
ابتدایی ترین المان این برگه پس از علامت <?php  که شروع کدهای پی اچ پی است، انتخاب نام برگه است و بعد وارد کردن برگه سربرگ.

$page_title = ' بروزرسانی رمز ';
include ('includes/header.html');

شرط ابتدایی بررسی می کند که آیا دکمه «ارسال» انتخاب شده است یا نه، که در صورت درستی شرط وارد بلوک آن می شود. حال باید با پایگاه ارتباط برقرار کرد و بعد آرایه ای برای ثبت خطاها. دقت کنید که از شرح بیشتر مواردی که قبلا توضیح داده شده خودداری می شود.

// بررسی ارسال فرم
if (isset($_POST['submitted'])) {
require_once ('db_connection.php'); 
$errors = array();

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

// بررسی رایانامه
if (empty($_POST['email'])) {
$errors[] = 'لطفا رایانامه را وارد کنید';
} else {
$e = mysqli_real_escape_string($dbc, trim($_POST['email']));
}
// بررسی رمز فعلی
if (empty($_POST['pass'])) {
$errors[] = ' رمز فعلی را وارد کنید';
} else {
$p = mysqli_real_escape_string($dbc, trim($_POST['pass']));
}

اما در شرط سوم به دلیل اینکه برای ثبت و به روزرسانی رمز تازه کاربر باید این رمز را دو بار بنویسد، یک شرط دیگر اضافه شده که برابری رمز تازه و تکرار آن را بررسی می کند.

// برابری رمز تازه و تکرار آن 
if (!empty($_POST['pass1'])) {
if ($_POST['pass1'] != $_POST['pass2']) {
$errors[] = ' رمزهای تازه باید یکسان باشند ';
} else {
$np = mysqli_real_escape_string($dbc, trim($_POST['pass1']));
}
} else {
$errors[] = 'رمز تازه را وارد نکردید ';
}

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

if (empty($errors)) { // در صورت درستی یعنی اگر اشکالی نبود و آرایه خطاها خالی بود
// بررسی رایانامه و رمز وارد شده
$q = "SELECT ID FROM users WHERE (email='$e' AND password=SHA1('$p') )";
$r = @mysqli_query($dbc, $q);
$num = @mysqli_num_rows($r);

اگر متغیر آرایه ای خطاها خالی بود، ابتدا یک پرسوجو (Query) برای گرفتن شماره کاربر مورد نظر با توجه به رایانامه و رمز ابتدایی که وارد کرده می نویسیم. پرسوجو را اجرا و نتیجه آن را در داخل متغیر $r می گذاریم. خط آخر این دسته کد، تعداد خروجی این پرسوجو پس از اجرا را در متغیر $num می گذارد.

if ($num == 1) { // اگر برابر بودند مقدار یک درست می شود
// شماره کاربر را می گیرد
$row = mysqli_fetch_array($r, MYSQLI_NUM);

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

// پرسوجو برای به روزرسانی 
$q = "UPDATE users SET password=SHA1('$np') WHERE ID = $row[0] " ;
$r = @mysqli_query($dbc, $q);

دستوری که به عنوان پرسوجو می نویسیم این است که رمز تازه را وارد ستون رمز کاربر، با شماره ای که ارائه می دهیم، بکند. یعنی می گوییم جدول users را انتخاب کن و رمز را در خانه رمز کاربر با شماره $row[0] قرار بده. $row[0] یک آرایه است و با توجه به کلید این آرایه که 0 است، این آرایه داده خانه ابتدایی که همان ID در جدول users است را در خود دارد.

if (mysqli_affected_rows($dbc) == 1) { // اگر درست کار کرد
// خروجی موفقیت
echo '<h1> سپاسگزاریم</h1>
<p> رمز شما به روزرسانی شد </p><p><br /></p>';

این قسمت کد با یک شرطی، اطمینان حاصل می کند که یکی از رکوردهای جدول به روزرسانی شده است.  این عمل با تابع  mysqli_affected_rows($dbc) انجام شده است که بررسی می کند آیا رکوردی تغییر کرده یا نه. اگر این تابع برابر ۱ باشد، یعنی رکوردی به روزرسانی شده و پیغام موفقیت صادر می شود.

} else { // اگر درست کار نکرد
// پیام خطا
echo '<h1> خطای سیستم </h1>
<p class="error">رمز شما به خاطر خطای سیستمی تغییر نیافت  </p>'; 
// پیغام کد خطا
echo '<p>' . @mysqli_error($dbc) . '<br /><br /> پرسوجو : ' . $q . '</p>';
}
include ('includes/footer.html'); 
exit();

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

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

} else { // اگر روز و شناسه درست نبودند
echo '<h1> خطا </h1>
<p class="error"> رمز و رایانامه وارد شده یافت نشد </p>';
}

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

} else { // چاپ خطاها
echo '<h1> خطا </h1>
<p class="error">خطای زیر اتفاق افتاد  <br />';
foreach ($errors as $msg) { 
echo " $msg - <br /> ";

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

mysqli_close($dbc); // ارتباط با پایگاه بسته می شود
انتهای این برگه با بستن ارتباط با پایگاه داده ها و بعد چاپ فرم.

به این ترتیب ما برگه ای به نام «بروزرسانی رمز» اضافه کرده و کار به روزرسانی پایگاه داده ها را با توجه به رایانامه کاربر مورد نظر انجام دادیم. برای اینکه این تغییرات صورت پذیرد، ما باید رایانامه کاربر مورد نظر را وارد کنیم.

در درس بعدی با تکنیک دیگری آشنا می شویم که دیگر نیازی به وارد کردن رایانامه و یا هر اطلاعات دیگری برای انجام به روزرسانی نباشد.

 

موافقین ۰ مخالفین ۰ ۹۳/۰۴/۲۲

نظرات  (۰)

هیچ نظری هنوز ثبت نشده است

ارسال نظر

کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی