מידע מורחב

  • תאריך
  • שעה 10:38
  • ע"י
  • צפיות 1695
  • תגובות 1
  • דירוג 5 /5

קרב הענקים מתחיל... שלא תחמיצו !

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

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

סיבוב ראשון: ראש-בראש !

הגיע הזמן להוציא הכל מהכיסים מהתמודדים שלנו ולראות מה הם מציעים עבורנו.
בואו נתחיל עם מר.לי (MySQLi) ונכיר אותו קצת יותר...
מר.לי התפתח עבורנו החל מגרסא PHP5 והציע עבורנו פתרונות יצירתיים ומגוונים יותר לעבודה עם מסד נתונים מסוג MySQL
במקום השיטה הפרוצדואלית והמשעממת במשקל נוצה ובביצועי מהירות (preformence) טובים ביותר!
הפרופיל שלו:
שם מלא: MySQLi Improved
תמיכה API: פרוצדואלי ("קוד ספגטי / רגיל") / מונחה עצמים (OOP)
התממשקות למסד נתונים: מבוצע אוטמטי אל מול מסדי נתונים מסוג MySQL
יכולת כאובייקטים: כן
ביצוע: מהיר
ביצוע Stored Procedures: מאופשר
הגבלת ילדות: מהיום שהוא נולד לשפה, הוא הוגבל אך ורק לעבודה עם מסדים מסוג MySQL ולא מאפשר לנו מעבר לכך
רמת אבטחה: טובה יותר מהרחבת MySQL הרגילה (שאגב... כבר לא בשימוש יותר )

ו..מהצד השני עומד לו מחלקה אכזרית לא פחות הידועה בשם המפחידדד שלה..כן נכון - PDO..
אז בוא נכיר אותה יותר לעומק...
קצת פרופיל עליו:
שם מלא: PHP Data Objects
תמיכת API: תמיכה מעל 12 סוגי חיבורי דטאבייס שונים (MMSQL, Accsess, Oracle, SQLite ועוד..)
התממשקות למסד נתונים: קלה מאוד, מבוצעת באמצעות ConnectionString אחד ויחיד לכל סוגי הדטאביייס למנהם
יכולת כאובייקטים: כן
ביצוע: מהיר
ביצוע Stored Procedures: מאופשר
רמת אבטחה: מציע פתרונות מגוונים ונוחים לאבטחה ופילטור של מידע בשאילתאות
יתרון ילדות: אחד מהדברים המגניבים שהוא מאפשר לנו הוא שימוש בטרנזקציות בשאילתאות שלנו!

אחרי שהכרנו אותם...
אני מזמין אתכם לבקר בעמוד הרשמי של כל אחד מן המתמודדים:
MySQLi: http://php.net/manual/en/mysqli.quickstart.php
PDO: http://php.net/manual/en/book.pdo.php

סיבוב שני: מי מתחבר הכי מהר ?!

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

כאשר אנחנו פנינו למר.לי שלנו הוא הציע לנו להשתמש בMySQLi שלו במספר דרכים...:
בדרך פרוצדואלית לחלוטין:
$mysqli_connection = mysqli_connet("localhost","idev","123456","ourDatabase");


או אפילו בדרך של אובייקטים ! :
$mysqli_connection = new mysqli("localhost","idev","123456","ourDatabase");


אך החבר שלנו מצדו השני מסרב בכל תוקף בטענה ש"פרוצדואלי זה לחלשים..." והוא מציע לנו להתחבר באמצעות מחרוזת התחברות פשוטה,
שמתבצעת רק דרך אובייקט שלו בצורה הבאה:
$my_pdo = new PDO("Mysqli: host=localhost; dbname=ourDatabase",'user','pass');


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

התחברות למסד נתונים מסוג Oracle:
$dbh=new PDO('oci:','user','password');

או SQLLIte:
$dbh= new PDO('sqlite2:/databases/mydb.sq2');

או ODBC:
$dbh= new PDO('odbc:EXAMPLE','db2inst','ibmdb');


ו..השמים הם הגבול...! (או עד לפחות 12 הסוגים שהוא תומך בהם.. : ) )
שימו לב שאחרי שיצרנו את האובייקט פעם אחת עם איזה ConnectionString שרצינו, כל המתודות שנשתמש בהם יהיה אותו הדבר תמיד ! איזה מאגניב !!
ובכן.... נראה שגם בסיבוב הזה PDO שלנו לא מוותר ועושה את החיים קשים לMySQLi המסכן...

סיבוב שלישי: כתיבה עם ביטויים מובנים מראש (Named Parameters / Prepared Statement)

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

