יום רביעי, 23 ביוני 2010

טיפים חשובים לביצוע שאילתות MySQL

במידה ואתם כבר יודעים לבצע שאילתות SQL עם PHP בצורה סבירה (אבטחה, כתיבה נכונה וכו'), אתם מוזמנים לקרוא כמה טיפים שיקלו עליכם בצורה משמעותית.

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

// Preparing the query
$query = sprintf("SELECT * FROM users WHERE username = '%s' AND password = '%s'",
 mysql_real_escape_string($username),
 mysql_real_escape_string($password));

// Executing the query
$result = mysql_query($query);

השיטה הזו מיותרת, אך ב-PHP כמו במכוניות, תמיד יש כאלו שמעדיפים ידנית על אוטומטית.
אבל! זה בסה"כ טיפ. אז הנה לכם השיטה האוטומטית:

// Executing the query (prepared automatically)
$result = safeQuery("SELECT * FROM users WHERE username = '%s' AND password = '%s'", $username, $password);

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

function safeQuery($query) {
 $args = func_get_args();
 $size = count($args);
 for($i = 1; $i < $size; $i++) {
  if(!is_numeric($args[$i])) {
   $safeArgs[] = $this->escape($args[$i]);
  }
 }
 return mysql_query(vsprintf($query, $safeArgs));
}

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