آموزش کامل PHP – قسمت 18: ویرایش داده های بانک

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

ویرایش داده ها در بانک اطلاعاتی mysql

در ادامه پروژه ای که در قسمت های قبل ساختیم، پوشه cms را باز کرده و فایل جدیدی به نام edit.php در آن ایجاد می کنیم. در این فایل قصد داریم مانند روشی که اطلاعات را در فایل ایندکس به نمایش در آوردیم، لیست مطالب را نشان دهیم؛ با این تفاوت که این بار فقط عنوان مطالب را نمایش می دهیم و در کنار هر مطلب گزینه ای برای ویرایش آن قرار می دهیم. کد های زیر را در فایل edit قرار دهید:

<!DOCTYPE html>

<html dir="rtl" lang="fa-IR">

<head>

<title>ویرایش مطلب</title>

<meta charset="utf-8" />

</head>

<body style="font-family: tahoma; font-size:14px;">

<center>

<?php

include ("config.php");

//select all records from posts table

$get_query = mysql_query("SELECT * FROM `posts`");

//now using while for get each record sepratly and show it to web browser

while ($fetch_result = mysql_fetch_array($get_query))

{

$postTitle = $fetch_result['title'];

$postText = $fetch_result['text'];

$postId = $fetch_result['id'];

echo "<h2><a href=single.php?id=$postId>$postTitle</a> (<a href=editpost.php?id=$postId>ویرایش</a>)</h2>";

}

?>

</center>

</body>

</html>

حال به بررسی کد بالا می‌پردازیم. ابتدا فایل config.php را در صفحه فراخوانی کرده‌ایم تا اتصال به بانک اطلاعاتی انجام شده و سپس جدول مورد نظر ما برای انجام عملیات‌ مختلف انتخاب شود. سپس همانند آنچه در مورد خواندن اطلاعات در فایل index.php انجام دادیم، عنوان مطالب را با یک کوئری از بانک اطلاعاتی MySQL دریافت کرده و سپس آن‌ها را نمایش می‌دهیم. با این تفاوت که در اینجا متن مطلب را نمایش نمی‌دهیم، در عوض جلو عنوان هر مطلب یک لینک با عنوان ویرایش قرار داده‌ایم و آن را با فایلی به نام editpost.php ست کرده‌ایم. در واقع همانند لینک ثابتی که برای نمایش هر مطلب در فایل index ایجاد کردیم در این فایل نیز یک لینک پویا برای ویرایش هر مطلب ایجاد کرده‌ایم.

از آنجا که id هر مطلب منحصر به فرد است، از آن برای ایجاد لینک ویرایش هر مطلب استفاده کرده‌ایم. بنابراین با کلیک روی لینک ویرایش هر مطلب، id آن مطلب را به فایل editpost.php ارسال می‌کنیم تا در آن با دستور GET، شناسه مطلب مورد نظر را دریافت کرده و بر اساس آن شناسه اطلاعات پست انتخاب شده را از بانک اطلاعاتی دریافت کنیم. بعد از اجرای فایل edti.php صفحه‌ ای مانند تصویر زیر مشاهده می کنید:

php 18 - پردیس وردپرس

یک فایل جدید دیگر به نام  editpost.php ایجاد کنید و کد های زیر را در آن قرار دهید:

<!DOCTYPE html>

<html dir="rtl" lang="fa-IR">

<head>

<title>ویرایش مطلب</title>

<meta charset="utf-8" />

</head>

<body style="font-family: tahoma; font-size:14px;">

<?php

include ("config.php");

$pid = $_GET['id'];

//select post that its id = pid

$get_query = mysql_query("SELECT * FROM `posts` WHERE `id` = '$pid' ");

$fetch_result = mysql_fetch_array($get_query);

$postTitle = $fetch_result['title'];

$postText = $fetch_result['text'];

?>

<center>

<form action="editpost2.php" method="post">

عنوان مطلب : <input type="text" name="postTitle" size="40" value="<?php echo $postTitle;?>"><br>

متن مطلب: <br>

<textarea name="postText" rows="10" cols="50">

<?php echo $postText;?>

</textarea>

<br>

<input type="hidden" name="postID" value="<?php echo $pid;?>">

<input type="submit" value="ثبت مطلب">

</form>

</center>

</body>

</html>

همانطور که مشاهده می‌کنید باز هم ابتدا فایل config.php را فراخوانی می‌کنیم. سپس همانند کاری که در فایل single.php انجام داده بودیم، ابتدا از طریق دستور GET_$ شناسه پستی که قصد ویرایش آن را داریم دریافت کرده و با استفاده از یک کوئری شرطی، تمامی مشخصات مطلبی که شناسه آن را دریافت کرده‌ایم را از بانک اطلاعاتی استخراج می کنیم و عنوان و متن مطلب را در دو متغیر قرار می‌دهیم. سپس فرمی مانند فرمی که در فایل insert.php ایجاد کرده بودیم، ایجاد کرده ولی این بار بخش action را برابر editpost2.php قرار می‌دهیم؛ زیرا قصد داریم محتویات این فرم به فایل editpost2.php ارسال شود. سپس در فرم خود برای فیلد عنوان یک خاصیت جدید به نام Value را تعریف کرده‌ایم تا مقدار عنوان دریافت شده از بانک اطلاعاتی را در آن قرار دهیم.

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

<?php echo $postTitle;?>

