PHP/מסד הנתונים MySQL: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
יונת (שיחה | תרומות)
מ PHP:php and mySQL הועבר לPHP/מסד הנתונים MySQL: חלק מהספר PHP
יונת (שיחה | תרומות)
ויקיזציה
שורה 1:
===הקדמה===
<h3>הקדמה</h3><p >מדריך זה מסביר על החיבור של שפת PHP ומסד הנתונים MySQL. מסד הנתונים MySQL תומך בשפת SQL, רצוי לדעת SQL או לפחות לקרוא את המדריכים בנושא. כמו כן, נדרשת היכרות בסיסית עם PHP כמו תחביר של השפה, עבודה עם משתנים וכו'.</p>
מדריך זה מסביר על החיבור של שפת PHP ומסד הנתונים MySQL. מסד הנתונים MySQL תומך בשפת SQL, רצוי לדעת SQL או לפחות לקרוא את המדריכים בנושא. כמו כן, נדרשת היכרות בסיסית עם PHP כמו תחביר של השפה, עבודה עם משתנים וכו'.
 
<p >MySQL הוא מסד נתונים טבלאי (RDBMS) שמ שמבוסס על קוד פתוח. המסד זמין להורדה לפי רישיון ה-GPL.</p>
<h3>התחברות למסד הנתונים</h3><p >החיבור למסד הנתונים נעשה ע"י הפונקציה <code >mysql_connect()</code>. המשתנים של הפונקציה הם שם המשתמש איתו מתחברים למסד הנתונים וסיסמה. אפשר גם לתת לפונקציה את שם השרת אם הוא שונה מערך ברירת המחדל localhost. לדוגמה:</p>
<p ><code><div style="text-align:left; direction:ltr;">
mysql_connect("username","password");
</div></code></p>
<p >הפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_connect()
</div></code> מחזירה ערך שנקרא Link Identifier ומשמש לזיהוי החיבור לשרת. כמו כן, אפשר להשתמש בו כדי לסגור את החיבור ע"י הפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_close()
</div></code>. לדוגמה:</p>
<p ><code ><div style="text-align:left; direction:ltr;">
$connection = mysql_connect("username","password");
mysql_close($connection);
</div></code></p>
 
===התחברות למסד הנתונים===
<p >בדרך כלל את החיבור למסד נכניס בתחילת הסקריפט שלנו, ואת ההתנתקות בסופה. במקרים מסויימים אפשר לסגור את החיבור באמצע אם אין בו עוד צורך. כדי שנעשה עבודה מסודרת, רצוי לסגור את החיבור בעצמו, למרות שהוא יסגר עם סיום ריצת הסקריפט.</p>
החיבור למסד הנתונים נעשה ע"י הפונקציה {{קוד בשורה|mysql_connect()}}. המשתנים של הפונקציה הם שם המשתמש איתו מתחברים למסד הנתונים וסיסמה. אפשר גם לתת לפונקציה את שם השרת אם הוא שונה מערך ברירת המחדל localhost. לדוגמה:
<h3>MySQL - מושג אחד, שלוש משמעויות</h3><p >לאחר שהתחברנו למסד הנתונים נבחר את מסד הנתונים איתו אנו רוצים לעבוד. המשפט הקודם נשמע מאוד מבלבל בהתחלה. אנסה לתת דוגמה כדי להבהיר אותו: בכל קובץ אקסל יש מספר גליונות, כאשר כל גיליון מכיל נתונים שונים. אנו מבדילים בין גליון אקסל (שם נשמרים הנתונים), לבין קובץ אקסל (אוסף של כמה גליונות) לבין תוכנת אקסל (איתה אנחנו עורכים את הקבצים והגליונות). אם נעשה השוואה בין אקסל ל-MySQL התוצאה תהיה: התוכנה שאיתה אנחנו עורכים היא MySQL, הקובץ הוא מסד הנתונים, וגליונות הם טבלאות. כלומר מסד הנתונים MySQL מורכב מכמה מסדי נתונים שכל אחד מהם מכיל מספר טבלאות.</p>
<div style="direction:ltr;">
<p >הבלבול נובע מהעובדה שכשמדברים על מסדי נתונים המבוססים על SQL, מנסים לשמור על כלליות. כלומר מה שעובד על מסד נתונים אחד, יעבוד גם על השני בגלל ששניהם מבוססים על SQL. מסיבה זאת לא נוהגים להזכיר כל פעם לאיזה מסד נתונים מתחברים, כי זה לא משנה לעקרון שהדברים יעבדו. אם נקח את המשפט שהתחלנו איתו ונמקד אותו הוא יכתב כך: "לאחר שהתחברנו לתוכנת מסד הנתונים MySQL נבחר את מסד הנתונים איתו אנו רוצים לעבוד". מכיוון שמדריך זה עוסק רק ב-MySQL לא נזכיר כל פעם שמדובר ב-MySQL, אך ניתן לראות זאת ע"י שמות הפונקציות שבשימוש.</p>
mysql_connect("username","password");
<p >הערה: הדוגמה הקשורה לאקסל נתנה לצורה המחשה בלבד, ואין לדקדק בפרטים הטכניים של ההשוואה.</p>
</div>
<p >הבחירה של מסד הנתונים נעשית ע" הפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_select_db()
</div></code>, כאשר יש צורך לפרט עם איזה מסד נתונתים אנו רוצים לעבוד. דוגמה:</p>
<p ><code ><div style="text-align:left; direction:ltr;">
mysql_select_db("database");
</div></code></p>
 
