PHP/מסד הנתונים MySQL

< PHP

הקדמה

עריכה

מדריך זה מסביר על החיבור של שפת PHP ומסד הנתונים MySQL. מסד הנתונים MySQL תומך בשפת SQL, רצוי לדעת SQL או לפחות לקרוא את המדריכים בנושא. כמו כן, נדרשת היכרות בסיסית עם PHP כמו תחביר של השפה, עבודה עם משתנים וכו'.

MySQL הוא מסד נתונים טבלאי (RDBMS) שמבוסס על קוד פתוח. המסד זמין להורדה לפי רישיון ה-GPL.

  • ניתן לציין כי mysql קל ונוח לשימוש.

התחברות למסד הנתונים

עריכה

החיבור למסד הנתונים נעשה ע"י הפונקציה mysql_connect(). המשתנים של הפונקציה הם שם המשתמש איתו מתחברים למסד הנתונים וסיסמה. אפשר גם לתת לפונקציה את שם השרת אם הוא שונה מערך ברירת המחדל localhost. לדוגמה:

mysql_connect("username","password");

הפונקציה mysql_connect() מחזירה ערך שנקרא Link Identifier ומשמש לזיהוי החיבור לשרת. כמו כן, אפשר להשתמש בו כדי לסגור את החיבור ע"י הפונקציה mysql_close(). לדוגמה:

$connection = mysql_connect("username","password");
mysql_close($connection);

בדרך כלל את החיבור למסד נכניס בתחילת הסקריפט שלנו, ואת ההתנתקות בסופה. במקרים מסויימים אפשר לסגור את החיבור באמצע אם אין בו עוד צורך. כדי שנעשה עבודה מסודרת, רצוי לסגור את החיבור בעצמו, למרות שהוא יסגר עם סיום ריצת הסקריפט.

MySQL - מושג אחד, שלוש משמעויות

עריכה

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

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

הערה: הדוגמה הקשורה לאקסל נתנה לצורה המחשה בלבד, ואין לדקדק בפרטים הטכניים של ההשוואה.

הבחירה של מסד הנתונים נעשית ע" הפונקציה mysql_select_db(), כאשר יש צורך לפרט עם איזה מסד נתונים אנו רוצים לעבוד. דוגמה:

mysql_select_db("database");

הרצת שאילתות

עריכה

לאחר שהתחברנו ל-MySQL ובחרנו את מסד הנתונים, ניתן להריץ עליו שאילתות (Queries). את השאילתות נריץ בעזרת הפונקציה mysql_query(). הפונקציה מקבלת משתנה אחד והוא הטקסט של השאילתה, ומחזירה ערך המציין אם השאילתה הצליחה או לא, כלומר האם היא חוקית או לא. שימו לב שטקסט השאילתה לא חייב להסתיים בנקודה פסיק (';').

במקרה ורוצים לבצע שאילתות על מספר מסדי נתונים, ניתן להשתמש בפונקציה mysql_db_query() וכך אפשר לעשות שאילתה על מסד נתונים שונה מזה שבחרנו, או לא לבחור בכלל וכתוצאה מכך לציין את שם המסד בכל שאילתה. דוגמאות:

$query = mysql_query("SELECT * FROM table");
$query = mysql_db_query("database", "SELECT * FROM table");

לאחר שביצעו את השאילתה ובהנחה שהיא חוקית, נרצה לעשות שימוש כלשהו בנתונים שקיבלנו כתשובה לשאילתה. הדרך הנוחה ביותר היא שימוש בפונקציה mysql_fetch_array(), שמקבלת כמשתנה את הערך של mysql_query() שלצורך הפשטות יקרא מעתה והלאה $query, ומחזירה כפלט מערך המכיל את תוצאות השורה הנוכחית בתשובה.

הערה: בכל קריאה לפונקציה mysql_fetch_array() נקבל אוטומטית את השורה הבאה של השאילתה מאשר בקריאה הקודמת. בנוסף, הפונקציה עובדת רק אם השאילתה היתה SELECT. דוגמה:

$result = mysql_fetch_array($query);

