Mercurial > defr > drupal > core
comparison includes/database.inc @ 7:fff6d4c8c043 6.3
Drupal 6.3
author | Franck Deroche <webmaster@defr.org> |
---|---|
date | Tue, 23 Dec 2008 14:30:28 +0100 |
parents | c1f4ac30525a |
children | 8b6c45761e01 |
comparison
equal
deleted
inserted
replaced
6:2cfdc3c92142 | 7:fff6d4c8c043 |
---|---|
1 <?php | 1 <?php |
2 // $Id: database.inc,v 1.92.2.1 2008/02/08 22:44:59 goba Exp $ | 2 // $Id: database.inc,v 1.92.2.2 2008/07/09 21:48:28 goba Exp $ |
3 | 3 |
4 /** | 4 /** |
5 * @file | 5 * @file |
6 * Wrapper for database interface code. | 6 * Wrapper for database interface code. |
7 */ | 7 */ |
208 switch ($match[1]) { | 208 switch ($match[1]) { |
209 case '%d': // We must use type casting to int to convert FALSE/NULL/(TRUE?) | 209 case '%d': // We must use type casting to int to convert FALSE/NULL/(TRUE?) |
210 return (int) array_shift($args); // We don't need db_escape_string as numbers are db-safe | 210 return (int) array_shift($args); // We don't need db_escape_string as numbers are db-safe |
211 case '%s': | 211 case '%s': |
212 return db_escape_string(array_shift($args)); | 212 return db_escape_string(array_shift($args)); |
213 case '%n': | |
214 // Numeric values have arbitrary precision, so can't be treated as float. | |
215 // is_numeric() allows hex values (0xFF), but they are not valid. | |
216 $value = trim(array_shift($args)); | |
217 return is_numeric($value) && !preg_match('/x/i', $value) ? $value : '0'; | |
213 case '%%': | 218 case '%%': |
214 return '%'; | 219 return '%'; |
215 case '%f': | 220 case '%f': |
216 return (float) array_shift($args); | 221 return (float) array_shift($args); |
217 case '%b': // binary data | 222 case '%b': // binary data |
236 } | 241 } |
237 | 242 |
238 /** | 243 /** |
239 * Indicates the place holders that should be replaced in _db_query_callback(). | 244 * Indicates the place holders that should be replaced in _db_query_callback(). |
240 */ | 245 */ |
241 define('DB_QUERY_REGEXP', '/(%d|%s|%%|%f|%b)/'); | 246 define('DB_QUERY_REGEXP', '/(%d|%s|%%|%f|%b|%n)/'); |
242 | 247 |
243 /** | 248 /** |
244 * Helper function for db_rewrite_sql. | 249 * Helper function for db_rewrite_sql. |
245 * | 250 * |
246 * Collects JOIN and WHERE statements via hook_db_rewrite_sql() | 251 * Collects JOIN and WHERE statements via hook_db_rewrite_sql() |
549 switch ($type) { | 554 switch ($type) { |
550 case 'varchar': | 555 case 'varchar': |
551 case 'char': | 556 case 'char': |
552 case 'text': | 557 case 'text': |
553 case 'datetime': | 558 case 'datetime': |
554 return '\'%s\''; | 559 return "'%s'"; |
555 | 560 |
556 case 'numeric': | 561 case 'numeric': |
557 // For 'numeric' values, we use '%s', not '\'%s\'' as with | 562 // Numeric values are arbitrary precision numbers. Syntacically, numerics |
558 // string types, because numeric values should not be enclosed | 563 // should be specified directly in SQL. However, without single quotes |
559 // in quotes in queries (though they can be, at least on mysql | 564 // the %s placeholder does not protect against non-numeric characters such |
560 // and pgsql). Numerics should only have [0-9.+-] and | 565 // as spaces which would expose us to SQL injection. |
561 // presumably no db's "escape string" function will mess with | 566 return '%n'; |
562 // those characters. | |
563 return '%s'; | |
564 | 567 |
565 case 'serial': | 568 case 'serial': |
566 case 'int': | 569 case 'int': |
567 return '%d'; | 570 return '%d'; |
568 | 571 |