הפונקציה {{קוד בשורה|mysql_connect()}} מחזירה ערך שנקרא Link Identifier ומשמש לזיהוי החיבור לשרת. כמו כן, אפשר להשתמש בו כדי לסגור את החיבור ע"י הפונקציה {{קוד בשורה|mysql_close()}}. לדוגמה:
<p style="text-align: center;">&copy; 1999-2005 כל הזכויות שמורות ל-Guides.co.il</p>
<div style="direction:ltr;">
$connection = mysql_connect("username","password");
mysql_close($connection);
</div>
 
בדרך כלל את החיבור למסד נכניס בתחילת הסקריפט שלנו, ואת ההתנתקות בסופה. במקרים מסויימים אפשר לסגור את החיבור באמצע אם אין בו עוד צורך. כדי שנעשה עבודה מסודרת, רצוי לסגור את החיבור בעצמו, למרות שהוא יסגר עם סיום ריצת הסקריפט.
<h3>הרצת שאילתות</h3><p >לאחר שהתחברנו ל-MySQL ובחרנו את מסד הנתונים, ניתן להריץ עליו שאילתות (Queries). את השאילתות נריץ בעזרת הפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_query()
</div></code>. הפונקציה מקבלת משתנה אחד והוא הטקסט של השאילתה, ומחזירה ערך המציין אם השאילתה הצליחה או לא, כלומר האם היא חוקית או לא. שימו לב שטקסט השאילתה לא חייב להסתיים בנקודה פסיק (';').</p>
<p >במקרה ורוצים לבצע שאילתות על מספר מסדי נתונים, ניתן להשתמש בפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_db_query()
</div></code> וכך אפשר לעשות שאילתה על מסד נתונים שונה מזה שבחרנו, או לא לבחור בכלל וכתוצאה מכך לציין את שם המסד בכל שאילתה. דוגמאות:</p>
<p ><code ><div style="text-align:left; direction:ltr;">
$query = mysql_query("SELECT * FROM table");
$query = mysql_db_query("database", "SELECT * FROM table");
</div></code></p>
<p >לאחר שביצעו את השאילתה ובהנחה שהיא חוקית, נרצה לעשות שימוש כלשהו בנתונים שקיבלנו כתשובה לשאילתה. הדרך הנוחה ביותר היא שימוש בפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_fetch_array()
</div></code>, שמקבלת כמשתנה את הערך של <code ><div style="text-align:left; direction:ltr;">
mysql_query()
</div></code> שלצורך הפשטות יקרא מעתה והלאה <code ><div style="text-align:left; direction:ltr;">
$query
</div></code>, ומחזירה כפלט מערך המכיל את תוצאות השורה הנוכחית בתשובה.</p>
 