همانطور که می‌دانید این کد، متغیر postTitle را چاپ می‌کند و هر مقداری که در مشخصه Value فیلدهای متنی قرار داده شود، به صورت پیش‌فرض در آن فیلد قرار داده خواهد شد. سپس در textarea مربوط به متن نیز به همین صورت و با استفاده از کد زیر عمل می کنیم:

<?php echo $postText;?>

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

<input type=”hidden” name=”postID” value=”<?php echo $pid;?>”>

این فیلد به کاربر نمایش داده نمی‌شود چراکه نوع آن hidden تعیین شده است. اما سایر خواص این فیلد نیز همانند فیلدهای معمولی است. نام این فیلد postID تعیین شده و مقدار آن نیز برابر با شناسه مطلب است که قصد ویرایش آن را داریم و در بالای صفحه با استفاده از دستور GET_$ آن را در متغیری به نام pid ذخیره کرده بودیم.

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

php 18-2 - پردیس وردپرس

به لینک این صفحه توجه کنید. در ادامه نام فایل id=1 است که نشان می دهد ما قصد ویرایش مطلبی که شناسه id آن برابر ۱ است را داریم. البته دقت کنید در نام‌گذاری متغیر URL می‌توانید به جای id از هر متغییر دیگری نیز استفاده کنید ولی در این صورت باید در فایل editpost.php نیز در محلی که با دستور GET_$ می‌خواهیم id پست را دریافت کنیم، از نام انتخابی خود استفاده کنیم.

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

<!DOCTYPE html>

<html dir="rtl" lang="fa-IR">

<head>

<title>درج مطلب</title>

<meta charset="utf-8" />

</head>

<body style="font-family: tahoma; font-size:14px;">

<center>

<?php

include ("config.php");

$newtitle = trim ($_POST['postTitle']);

$newText = trim ($_POST['postText']);

$pid = $_POST['postID'];

if($newtitle != "" && $newText != ""){

//do insert

$query_res = mysql_query("UPDATE `posts` SET `title` = '$newtitle', `text` = '$newText' WHERE `id` = '$pid'");

if($query_res){

echo "مطلب با موفقیت ویرایش شد.";

}else{

echo "مشکلی در ویرایش مطلب رخ داده است. مجددا تلاش کنید";

}

}else{

echo '<a href=edit.php>لیست مطالب</a>';

}

?>

</center>

</body>

</html>

در این فایل نیز پس از فراخوانی config.php، مقادیری که از فرم editpost.php ارسال شده را با روشی که پیش از این در جلسات قبلی آموخته‌اید در متغیرهایی به نام newTitle، newText و pid ذخیره کرده ایم. سپس با یک دستور شرطی if بررسی می‌کنیم که کاربر مقادیر فیلدهای عنوان و متن مطلب را حتما وارد کرده باشد. اگر فیلد عنوان و متن مطلب خالی نباشد شرط برقرار بوده و عملیات ویرایش انجام خواهد شد.

برای ویرایش مطالب باید از کوئری UPDATE استفاده کنیم. همانطور که در کد بالا مشاهده می‌کنید، کد بروزسانی اطلاعات در جدول post به صورت زیر است:

$query_res = mysql_query(“UPDATE ‘posts’ SET ‘title’ = ‘$newtitle’, ‘text’ = ‘$newText’ WHERE ‘id’ = ‘$pid'”);

مشاهده می کنید که ابتدا دستور UPDATE را نوشته و سپس نام جدولی که قصد ویرایش رکوردهای آن را داریم می‌نویسیم. نام جدول ما در اینجا posts است و سپس کلمه کلیدی SET را اضافه می‌کنیم. حالا به تعداد فیلدهایی که قصد ویرایش آن‌ها را داریم ابتدا نام فیلد رکورد مورد نظر را نوشته و سپس مقدار جدید را بعد از = قرار می‌دهیم. در اینجا ‘title’ = ‘$newtitle’ است که یعنی مقدار فیلد title برابر با مقدار جدیدی که در متغیر newTitle ذخیره کرده بودیم شود. به همین صورت فیلدهای دیگر را نیز در این کوئری می‌نویسیم.

در آخر باید یک شرط نیز برای کوئری خود تعیین کنیم و به MYSQL بگوییم که فقط مطلبی را ویرایش کند که شناسه id آن برابر متغیر pid است. اگر این شرط را ننویسید، تمامی رکوردها یعنی تمامی مطالب ذخیره شده در بانک اطلاعاتی ما و در جدول posts با مقادر جدید جایگزین خواهند شد و قطعا ما نمی‌خواهیم این اتفاق رخ دهد. پس دلیل استفاده از شرطی که در انتهای این کوئری بکار برده‌ایم را اکنون می‌دانید.

در نهایت همانند آنچه در فایل ثبت مطلب انجام دادیم، با یک شرط بررسی می‌کنیم که آیا کوئری به درستی انجام شده یا خیر. اگر نتیجه کوئری که در متغییر query_res ذخیره شده true باشد پیغام موفقیت آمیز بودن ویرایش مطلب نمایش داده می‌شود و اگر false باشد، پیغامی مبنی بر عدم موفقیت ویرایش مطلب به کاربر نشان داده خواهد شد.

اگر مراحل را تا به این قسمت به درستی انجام داده باشید پس از اعمال تغییرات در پست مورد نظر خود باید با صفحه‌ای مثل تصویر زیر مواجه شوید:

php 18-3 - پردیس وردپرس

 

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