MySQL ב-PHP מונחה עצמים

שימוש בהרחבת MySQLi על מנת לקבל נתונים ל-PHP

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

אם אינכם מבינים מהו תכנות מונחה עצמים ניתן לדלג על המאמר הזה. הוא אינו חיוני להבנת MySQL. המאמר הזה משתמש באותו מסד נתונים שהשתמשנו בו במאמר הקודם.

כשאני כותב על הרחבת MySQLi אני מתכוון לתוספת לשפת ה-PHP שמותקנת ב-Default ברוב התקנות ה-PHP. מגרסה 5 ההרחבה הזו נכללת כבר ב-PHP 5 ויש המלצה חד משמעית להשתמש בה ולא בהרחבת MySQL שעליה למדנו במאמר הקודם.

באופן עקרוני כל העבודה נעשית באמצעות class שנקרא mysqli (אם תהיתם i מלשון improved). לאובייקט שנוצר לפי class זה יש מתודות ותכונות שמאפשרות לנו גישה לכל מאפייני החיבור של MySQL ואפשרות לשיגור שאילתות וקבלת מידע.

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

חיבור ל-DataBase

ה-Constructor של האובייקט מקבל 4 פרמטרים: ה-host (בדרך כלל local host), שם המשתמש, הסיסמה וכן שם מסד הנתונים שאנו עובדים מולו (מקביל לפקודת USE ב-MySQL). כך בדוגמא שלנו אנו מייצרים אובייקט של הקשר עם MySQL.


$mysqli = new mysqli("localhost", "internet_user", "123456", "internet_database");

לאובייקט זה (בדוגמא שלנו $mysqli) מתודות ותכונות שיסייעו לנו לנהל את הקשר עם MySQL. כל המתודות והתכונות מתוארות בפירוט בדוקומנטציה של PHP הקשורה ל-MySQLi.

לאחר שהתחברנו אל מסד הנתונים בהצלחה, אנו יכולים לבצע שאילתא. שאילתא מוצלחת מחזירה לנו resource. resource הוא לא אובייקט והטיפול בו הוא מיוחד. ראשית, שאילתא מתבצעת על ידי המתודה query.


$result = $mysqli->query("SELECT * FROM my_costumer")

ה-result שלנו הוא גם סוג של אובייקט שמחזיק resource. האובייקט הזה נקרא MySQLi_Result class וגם לו יש מתודות ותכונות משלו. כך למשל, אחת התכונות היא num_rows שמראה לנו כמה שורות יש ב-resource שלנו – או יותר נכון כמה שורות השאילתא שלנו החזירה. אם נריץ את הקוד הבא:


$mysqli = new mysqli("localhost", "internet_user", "123456", "internet_database");

if ($result = $mysqli->query("SELECT * FROM my_costumer")) {
echo $result->num_rows;
}

נקבל את התוצאה 7, שהיא מספר השורות שיש בטבלת my_costumer.

לאובייקט התוצאה יש 3 מתודות שונות לקבל הערך של השורה: fetch_assoc לקבלת מערך אסוציאטיבי, fetch_object לקבלת השורה כאובייקט ו-fetch_row לקבל השורה כמערך רגיל. כמו בשיטה הפרוצדורלית, בכל פעם נסרקת שורה אחת ואם אנו רוצים יותר משורה אחת, עלינו להשתמש בהצהרת while (או בכל לולאה אחרת). כך למשל, אם אני רוצה לקבל מערך אסוציאטיבי של כל התוצאות מה-SELECT שלי, אני נדרש לעשות while:


$mysqli = new mysqli("localhost", "internet_user", "123456", "internet_database");

if ($result = $mysqli->query("SELECT * FROM my_costumer")) {

	while ($result->fetch_object()) {
		print_r($result->fetch_assoc());
	}
}

Prepared Statements

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

איך עושים את זה? ראשית מבצעים חיבור MySQLi רגיל:


$mysqli = new mysqli("localhost", "internet_user", "123456", "internet_database");

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


$stmt = $mysqli->prepare("SELECT * FROM my_costumer where costumer_name=? LIMIT 1");

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


$stmt->bind_param('s', $costumerName); 

כאשר bind_param מקבל שני פרמטרים – הראשון הוא string שכולל את ההגדרה של הפרמטרים והשני הוא הפרמטרים עצמם. במקרה הזה יש לנו רק פרמטר אחד.

אחרי כן, כל מה שעלי לעשות זה לאכלס את הפרמטר שלי בנתונים.


$costumerName = 'Omri';

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


$mysqli = new mysqli("localhost", "internet_user", "123456", "internet_database");
$stmt = $mysqli->prepare("SELECT * FROM my_costumer where costumer_name=? LIMIT 1");
$stmt->bind_param('s', $costumerName); 

$costumerName = 'Omri';

$stmt->execute(); 

במקרה שלנו יש לנו שאילתת SELECT ולא פעולת INSERT. לפיכך אנו צריכים לראות מה התוצאה. במקרה הזה אנו חייבים לדעת כמה שדות אנו מקבלים מהפקודה שלי. במקרה הזה אני יודע שאני מקבל 4 שדות. עלי לתת להם לכל שדה שם של פרמטר ואז אני יכול לעשות איתם מה שאני רוצה:


$mysqli = new mysqli("localhost", "internet_user", "123456", "internet_database");
$stmt = $mysqli->prepare("SELECT * FROM my_costumer where costumer_name=? LIMIT 1");
$stmt->bind_param('s', $costumerName); 

$costumerName = 'Omri';

$stmt->execute(); 

$stmt->bind_result($cost_id, $cost_name, $cost_age, $cost_sex);

while ($stmt->fetch()) {
        print("ID : $cost_id , NAME : $cost_name , AGE : $cost_age , SEX : $cost_sex");
}
/*

אם תריצו את הדוגמא על ה-DB שלנו. תראו שהוא מביא לכם את התוצאה הבאה:


ID : 7 , NAME : Omri , AGE : 9 , SEX : male

ישנן עוד ספריות של PHP שמאפשרות חיבור ל-MySQL מלבד הרחבת MySQL ו-MySQLi. המפורסמת וזו שהכי הרבה משתמשים בה היא PDO הנוחה. אבל כיוון שזה מדריך MySQL ולא מדריך PHP, אני אסתפק בשתי השיטות שלמדנו במאמר הזה ובמאמר הקודם.

⚠️המדריכים כאן הם טעימה בלבד! יש ספר מקיף המלמד MySQL מרמת בסיס ועד רמה מתקדמת. הספר הדיגיטלי, שרלוונטי גם לכל מסדי הנתונים שעובדים עם SQL – זמין כאן כחלק מהפרויקט "ללמוד ג'אווהסקריפט בעברית" – זו הדרך הטובה ביותר ללמוד באופן מקיף MySQL.

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

פוסטים נוספים שכדאי לקרוא

בינה מלאכותית

Safeguards על מודל שפה גדול (LLM)

פוסט בשילוב עם פודקאסט וסרטון על ההגנות שאפשר להציב על LLM בסביבת פרודקשן

פתרונות ומאמרים על פיתוח אינטרנט

המנעו מהעלאת source control לשרת פומבי

לא תאמינו כמה אתרים מעלים את ה-source control שלהם לשרת. ככה תמצאו אותם וגם הסבר למה זה רעיון רע.

גלילה לראש העמוד