נגישות       נגישות
שינוי גודל טקסט:
א א א
שינוי צבעי האתר:
? מקשי קיצור:

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

הפעלת מקשי הקיצור תלויה בדפדפן שבו אתם משתמשים.

Internet Explorer, Chrome ובגרסאות ישנות של Firefox: לחצו על מקש Alt ועל מקש המספר או האות על-פי הרשימה. ב Firefox 3 ומעלה: לחצו על המקשים Alt + Shift + המספר או האות.

S - עבור לתוכן הדף
L - חיפוש
1- עמוד הבית
2 - פרוייקטים
3 - מדריכים
4 - אודות
5 - צרו קשר
6 - הצהרת נגישות
 

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;
}

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

'דוגמה

 

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

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 יודע לטפל היטב בסגירת ההתקשרות עם מסד הנתונים, ולכן, בדרך כלל, אין צורך בסגירה מכוונת של ההתקשרות. במידה ועולה הצורך, כך עושים זאת:

$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

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

 

= 7 + 8