וובמאסטר - תיכנות ובניית אתרים

מדריך PHP: קבצים ב-PHP

רן בר-זיק ,‏ אינטרנט ישראל‏ ‏/‏ 25 פברואר, 2011
F+
F-

כשאני אומר קבצים - אני מתכוון לקבצים שכרגע נמצאים על השרת ואנו רוצים לטפל בהם. איך הם מגיעים לשרת? אנחנו נדבר על כך בהמשך. אבל בואו וניצור קובץ בשם txt ונמקם אותו באותה תיקיה שבה עמוד ה-PHP שלנו נמצא. נכתוב בו משהו כמו למשל:

Hello
my
name
is
text

ונשמור אותו בשם text.txt (מקורי, נכון?). הוא יהיה הקובץ שעליו נתאמן. מה שאנו רוצים לעשות זה לפתוח את הקובץ. קובץ, בדיוק כמו פלט שמגיע מ-MySQL הוא resource שניתן לקרוא אותו שורה אחר שורה.

<?php
$my_file = fopen('test.txt', 'r');

print fgets($my_file).'<br />';
print fgets($my_file).'<br />';
print fgets($my_file).'<br />';
print fgets($my_file).'<br />';
print fgets($my_file).'<br />';
fclose($my_file);

בואו ונסביר את הקוד, ראשית אני יוצר קריאה לקובץ באמצעות fopen, ל-fopen יש שני ארגומנטים – הראשון הוא שם הקובץ (הקובץ צריך להיות באותה תיקיה של הסקריפט, אחרת תכינו את עצמכם לכתוב נתיב) ושנית סוג הפתיחה, כאשר יש כמה סוגי פתיחה. הבולטים שבהם הם r (קריאה בלבד) ו-r+ (קריאה וכתיבה).

ברגע שאנו פותחים את הקובץ 'לתוך' משתנה בשם my_file, יש לנו גם פוינטר. הפוינטר החביב הזה מצביע על השורה הראשונה בקובץ. בכל קריאה של שורה – הפוינטר שלנו יתקדם קדימה (כמו ב-MySQL). אם אני ארצה להדפיס 5 שורות, אני אצטרך לכתוב:

print fgets($my_file).'<br />';

5 פעמים, בכל פעם מודפסת השורה של הפוינטר ואז הפוינטר זז קדימה וכך הלאה.

בסופו של יום אני כותב:

fclose($my_file);

כדי לסגור את החיבור ולמנוע זליגת זכרון.

די ברור שזה די אידיוטי לכתוב 5 פעמים את אותה השורה. למה שלא נעשה את זה עם while? נפתח את הקובץ עם fopen כמקובל ואז נבקש ממנו שידפיס:

print fgets($my_file).'<br />';

וימשיך בהדפסה כל עוד יש עוד שורות בקובץ. לא יותר הגיוני? עושים את זה ככה:

<?php
$my_file = fopen('test.txt', 'r');

while(!feof($my_file)) {
    print fgets($my_file).'<br />';
}

fclose($my_file);

מה יש לנו פה? פשוט while רגיל שממשיך בהדפסה כל עוד התנאי

!feof($my_file)

מתקיים. פונקצית feof מחזירה true אם הפוינטר שלנו הגיע לסוף השורה. כן, זה בדיוק כמו ב-MySQL.

ככה קוראים קובץ טקסט פשוט, אנחנו יכולים לקרוא כל קובץ שהוא!

יצירת קובץ חדש

אם אין לנו קובץ ואנו רוצים ליצור אותו, אין יותר פשוט מזה! זה מאד דומה לשיטת הקריאה, אנו עדיין משתמשים ב-fopen, רק משתמשים בהרשאת w – כתיבה:

<?php
$my_file = fopen("my_test.txt", 'w');

fclose($my_file );

זה יצור לכם בתיקיה את הקובץ שרציתם. פשוט, לא?

כתיבה לקובץ

כתיבה לקובץ נעשית באמצעות fwrite שמקבלת שני ארגומנטים – המשתנה המוביל אל הקובץ ומה שאנחנו רוצים להכניס לתוכו:

<?php
$my_file = fopen("my_test.txt", 'r+');
fwrite($my_file, 'hello! I came from the script!');

fclose($my_file );

