תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

PDO: הרחבת PHP לעבודה עם מסדי נתונים

מחבר:
בתאריך:

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

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

תוכלו להוריד את טבלת ה-SQL הבאה שתעזור לכם לעבוד עם המדריך:

להורדה

 

כיצד יוצרים התקשרות עם מסד הנתונים?

נהוג לעטוף את ההתקשרות עם מסד הנתונים בבלוקים try...catch , כדי שבמידה ומשהו השתבש בהתקשרות עם מסד הנתונים ייזרק exception ותתקבל הודעת שגיאה. אפשר להגדיר את הודעת השגיאה, אבל בשביל הפשטות נסתפק בהודעות שגיאה שמספק PDO.

לצורך יצירת ההתקשרות תזדקקו לשם משתמש, ססמה ושם מסד הנתונים.

$user = "root";
$pass = "";

try {
  $dbh = new PDO('mysql:host=localhost;dbname=your_db_name', $user, $pass,
                array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"));
} catch (PDOException $e) {
  print "Error!: " . $e->getMessage();
  die();
}

 

כיצד מתבצעת שאילתת insert למסד הנתונים?

1. כותבים הצהרת sql רגילה, ובמקום ערכים מכניסים מחזיקי מקום. לדוגמה:

$sql = "INSERT INTO `workers`(`workers_name`, `workers_phone1`, `workers_city`, `workers_date_added`) VALUES (:name,:phone,:city,:date)";

מחזיקי המקום דוגמת :name או :phone ,משמשים אותנו רק בינתיים, והקשירה של הנתונים לשאילתה נעשית רק בשלב מאוחר יותר כדי להפחית את הסיכוי להכניס נתונים מזיקים למסד הנתונים.

2. משתמשים במתודה שמכינה את השאילתה.

$query = $dbh -> prepare($sql);

3. קושרים את הפרמטרים באמצעות המתודה bindParam. לדוגמה:

$query->bindParam(':name',$name);

הקשירה היא בין מחזיק המקום ובין המשתנה שמחזיק את הערך שרוצים להוסיף לטבלה.

בקשירה אפשר להוסיף פרמטר שלישי שהוא סוג המשתנה הצפוי. לדוגמה:

$query->bindParam(':name',$name,PDO::PARAM_STR);
$query->bindParam(':phone',$phone,PDO::PARAM_INT);

PDO::PARAM_STR מתייחס למחרוזות.
PDO::PARAM_INT מתייחס למספרים.

4. מגדירים את ערכי המשתנים. לדוגמה,

$name = "Zvika";
$phone = "031234567";
$city = "Tel Yossef";
$date = date('Y-m-d');

את הנתונים צריך לסנן ולעשות להם ולידציה ו-cast typing כדי להבטיח שאינם מכילים קוד זדוני.

5. מוציאים את הקוד אל הפועל:

$query -> execute();

6. בודקים האם הקוד פעל כשורה.

if($dbh->lastInsertId()>0){echo "OK";} else {echo "not OK";}

ועכשיו הכל ביחד:

$sql = "INSERT INTO `workers`(`workers_name`, `workers_phone1`, `workers_city`, `workers_date_added`) VALUES (:name,:phone,:city,:date)";
 
$query = $dbh -> prepare($sql);
 
$query->bindParam(':name',$name,PDO::PARAM_STR);
$query->bindParam(':phone',$phone,PDO::PARAM_INT);
$query->bindParam(':city',$city,PDO::PARAM_STR);
$query->bindParam(':date',$date);
 
// Insert the first row.
$name = "Zvika";
$phone = "031234567";
$city = "Tel Yossef";
$date = date('Y-m-d');
 
$query -> execute();
 
echo ($dbh->lastInsertId()>0)? $dbh->lastInsertId():"unsuccessful";
 
// Insert the second row
$name = "Mazi";
$phone = "03-7234561";
$city = "Ramat Gan";
$date = date('Y-m-d');
 
$query -> execute();
 
echo ($dbh->lastInsertId()>0)? $dbh->lastInsertId():"unsuccessful";

 

כיצד מתבצעת שאילתת SELECT פשוטה ממסד הנתונים?

אחרי שהבנתם את הדוגמה למעלה, לא יקשה עליכם להבין כיצד לבצע SELECT ממסד הנתונים. שלבים 1-5 ממש דומים, והשוני מתחיל בשלב השישי.

1. כותבים הצהרת SELECT רגילה, ובמקום ערכים מכניסים ממלאי מקום. לדוגמה:

$sql = "SELECT * FROM workers WHERE workers_city = :city";

2. מתודה שמכינה את השאילתה.

$query = $dbh -> prepare($sql);

3. קושרים את הפרמטרים באמצעות המתודה bindParam.

$query -> bindParam(':city', $city, PDO::PARAM_STR);

4. מגדירים את ערכי המשתנים. תמיד כדאי לסנן את הנתונים שיוצאים ממסד הנתונים.

$city = "Hakrayot";

5. מוציאים את הקוד אל הפועל:

$query -> execute();

6. אוספים את כל המשתנים שמוחזרים מהשאילתה למשתנה זמני, דוגמת:

$results = $query -> fetchAll(PDO::FETCH_OBJ);

העברתי למתודה- fetchAll את הפרמטר PDO::FETCH_OBJ שקובע שסט הנתונים יוחזר כאובייקט. אפשרות אחרת היא PDO::FETCH_ASSOC שמחזירה מערך אסוציאטיבי. תוכלו לקרוא על אפשרויות נוספות בתחתית המדריך.

7. מוודאים שאכן הוחזרו נתונים.

if($query -> rowCount() > 0){var_dump($results);} else {echo “No results";}

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

foreach($results as $result){
  echo $result -> workers_name . ", ";
  echo $result -> workers_city . ", ";
  echo $result -> workers_date_added;
}

וזה הקוד המלא:

$sql = "SELECT * FROM workers WHERE workers_city = :city";
 
$query = $dbh -> prepare($sql);
$query -> bindParam(':city', $city, PDO::PARAM_STR);
 
$city = "Hakrayot";
 
$query -> execute();
 
$results = $query -> fetchAll(PDO::FETCH_OBJ);
 
if($query -> rowCount() > 0){
  $count = $query -> rowCount();
  echo "Number of rows: " . $count;
  var_dump($results);
}
 
foreach($results as $result){
  echo $result -> workers_name . ", ";
  echo $result -> workers_city . ", ";
  echo $result -> workers_date_added;
}

והתוצאה של הדוגמה:

דוגמה לשאילתת SELECT באמצעות PDO

 

כיצד מעדכנים את מסד הנתונים?

1. כותבים הצהרת UPDATE שכוללת מחזיקי מקום.
2. מכינים את השאילתה.
3. קושרים נתונים באמצעות bindParam.
4. מגדירים את ערכי המשתנים.
5. מוציאים את השאילתה לפועל.
6. בודקים שהשאילתה אכן יצאה לפועל, ועדכנה את מסד הנתונים.

$sql = "UPDATE workers
        SET `workers_city`= :city, `workers_phone1` = :tel
		WHERE `workers_id` = :id";
	
$query = $dbh->prepare($sql);

$query -> bindParam(':city', $city, PDO::PARAM_STR);
$query -> bindParam(':tel' , $tel , PDO::PARAM_INT);
$query -> bindParam(':id'  , $id  , PDO::PARAM_INT);

$tel  = '041234567';
$city = 'Mitzpe Ramon';
$id   = 6;

$query -> execute();

if($query -> rowCount() > 0){
  $count = $query -> rowCount();
  echo $count . " rows were affected.";
} else {
  echo "No affected rows.";
}

 

כיצד מוחקים שורות ממסד הנתונים?

לדוגמה:

$sql = "DELETE FROM `workers` WHERE `workers_id`=:workers_id";

$query = $dbh -> prepare($sql);

$query -> bindParam(':workers_id', $workers_id, PDO::PARAM_INT);

$workers_id = 6;

$query -> execute();

if($query -> rowCount() > 0){
  $count = $query -> rowCount();
  echo $count . " rows were affected.";
} else {
  echo "No affected rows.";
}

כיצד מדבגים?

הרבה פעמים מרוב הפשטה לא רואים את היער אז החברים שמפתחים את PHP הוסיפו את הפונקציה המועילה הבאה שמאפשרת לנו לברר מה השתבש:

$query->debugDumpParams();

 

כיצד סוגרים את ההתקשרות עם מסד הנתונים?

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

$dbh = null;

 

הפרמטרים שניתן להעביר ל-bindParam

PDO::PARAM_STRמאפשר לקבל מחרוזות בלבד
PDO::PARAM_INTמאפשר לקבל מספרים בלבד
PDO::PARAM_BOOLמאפשר לקבל בוליאנים בלבד
PDO::PARAM_NULLמאפשר לקבל NULL בלבד

 

סרטונים שמרחיבים את הנושא של PDO

שני הסרטונים הבאים מרחיבים את הנושא של PDO באמצעות דוגמה מעשית.

את קבצי ה-SQL וה-PHP שמלווים את הסרטונים ניתן להוריד מ-github בקישור הבא: github.com/reshetech/pdo-example-1

 

 

לכל מדריכי ה-PHP

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

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

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

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

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך קוראים בעברית לצ`ופצ`יק של הקומקום?

 

תמונת המגיב

EE בתאריך: 07.10.2021

בדיוק מה שהייתי צריך ועוד בעברית. תודה רבה.