מדריך PHP

מדריך PHP: תכנות מונחה עצמים – MySQLi

‏ • Internet Israel

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

החל מגרסת PHP 5 ומעלה, יש את הרחבת MySQLi באופן אוטומטי. ההרחבה הזו היא בעצם class שנקרא  mysqli כאשר ה-I הוא מלשון improved.

ל-instance שנוצר לפי class זה יש מתודות ותכונות שמאפשרות לנו גישה לכל מאפייני החיבור של MySQL ואפשרות לשיגור שאילתות וקבלת מידע.

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

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

ה-Constructor של ה-class מקבל 4 פרמטרים: host, שם המשתמש, הסיסמה וכן שם מסד הנתונים שאנו עובדים מולו. ככה מבצעים את הקישור:

<?php
$mysqli = new mysqli("localhost", "root", "123456", "internet_database");.

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

<?php
$mysqli = new mysqli("localhost", "root", "123456", "internet_database");
$result = $mysqli->query("SELECT * FROM my_costumer")

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

<?php
$mysqli = new mysqli("localhost", "root", "123456", "internet_database");
if ($result = $mysqli->query("SELECT * FROM my_costumer")) {
    print $result->num_rows;
}

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

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

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

<?php
$mysqli = new mysqli("localhost", "root", "123456", "internet_database");
if ($result = $mysqli->query("SELECT * FROM my_costumer")) {
    while ($result->fetch_object()) {
        print_r($result->fetch_assoc());
    }
}

Prepared Statement

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

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

<?php
$mysqli = new mysqli("localhost", "root", "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. אני יכול להפעיל אותה כמה פעמים שארצה – והיא תשלח את הפרמטרים שלי אל השאילתא שנקבעה מראש.

<?php
$mysqli = new mysqli("localhost", "root", "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 שדות. עלי לתת להם לכל שדה שם של פרמטר ואז אני יכול לעשות איתם מה שאני רוצה:

<?php
$mysqli = new mysqli("localhost", "root", "123456", "internet_database");
$stmt = $mysqli->prepare("SELECT * FROM my_costumer where costumer_name=? LIMIT 1");

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


$costumerName = 'Omri';

$stmt->execute();

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

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

בסך הכל הטיפול במסד נתונים עם הרחבת MySQLi הוא פשוט יחסית. השימוש במ-MySQLi החל מגרסה PHP 5 מומלץ מאד.

תגיות: , , ,

רן בר-זיק

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

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