===MySQL - מושג אחד, שלוש משמעויות===
<p >הערה: בכל קריאה לפונקציה <code ><div style="text-align:left; direction:ltr;">
לאחר שהתחברנו למסד הנתונים נבחר את מסד הנתונים איתו אנו רוצים לעבוד. המשפט הקודם נשמע מאוד מבלבל בהתחלה. אנסה לתת דוגמה כדי להבהיר אותו: בכל קובץ אקסל יש מספר גליונות, כאשר כל גיליון מכיל נתונים שונים. אנו מבדילים בין גליון אקסל (שם נשמרים הנתונים), לבין קובץ אקסל (אוסף של כמה גליונות) לבין תוכנת אקסל (איתה אנחנו עורכים את הקבצים והגליונות). אם נעשה השוואה בין אקסל ל-MySQL התוצאה תהיה: התוכנה שאיתה אנחנו עורכים היא MySQL, הקובץ הוא מסד הנתונים, וגליונות הם טבלאות. כלומר מסד הנתונים MySQL מורכב מכמה מסדי נתונים שכל אחד מהם מכיל מספר טבלאות.
mysql_fetch_array()
</div></code> נקבל אוטומטית את השורה הבאה של השאילתה מאשר בקריאה הקודמת. בנוסף, הפונקציה עובדת רק אם השאילתה היתה SELECT. דוגמה:</p>
<p ><code ><div style="text-align:left; direction:ltr;">
$result = mysql_fetch_array($query);
</div></code></p>
<p >ההתייחסות למידע יכול להיות לפי מספרים, כלומר הטור הראשון בטבלה יהיה <code ><div style="text-align:left; direction:ltr;">
$result[0]
</div></code> וכן הלאה או לפני שמות הטורים כאשר יש להם שם: <code ><div style="text-align:left; direction:ltr;">
$result["fieldname"]
</div></code>.</p>
<p >אם נתייחס לההערה על <code ><div style="text-align:left; direction:ltr;">
mysql_fetch_array()
</div></code>, נוכל להפעיל פעולות על כל שורת מידע מתוך הטבלה באמצעות לולאה כמו לולאת While:</p>
 
הבלבול נובע מהעובדה שכשמדברים על מסדי נתונים המבוססים על SQL, מנסים לשמור על כלליות. כלומר מה שעובד על מסד נתונים אחד, יעבוד גם על השני בגלל ששניהם מבוססים על SQL. מסיבה זאת לא נוהגים להזכיר כל פעם לאיזה מסד נתונים מתחברים, כי זה לא משנה לעקרון שהדברים יעבדו. אם נקח את המשפט שהתחלנו איתו ונמקד אותו הוא יכתב כך: "לאחר שהתחברנו לתוכנת מסד הנתונים MySQL נבחר את מסד הנתונים איתו אנו רוצים לעבוד". מכיוון שמדריך זה עוסק רק ב-MySQL לא נזכיר כל פעם שמדובר ב-MySQL, אך ניתן לראות זאת ע"י שמות הפונקציות שבשימוש.
<p ><code ><div style="text-align:left; direction:ltr;">
while($result = mysql_fetch_array($query)) { }
</div></code></p>
<p >אפשרות נוספת לשימוש במידע הוא חישוב מספר שורות המידע בתוצאה. החישוב נעשה באמצעות הפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_num_rows()
</div></code>. דוגמה:</p>
<p ><code ><div style="text-align:left; direction:ltr;">
$number = mysql_num_rows($query);
</div></code></p>
<p >ניתן גם להשתמש בפונקציות כגון <code ><div style="text-align:left; direction:ltr;">
mysql_result(), mysql_fetch_row(), mysql_fetch_object()
</div></code>, אך לא נרחיב כאן עליהן.</p>
<p >במקרה והשאילתה אינה SELECT אלא INSERT, UPDATE או DELETE ניתן כדי לדעת על כמה שורות השפיעה השאילתה להשתמש בפונקציה <code >mysql_affected_rows()</code>. הפונקציה מתייחסת לשאילתה האחרונה בלבד! אם מדובר על שאילתת INSERT ניתן להשתמש בפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_insert_id()
</div></code> שמחזירה את ערך ה-ID של הנתונים שהוכנסו, אם מוגדר שדה כ-AUTO_INCREMENT. גם כאן הפונקציה מתייחסת לשאילתה האחרונה בלבד.</p>
 
