در ادامه سری آموزشی پیاچپی قصد داریم در مورد فایلها و کارهایی که با پیاچپی میتوان با فایلها انجام داد صحبت کنیم. میتوان از فایلها به منظور ذخیره کردن اطلاعات بهره گرفت یا در شرایط گوناگون از آنها استفاده کرد. در ادامه با ما همراه باشید.
در این بخش پس از اینکه چند جلسه به طور کامل در مورد بانک اطلاعاتی MySQL صحبت کرده بودیم، به سراغ مبحث فایلها در پیاچپی میرویم.
پیاچپی توابع مختلفی را برای گشودن، بستن، ویرایش و نوشتن بر روی فایلها در اختیار توسعهدهندگان قرار داده است. تابع fopen برای ایجاد یک فایل جدید یا باز کردن فایل بهکار میرود. اگر فایلی که در این تابع نامش را بکار میبریم وجود داشته باشد باز میشود و اگر وجود نداشته باشد ایجاد میشود. دقت کنید برای کار با فایلها باید با سطوح دسترسی نیز آشنایی داشته باشید. در توابع کار با فایل دسترسیهای زیر مورد استفاده قرار میگیرند:
r: باز کردن و فقط خواندن فایل
w: باز کردن فایل برای نوشتن اطلاعات. محتویات فایل را پاک میکند یا اگر فایل وجود نداشته باشد آن را میسازد.
a: باز کردن فایل فقط برای نوشتن در آن
x: ایجاد فایل جدید فقط برای نوشتن در آن
+r: باز کردن فایل برای نوشتن/خواندن
+w: باز کردن فایل برای نوشتن/خواندن اطلاعات. محتویات فایل را پاک میکند یا اگر فایل وجود نداشته باشد آن را میسازد.
+a: باز کردن فایل به منظور نوشتن/خواندن. اگر فایل وجود نداشته باشد آن را ایجاد میکند.
+x: ایجاد فایل جدید برای خواندن/نوشتن
مثل همیشه نرمافزار Xampp را اجرا و سرور آپاچی و mysql را در حالت اجرا قرار دهید. در پوشه htdocs یک پوشه جدید به نام files ایجاد کرده و در این پوشه یک فایل به نام testfile.php ایجاد کنید. در این فایل کدهای زیر را قرار دهید:
<?php
$myfile = fopen(“file.txt”, “w”);
?>
حالا فایل بالا را با مرورگر اجرا کنید. برای این منظور باید به آدرس http://127.0.0.1/files/testfile.php مراجعه کنید. پس از اجرای این آدرس در مروگر، یک فایل جدید به نام file.txt در پوشهای که فایل testfile.php وجود دارد ساخته خواهد شد.
نوشتن روی فایلها
برای نوشتن اطلاعات در فایلها از تابع fwrite استفاده میکنیم. این تابع دو پارامتر ورودی دارد که پارامتر اول نام فایلی است که قصد نوشتن اطلاعات در آن را داریم و پارامتر دوم متنی است که میخواهیم در فایل نوشته شود. در مثال زیر قصد داریم تا چند نام را در فایل جدیدی به نام names.txt بنویسیم:
<?php
//open or create file
$myfile = fopen(“names.txt”, “w”);
//now write new names to that file
$name1 = “mojtaba\n”;
fwrite($myfile, $name1);
$name2 = “miaad\n”;
fwrite($myfile, $name2);
$name3 = “masoud\n”;
fwrite($myfile, $name3);
fclose($myfile);
?>
همانطور که احتمالا متوجه شدهاید در انتهای کد از تابع دیگری به نام fclose استفاده کردهایم. از آنجا که چندبار در کد بالا فایل names.txt را فراخوانی کردهایم، با این تابع در انتهای کار فایل موردنظر را میبندیم.
نکته دیگری که در مورد کد بالا وجود دارد این است که در انتهای هر نام از کاراکتر n\ استفاده کردهایم. افرادی که با اچتیامال آشنایی داشته باشند قطعا مفهوم این کاراکتر را میدانند. از n\ به منظور ایجاد خط جدید در فایلها استفاده میکنیم. به این ترتیب در فایل names.txt هر نام در یک خط جدید قرار خواهد گرفت. در نتیجه اگر پس از اجرای کد پیاچپی فوق در مرورگر فایل names.txt را باز کنید به شکل زیر خواهد بود:
mojtaba
miaad
masoud
همانطور که گفتیم تابع ()fclose به منظور بستن یک فایل مورداستفاده قرار میگیرد. این تابع اگر فایل را به درستی و با موفقیت ببندد مقدار true را برمیگرداند و در غیر اینصورت مقدار false برگردانده میشود.
نکته کاربردی: برای تمرین و نیز در انجام دادن پروژههای خود بهتر از همیشه پس از کار با فایلها آنها را با تابع ()fclose ببندید.
افزودن اطلاعات به فایل
اگر قصد دارید اطلاعات جدیدی را به فایل موردنظر خود اضافه کنید باید آن فایل را در حالت Append باز کنید. به عنوان مثال به کد زیر دقت کنید:
<?php
$myFile = “test.txt”;
$fh = fopen($myFile, “a”);
fwrite($fh, “new information to be added test file!”);
fclose($fh);
?>
در کد بالا و در تمامی مواقعی که یک فایل را در حالت a باز کنید، اطلاعات جدید در آخر فایل اضافه خواهند شد. به عنوان مثال فرض کنید محتویات فایلی به نام file.txt به صورت زیر است:
some data
line 2 of file
حال اگر با استفاده از حالت a این فایل را باز کنیم و اطلاعات جدید به آن اضافه کنیم، به عنوان مثال عبارت new data را به این فایل اضافه کنیم، این فایل به صورت زیر بهروزرسانی خواهد شد:
some data
line 2 of file
new data
حال قصد داریم یک مثال کاربردیتر را ایجاد کنیم. در پوشه files که به تازگی در پوشه htdocs ایجاد کرده بودید، یک فایل به نام add.php ایجاد کنید. کد زیر را در این فایل قرار دهید:
<?php
if (isset($_POST[‘text’]))
{
$name = $_POST[‘text’] . “\n”;
$handle = fopen (“names.txt”, “a”);
fwrite($handle, $name);
fclose($handle);
}
?>
<form method=”post” action=””>
name : <input type=”text” name=”text” size=”20″>
<input type=”submit” value=”add name to file”>
</form>
حال کد بالا را با استفاده از آدرس http://127.0.0.1/files/add.php اجرا کنید. در کد بالا چند نکته مهم وجود دارد. ابتدا به بخش پیاچپی کاری نداشته باشید و فقط فرم را در نظر بگیرید. در کد بالا خاصیت action فرم را خالی گذاشتهایم. در چنین شرایطی اطلاعات این فرم به همین صفحه یعنی فایل add.php ارسال خواهد شد. حال به کد پیاچپی در بالای فایل توجه کنید. ابتدا مثل همیشه با یک دستور شرطی if بررسی میکنید که اگر اطلاعاتی در فیلدی که خاصیت name آن text است وارد شده، آنگاه فایل names.txt در حالت a باز شود، و سپس نام وارد شده به انتهای محتویات فایل باز شده اضافه خواهد شد. همچنین به خط:
$name = $_POST[‘text’] . “\n”;
در کد بالا توجه کنید. در این خط نام وارد شده توسط کاربر را از فرم دریافت کرده و سپس کاراکتر n\ را به انتهای نام اضافه میکنیم تا پس از اضافه شدن در فایل names.txt یک خط جدید ایجاد شود تا نامهای بعدی به همین شکل در یک خط جدید در فایل درج شوند.
پیش از ادامه کار لازم است یک حلقه جدید به نام foreach را به شما آموزش دهیم. اگر خاطرتان باشد در مبحث حلقهها گفتیم که در پیاچپی حلقههای دیگری هم وجود دارند که در جلسات آینده به آنها میپردازیم.
دقت کنید که Foreach فقط برای آرایهها مورد استفاده قرار خواهد گرفت و در واقع در هر بار اجرای حلقه کلید و محتوای یک عضو از آرایه را بر میگرداند. دو روش کلی برای استفاده از این حلقه وجود دارد که در زیر آورده شدهاند:
foreach (array as $value){
//code to run
}
//or
foreach (array as $key => $value){
//code to run
}
در روش اول، مقدار هر عضو از آرایه موردنظر در هر بار اجرای حلقه در متغیری به نام value$ قرار میگیرد و در هر بار اجرای حلقه میتوان یک عضو ار آرایه را به عنوان مثال چاپ کرد یا عملیات دلخواه را روی آن انجام داد.
اما در روش دوم، کلید هر عضو از آرایه را به key$ تغییر دادهایم و سپس مقدار هر عضو آرایه را در متغیر value$ قرار میدهیم. اگر مبحث آرایهها را بهخوبی فراگرفته باشید این حلقه را نیز بهخوبی یاد میگیرید.
در هرحال برای درک بهتر این حلقه به مثال زیر توجه کنید. در این مثال یک آرایه به نام names داریم که شامل چند نام است. قصد داریم با استفاده از حلقه foreach تک تک نامهای موجود در این آرایه را چاپ کنیم:
<?php
$AllNames = Array(“mojtaba”, “hossein”, “miaad”, “hami”, “masoud”,”mehdi”);
foreach ($AllNames as $name)
{
echo $name . “<br>”;
}
?>
با اجرای کد فوق، تمامی نامهای موجود در آرایه AllNames هر کدام در یک خط در مرورگر نمایش خواهند یافت. حال که با این حلقه هم آشنا شدید به ادامه مبحث این جلسه میپردازیم.
خواندن فایلها
با استفاده از تابع ()file میتوانیم فایل موردنظرمان را بخوانیم. این تابع فایل موردنظر را در قالب یک آرایه برای ما آماده میکند و هر المان از فایل را به عنوان یک عضو از آرایه در نظر میگیرد. فایل names.txt که در این جلسه ایجاد کردهاید اکنون باید شامل چند نام باشد. در واقع در هر خط از این فایل یک نام نوشته شده است.
حال در پوشه files که در پوشه htdocs ایجاد کرده بودید، یک فایل جدید به نام read.php ایجاد کنید. سپس کد زیر را در این فایل قرار دهید:
<?php
$read = file(“names.txt”);
foreach($read as $name)
{
echo $name . ” – “;
}
?>
کد بالا تمام نامهای موجود در فایل names.txt را که در کنار فایل read.php وجود دارد خوانده و آنها را با علامت – از هم جدا میکند. از آنجا که در اینجا محتویات فایل در یک آرایه قرار داده شده از foreach استفاده کردهایم، همانطور که گفتیم این حلقه فقط برای آرایهها بکار گرفته میشود.
در کد بالا از آنجا که پس از هر نام یک علامت خط فاصله – قرار دادهایم، پس از رسیدن به انتهای فایل باز هم پس از نام آخر یک علامت – قرار خواهد گرفت. برای جلوگیری از اضافه شدن خط فاصله پس از آخرین نام باید ابتدا بفهمیم که چه زمانی به انتهای فایل رسیدهایم. بدین منظور از کدی مثل کد زیر باید استفاده کنید:
$read = file(“names.txt”);
$count = count($read);
$i = 1;
foreach ($read as $line)
{
echo $line;if($i < $count){
echo ” – “;
}
$i++;
}
?>
در کد بالا ابتدا با تابع count اقدام به شمارش تعداد اعضای آرایه read$ کردهایم. همانطور که میدانید آرایه یاد شده در واقع دربرگیرنده محتویات فایل names.txt است. سپس با یک حلقه for تمامی اعضای این آرایه را چاپ میکنیم و در هر بار اجرای حلقه یک واحد به متغیر i$ اضافه میکنیم. این متغیر تعداد خطوط را نگهداری میکند. در شرط حلقه بررسی میکنیم که آیا به آخرین خط فایل یعنی آخرین عضو آرایه read رسیدهایم یا خیر، اگر همچنان به انتهای فایل نرسیده باشیم کاراکتر – در ادامه نام چاپ میشود و اگر به آخرین خط فایل رسیده باشیم از آنجا که در حلقه چنین شرطی را نوشتهایم، پس شرط برای خط آخر برقرار نیست و کاراکتر – پس از نام چاپ نمیشود.
اصول کار با فایلها را نیز در این جلسه یاد گرفتید و امیداوریم مباحث این جلسه نیز مورد رضایت شما واقع شده باشد. در صورتی که هرگونه سوالی در مورد این جلسه دارید لطفا آن را در بخش نظرات اعلام کنید. در جلسات آینده به تکمیل سیستم مدیریت محتوای خود براساس آنچه تاکنون آموختهایم خواهیم پرداخت. همچنین پس از تکمیل این سیستم مدیریت محتوا سری جدید آمورش پیاچپی در سطح حرفهایتر را آغاز خواهیم کرد.