טיפול בתווים בעייתיים בביצוע שאילתות באמצעות PHP
נתקלתי בכמה מאמרים פה שמדברים על טיפול בתווים בעייתיים בעת בניית שאילתות, מבלי לפגום באותם מאמרים, חסרה לי שם האלגנטיות, לא נראה לי לכתוב פונקציה שמטפלת בתווים בעייתיים ובכול בניית שאילתא לקורא לה בכל שדה בשאילתא…
בניתי מנגנון שמטפל בכל האובייקט HttpRequest מחליף את התווים הבעייתיים וחוסך ממני את ההתעסקות בבעיה בכול פעם שאני ניגש לכתוב שאילתא.
הנחות ייסוד בשימוש במנגנון:
- כל מה שיישמר במסד הנתונים ומכיל תווים בעייתיים יוחלף.
- נכתב בשפת PHP.
- שימוש בביטויים רגולאריים.
** הפונקציה היא חלק מאובייקט סטטי בשם Service שמכיל מספר שירותים, פה אני מציג רק את החלק הרלוונטי – פונקציה prepare.
public static function prepare($arr) { $regxs = array (0 => '/\'/', 1 => '/'/', 2 => '/"/'); $replace = array (0 => ''', 1 => ''', 2 => '"'); foreach ($arr as $key => $value) { $arr[$key] = preg_replace($regxs, $replace, $value); } return $arr; }
תיאור השירות שורה שורה:
- פונקציה מקבלת מערך.
- מערך של ביטויים רגולאריים כאשר כל איבר במערך מייצג תו בעייתי.
- מערך של תווי אסקי מקבלים שיוחלפו במקום שנמצא תו בעייתי.
- לולאה אשר רצה על כל אברי המערך.
- ביצוע של החלפת התווים הבעייתיים בכל אחד מאברי המערך ודריסה של הערכים באיבר של המערך בצורתו החדשה.
- החזרת המערך בצורתו החדשה.
השימוש בשירות:
$arr = Service::prepare($_POST);
או
$arr = Service::prepare($_GET);
בכתיבת השאילתא אין צורך לקחת בחשבון את התווים הבעייתיים, הנה דוגמא:
$qry = 'INSERT INTO users ( fname, lname, year_born, month_born, day_born, language, address, city, zip, phone, mobile, country, policy, email, username, password, auth, created_date, updated_date, registered ) VALUES ( "' .$arr["fname"]. '", "' .$arr["lname"]. '", "' .$arr["year_born"]. '", "' .$arr["month_born"]. '", "' .$arr["day_born"]. '", "' .($arr["language"] ? $arr["language"] : 'he'). '", "' .$arr["address"]. '", "' .$arr["city"]. '", "' .$arr["zip"]. '", "' .$arr["phone"]. '", "' .$arr["mobile"]. '", "' .$arr["country"]. '", "' .$arr["policy"]. '", "' .$arr["email"]. '", "' .$arr["username"]. '", "' .md5($arr["password"]). '", "' .($arr["auth"] ? $arr["auth"] : 'customer'). '", NOW(), NOW(), 1 ) ';
אלגנטי יותר, אתם לא חושבים?!
תגובות בפייסבוק