הערה: הדוגמה הקשורה לאקסל נתנה לצורה המחשה בלבד, ואין לדקדק בפרטים הטכניים של ההשוואה.
<p style="text-align: center;">&copy; 1999-2005 כל הזכויות שמורות ל-Guides.co.il</p>
<h3>טיפול בשגיאות</h3><p >ניתן להשתמש בסימן @ כדי להמנע מהופעה של שגיאות. כלומר גם אם יש שגיאה ואמורה להופיעה הודעת שגיאה - היא לא תופיעה. מבחינה חיצונית הדבר נראה מקצועי יותר, אך בצורה זאת קשה מאוד לעלות על החלק הבעייתי.</p>
<p >במקרה שיש בעיה ניתן להשתמש בפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_error()
</div></code>. הפונקציה מחזירה טקסט מסויים של הבעיה או מחרוזת ריקה אם אין בעיה. השיטה הנהוגה לשימוש בפונקציה היא בעזרת הפונקציה die() שמחזירה מחרוזת טקסט כלשהי ואז עוצרת את פעולת הסקריפט. לדוגמה:</p>
<p ><code ><div style="text-align:left; direction:ltr;">
$connection = mysql_connect("username","password") or die(mysql_error());
</div></code></p>
<p >הסבר: אם החיבור מתבצע בהצלחה, הפונקציה <code ><div style="text-align:left; direction:ltr;">
die()
</div></code> לא תבוצע. אם החיבור נכשל מסיבה כלשהי תבוצע הפונקציה die() שתקרא לפונקציה <code ><div style="text-align:left; direction:ltr;">
mysql_error()
</div></code> לפני שהיא תפסיק את הרצת הסקריפט. התוצאה במקרה של שגיאה בחיבור תהיה הודעת השגיאה של <code >mysql_error()</code> ואז הסקריפט יעצר, וזאת כדי למנוע הודעות שגיאה נוספות שיווצרו בגלל שאין קישור ל-MySQL.</p>
 
הבחירה של מסד הנתונים נעשית ע" הפונקציה {{קוד בשורה|mysql_select_db()}}, כאשר יש צורך לפרט עם איזה מסד נתונתים אנו רוצים לעבוד. דוגמה:
<h3>דוגמה מסכמת</h3><p >לסכום המדריך, אציג סקריפט PHP המציג נתונים מתוך טבלה בשם people המכילה ת.ז., שם פרטי ושם משפחה של אדם. העמודות בטבלה הן id, first, last.</p>
<div style="direction:ltr;">
<p ><code >
mysql_select_db("database");
<div style="text-align:left; direction:ltr;">
</div>
&lt;html&gt;
&lt;head&gt;&lt;title&gt;PHP + MySQL Example Script&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;?
$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 "&lt;p&gt;There are $number people in the table&lt;/p&gt;";
?&gt;
 
===הרצת שאילתות===
&lt;table&gt;
לאחר שהתחברנו ל-MySQL ובחרנו את מסד הנתונים, ניתן להריץ עליו שאילתות (Queries). את השאילתות נריץ בעזרת הפונקציה {{קוד בשורה|mysql_query()}}. הפונקציה מקבלת משתנה אחד והוא הטקסט של השאילתה, ומחזירה ערך המציין אם השאילתה הצליחה או לא, כלומר האם היא חוקית או לא. שימו לב שטקסט השאילתה לא חייב להסתיים בנקודה פסיק (';').
&lt;tr&gt;
 
&lt;td&gt;ID&lt;/td&gt;
במקרה ורוצים לבצע שאילתות על מספר מסדי נתונים, ניתן להשתמש בפונקציה {{קוד בשורה|mysql_db_query()}} וכך אפשר לעשות שאילתה על מסד נתונים שונה מזה שבחרנו, או לא לבחור בכלל וכתוצאה מכך לציין את שם המסד בכל שאילתה. דוגמאות:
&lt;td&gt;First Name&lt;/td&gt;
<div style="direction:ltr;">
&lt;td&gt;Last Name&lt;/td&gt;
$query = mysql_query("SELECT * FROM table");
&lt;/tr&gt;
$query = mysql_db_query("database", "SELECT * FROM table");
</div>
 
לאחר שביצעו את השאילתה ובהנחה שהיא חוקית, נרצה לעשות שימוש כלשהו בנתונים שקיבלנו כתשובה לשאילתה. הדרך הנוחה ביותר היא שימוש בפונקציה {{קוד בשורה|mysql_fetch_array()}}, שמקבלת כמשתנה את הערך של {{קוד בשורה|mysql_query()}} שלצורך הפשטות יקרא מעתה והלאה {{קוד בשורה|$query}}, ומחזירה כפלט מערך המכיל את תוצאות השורה הנוכחית בתשובה.
 