נסו ותהנו! אל תשכחו לוודא שה-fopen נעשה עם הרשאת r+. הרשאת r+ פותחת את הקובץ לקריאה ולכתיבה וממקמת את הפוינטר בתחילת המסמך. תנסו להריץ את זה כמה פעמים – תוכלו לראות שלמרות שכביכול הרצנו את הסקריפט כמה פעמים, אנו רואים רק שורה אחת בקובץ my_test.txt – זה בגלל שהפוינטר של הכתיבה זז בכל פעם לתחילת הקובץ. אם אני רוצה להוסיף לקובץ, אני אשתמש בהרשאת a+ - הרשאת הכתיבה הממקמת את הפוינטר בסוף הקובץ:

<?php
$my_file = fopen("my_test.txt", 'a+');
fwrite($my_file, 'hello! I came from the script!');

fclose($my_file );

זה יוסיף את הטקסט לקובץ. אם תריצו אותו כמה פעמים תוכלו לראות שהטקסט נוסף לקובץ ויש לנו כמה טקסטים. אם עדיין לא הבנתם פשוט תריצו את שני הסקריפטים.

מחיקת קבצים

קל מאד למחוק כל קובץ שהוא באמצעות פקודת unlink:

unlink('my_test.txt');

זה מוחק את הקובץ שיצרנו.

אל תשכחו ששמות הקבצים שנכנסים ל-fopen צריכים להיות או אבסולוטיים (c:\myfiles\mydir\myfile.txt) או יחסיים ביחס לסקריפט. איך יודעים מה שם התיקיה שהסקריפט רץ בה או מה שם הכונן הקשיח? בדיוק בשביל זה יש את משתנה $_SERVER הסופר גלובלי שלמדנו עליו באחד המאמרים הקודמים.

טיפול בקבצי csv

אחד הדברים השימושיים ביותר בטיפול בקבצים הוא טיפול בקבצי csv. אני משער שכולכם יודעים מה הם קבצי csv. בואו וניצור קובץ כזה באמצעות האקסל!

Creating CSV file with Excel

את הקובץ הזה נשמור כ-csv (ראשי תבות של comma separated values) נלך לשמירה ונבחר ב-other formats:

Saving the file as CSV

ואז נבחר ב-csv:

choosing location for our CSV file

לאחר האזהרות הרגילות, יווצר לנו קובץ שנראה כך:

CSV file in notepad

זה נקרא קובץ csv והוא קובץ פופולרי למדי, PHP מסוגלת לעבוד איתו בקלות ולהפוך כל שורה למערך סדור. איך עושים את זה? בקלות:

<?php
$my_file = fopen('test.csv', 'r');

while (!feof($my_file) ) {
    $line_of_text = fgetcsv($my_file);
    print $line_of_text[0] . $line_of_text[1]. $line_of_text[2] . '<br />';
}

fclose($my_file);

מתיחסים לקובץ ה-csv בדיוק כמו כל קובץ טקסט אחר, אבל במקום fgets אנו משתמשים ב-fgetcsv שמפרק לנו את השורה לאיברים במערך שאותם אנו יכולים להדפיס או להכניס למערך משלנו.

פתיחת קובץ ini

קבצי ini משמשים אותנו להגדרות שונות – קבצי ini נראים כך:

Example of ini file in notepad

משתמשים בקבצים אלו על מנת ליצור הגדרות שונות או לבצע לוקליזציה (למשל לכתוב את שם מחרוזת הטקסט ואז את התרגום). PHP מאפשרת לנו להמיר קבצי ini במכה למערכים. איך עושים את זה? פשוט מאד! בואו וניצור קובץ ini בשם test.ini לפי הדוגמא שלעיל. אחרי כן, כל מה שעלי לעשות הוא להעלות את קובץ ה-ini באמצעות פונקציה שנקראת parse_ini_file שמחזירה לי את קובץ ה-ini כמערך:

<?php 
$ini_array = parse_ini_file('test.ini');
print_r($ini_array);

נסו ותהנו!

רן בר-זיק, אינטרנט ישראל

מתכנת PHP מנוסה ובעל ידע רב בפיתוח לאינטרנט על בסיס LAMP. מומחה במערכות דרופל, ג'ומלה ו-וורדפרס. שולט היטב בכל מה שקשור לפרונט אנד: JavaScript: jQuery ו-MooTools,ActionScript 2/3 וכמובן HTML 5 + CSS 3.

אינטרנט ישראל: www.internet-israel.com
תגיות: PHP‏  /  פיתוח‏  /  טיפול בקבצים‏  

תגובות בפייסבוק

תגובות למאמר



עוד במדריך

תגיות פופולאריות

X
הצטרף לעמוד שלנו בפייסבוק להישאר מעודכן!
וובמאסטר © כל הזכויות שמורות