כמובן שנתחיל קודם כל ממי שהכניס את הג'וק הזה לשפה לראשונה והוא MySQLi שימו לב:

$query = $mysqli->prepare("SELECT * FROM `idev` WHERE `admin` = ? AND `assit` = ?");
$query->bind_param("AmitDar","Maor");
$query->execute();


לזה קוראים Prepared Statement....הורייי מגניבב.... אבל מר.לי ביאס אותי כשאני חושב על זה...
תחשבו שיש לי שאילתא יותר מורכבת עם מספר JOINים, אז אני צריך לזכור את המיקום של כל משתנה בסדר של השילתא ולמקם בהתאם איזה מבאס זה יכול להיות...
אבל הנה הוא, PDO צוחק ומלגלג לו מהצד..."שמעת על ביטויים במילים?" הוא אומר לנו ואנחנו בשוק לראות איזה קלף יש לו בשרוול....!

והנה הוא מציג לנו את הבעיה שמר.לי תקוע איתה והוא מציע לנו פתרון חדשני שנקרא Named Parameters, הרמנו גבה...
והוא מציג לנו את הדרך שלו עם אותה שאילתא ממקודם רק בצורה קצת יותר מגוונת : )
שימו לב! :

$pdo = $db->prepare("SELECT * FROM `idev` WHERE `admin` = :admin AND `assist` = :iphp");
$params = array(":admin"=>"AmitDar",":iphp"=>"MaorTal");
$pdo->execute($params);


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

סיבוב רביעי ואחרון: אבטחת מידע

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

SELECT * FROM users WHERE `user`= $name


ואמרנו להם שבהנחה והמשתמש מזריק לנו את הפקודה הבאה למשתנה $name בכל צורה שהיא:

'; DELETE FROM users; /*


מה הצעות ההתגוננות שלהם ?!

כששאלנו את מר.לי שנראה מיואש מכל הנוקטאאוטים שקיבל עד כה... הוא אמר שהוא מציע פונקציה בשם mysqli_real_escape_string שתפקידה לנטרל 90% מהתקפות על מבנה השאילתא שלנו...
הוא הדגים לנו את זה כך:
$username = mysqli_real_escape_string($_GET['username']);
$mysqli->query("SELECT * FROM users WHERE username = '$username'");


ואוו זה באמת עבד... רעיון נחמד מאוד.. : ) התלהבנו ומחאנו כפיים, כעת המתנו בדומייה למתמודד בצד השני לראות את דעתו, עם החיוך הממזר על פרצופו.
אבל פתאום מר.לי מתערב ואומר שזה לא הכל.... יש לו עוד שיטה הגנתית שקשורה למה שהציג לנו מקודם שנקרא Prepared Statement והיא מאפשרת לנו להגדיר את הסוג של המידע שנכנס למשתנה שלנו בעת בניית השאילתא...
או כמו שהוא הציג לנו כך:
$query = $mysqli->prepare('SELECT * FROM users WHERE username = ?');
$query->bind_param('s', $_GET['username']);
$query->execute();


ופה חיייך לנו חיוך רחב : )
אבל הנה קם לו בזעם PDO ושולף את הקלפים שבידו...
הוא אומר שאומנם mysqli_real_escape_string מפלטר את המחרוזת שלנו אך כדי להוסיף גרשיים נאלץ להוסיף אותן ידני....מבאס....נראה שמר.לי אוטוטו בדרך לנוקאאוט האחרון והנה PDO מציג את הדבר הבא:
מתודת QUOTE.. שלא רק מפלטרת את המחרוזת שלנו אלא גם מוסיפה לו גרשיים !
זה הולך כך:
$username = $db->quote($_GET['username']);
$pdo->query("SELEC * FROM `users` WHERE `username` = $username");


והוא מוסיף לנו בחיוך ערמומי את הרמז שבניגוד למר.לי אנחנו לא צריכים להשתמש ב-Prepared Statement שלו, אנחנו יכולים להשתמש ב-Named Parameters שעושים לנו את החיים קלים פי עשר!!
ככה:
$pdo->prepare('SELECT * FROM users WHERE username = :username');
$pdo->execute(array(':username' => $_GET['username']));


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

אבל תכלס לסיכום, לבחור במה להשתמש ( : מסר סמוי PDO מסר סמוי : ) זה בחירה שלכם, תעשו את הבחירה שלכם... שלא תפלו כמו מר.לי : )
עדיין לא נרשמת לאתר ? לחץ כאן להרשמה מהירה
נא המתן...
דירוג
  1. אחד המאמרים... כתיבה מהנה ומצוינת


עליך להתחבר כדי להגיב. לחץ כאן להתחברות.