הערה: בכל קריאה לפונקציה {{קוד בשורה|mysql_fetch_array()}} נקבל אוטומטית את השורה הבאה של השאילתה מאשר בקריאה הקודמת. בנוסף, הפונקציה עובדת רק אם השאילתה היתה SELECT. דוגמה:
<div style="direction:ltr;">
$result = mysql_fetch_array($query);
</div>
 
ההתייחסות למידע יכול להיות לפי מספרים, כלומר הטור הראשון בטבלה יהיה {{קוד בשורה|$result[0]}} וכן הלאה או לפני שמות הטורים כאשר יש להם שם: {{קוד בשורה|$result["fieldname"]}}.
 
אם נתייחס לההערה על {{קוד בשורה|mysql_fetch_array()}}, נוכל להפעיל פעולות על כל שורת מידע מתוך הטבלה באמצעות לולאה כמו לולאת While:
<div style="direction:ltr;">
while($result = mysql_fetch_array($query)) { }
</div>
 
אפשרות נוספת לשימוש במידע הוא חישוב מספר שורות המידע בתוצאה. החישוב נעשה באמצעות הפונקציה {{קוד בשורה|mysql_num_rows()}}. דוגמה:
<div style="direction:ltr;">
$number = mysql_num_rows($query);
</div>
 
ניתן גם להשתמש בפונקציות כגון
{{קוד בשורה|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()}} שמחזירה מחרוזת טקסט כלשהי ואז עוצרת את פעולת הסקריפט. לדוגמה:
<div style="direction:ltr;">
$connection = mysql_connect("username","password") or die(mysql_error());
</div>
 
הסבר: אם החיבור מתבצע בהצלחה, הפונקציה {{קוד בשורה|die()}} לא תבוצע. אם החיבור נכשל מסיבה כלשהי תבוצע הפונקציה {{קוד בשורה|die()}} שתקרא לפונקציה {{קוד בשורה|mysql_error()}} לפני שהיא תפסיק את הרצת הסקריפט. התוצאה במקרה של שגיאה בחיבור תהיה הודעת השגיאה של {{קוד בשורה|mysql_error()}} ואז הסקריפט יעצר, וזאת כדי למנוע הודעות שגיאה נוספות שיווצרו בגלל שאין קישור ל-MySQL.
&lt;?
while ($result = mysql_fetch_array ($query)) {
?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;? echo $result["id"]; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;? echo $result["first"]; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;? echo $result["last"]; ?&gt;&lt;/td&gt;
&lt;/tr&gt;
 
===דוגמה מסכמת===
&lt;? } ?&gt;
לסכום המדריך, אציג סקריפט PHP המציג נתונים מתוך טבלה בשם people המכילה ת.ז., שם פרטי ושם משפחה של אדם. העמודות בטבלה הן id, first, last.
&lt;/table&gt;
<div style="direction:ltr;">
&lt;? mysql_close ($connection); ?&gt;
&lt;/bodyhtml&gt;
&lt;head&gt;&lt;title&gt;PHP + MySQL Example Script&lt;/title&gt;&lt;/head&gt;
&lt;/html&gt;
&lt;body&gt;
&lt;?
$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 "&lt;p&gt;There are $number people in the table&lt;/p&gt;";
?&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;ID&lt;/td&gt;
&lt;td&gt;First Name&lt;/td&gt;
&lt;td&gt;Last Name&lt;/td&gt;
&lt;/tr&gt;
&lt;?
while ($result = mysql_fetch_array($query)) {
?&gt;
&lt;tr&gt;
&lt;td&gt;&lt;? echo $result["id"]; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;? echo $result["first"]; ?&gt;&lt;/td&gt;
&lt;td&gt;&lt;? echo $result["last"]; ?&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;? } ?&gt;
&lt;/table&gt;
&lt;? mysql_close($connection); ?&gt;
&lt;/body&gt;
&lt;/html&gt;
</div>
</code></p>
==קישורים חיצוניים==
<li>http://il.php.net/mysql</li>
<li>http://dev.mysql.com/doc</li>
 
===קישורים חיצוניים===
</ul>
* http://il.php.net/mysql
* http://dev.mysql.com/doc