ההתייחסות למידע יכול להיות לפי מספרים, כלומר הטור הראשון בטבלה יהיה $result[0] וכן הלאה או לפני שמות הטורים כאשר יש להם שם: $result["fieldname"].

אם נתייחס לההערה על mysql_fetch_array(), נוכל להפעיל פעולות על כל שורת מידע מתוך הטבלה באמצעות לולאה כמו לולאת While:

while($result = mysql_fetch_array($query)) { }

אפשרות נוספת לשימוש במידע הוא חישוב מספר שורות המידע בתוצאה. החישוב נעשה באמצעות הפונקציה mysql_num_rows(). דוגמה:

$number = mysql_num_rows($query);

ניתן גם להשתמש בפונקציות כגון mysql_result(), mysql_fetch_row(), mysql_fetch_object(), אך לא נרחיב כאן עליהן.

במקרה והשאילתה אינה SELECT אלא INSERT, UPDATE או DELETE ניתן כדי לדעת על כמה שורות השפיעה השאילתה להשתמש בפונקציה mysql_affected_rows(). הפונקציה מתייחסת לשאילתה האחרונה בלבד! אם מדובר על שאילתת INSERT ניתן להשתמש בפונקציה mysql_insert_id() שמחזירה את ערך ה-ID של הנתונים שהוכנסו, אם מוגדר שדה כ-AUTO_INCREMENT. גם כאן הפונקציה מתייחסת לשאילתה האחרונה בלבד.

טיפול בשגיאות

עריכה

ניתן להשתמש בסימן @ כדי להמנע מהופעה של שגיאות. כלומר גם אם יש שגיאה ואמורה להופיע הודעת שגיאה - היא לא תופיעה. מבחינה חיצונית הדבר נראה מקצועי יותר, אך בצורה זאת קשה מאוד לעלות על החלק הבעייתי.

במקרה שיש בעיה ניתן להשתמש בפונקציה mysql_error(). הפונקציה מחזירה טקסט מסויים של הבעיה או מחרוזת ריקה אם אין בעיה. השיטה הנהוגה לשימוש בפונקציה היא בעזרת הפונקציה die() שמחזירה מחרוזת טקסט כלשהי ואז עוצרת את פעולת הסקריפט. לדוגמה:

$connection = mysql_connect("username","password") or die(mysql_error());

הסבר: אם החיבור מתבצע בהצלחה, הפונקציה die() לא תבוצע. אם החיבור נכשל מסיבה כלשהי תבוצע הפונקציה die() שתקרא לפונקציה mysql_error() לפני שהיא תפסיק את הרצת הסקריפט. התוצאה במקרה של שגיאה בחיבור תהיה הודעת השגיאה של mysql_error() ואז הסקריפט יעצר, וזאת כדי למנוע הודעות שגיאה נוספות שיווצרו בגלל שאין קישור ל-MySQL.

דוגמה מסכמת

עריכה

לסכום המדריך, אציג סקריפט PHP המציג נתונים מתוך טבלה בשם people המכילה ת.ז., שם פרטי ושם משפחה של אדם. העמודות בטבלה הן id, first, last.

<html>
<head><title>PHP + MySQL Example Script</title></head>
<body>
<? 
$connection = mysql_connect("username","password") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());
$query = mysql_query("SELECT * FROM people ORDER BY id ASC");
$number = mysql_num_rows($query);
echo "<p>There are $number people in the table</p>";
?>

<table>
<tr>
<td>ID</td>
<td>First Name</td>
<td>Last Name</td>
</tr>

<?
while ($result = mysql_fetch_array($query)) {
?>
<tr>
<td><? echo $result["id"]; ?></td>
<td><? echo $result["first"]; ?></td>
<td><? echo $result["last"]; ?></td>
</tr>

<? } ?>
</table>
<? mysql_close($connection); ?>
</body>
</html>

קישורים חיצוניים

עריכה


הפרק הקודם:
Sessions
מסד הנתונים MySQL הפרק הבא:
גישה למסדי נתונים באמצעות PEAR-DB