Documentation TYPO3 par Ameos |
00001 <?php 00002 /*************************************************************** 00003 * Copyright notice 00004 * 00005 * (c) 2004 Kasper Skaarhoj (kasperYYYY@typo3.com) 00006 * All rights reserved 00007 * 00008 * This script is part of the TYPO3 project. The TYPO3 project is 00009 * free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * The GNU General Public License can be found at 00015 * http://www.gnu.org/copyleft/gpl.html. 00016 * A copy is found in the textfile GPL.txt and important notices to the license 00017 * from the author is found in LICENSE.txt distributed with these scripts. 00018 * 00019 * 00020 * This script is distributed in the hope that it will be useful, 00021 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00022 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00023 * GNU General Public License for more details. 00024 * 00025 * This copyright notice MUST APPEAR in all copies of the script! 00026 ***************************************************************/ 00132 class t3lib_DB { 00133 00134 00135 // Debug: 00136 var $debugOutput = FALSE; // Set "TRUE" if you want database errors outputted. 00137 var $debug_lastBuiltQuery = ''; // Internally: Set to last built query (not necessarily executed...) 00138 00139 // Default link identifier: 00140 var $link; 00141 00142 00143 00144 00145 /************************************ 00146 * 00147 * Query execution 00148 * 00149 * These functions are the RECOMMENDED DBAL functions for use in your applications 00150 * Using these functions will allow the DBAL to use alternative ways of accessing data (contrary to if a query is returned!) 00151 * They compile a query AND execute it immediately and then return the result 00152 * This principle heightens our ability to create various forms of DBAL of the functions. 00153 * Generally: We want to return a result pointer/object, never queries. 00154 * Also, having the table name together with the actual query execution allows us to direct the request to other databases. 00155 * 00156 **************************************/ 00157 00167 function exec_INSERTquery($table,$fields_values) { 00168 $res = mysql_query($this->INSERTquery($table,$fields_values), $this->link); 00169 if ($this->debugOutput) $this->debug('exec_INSERTquery'); 00170 return $res; 00171 } 00172 00183 function exec_UPDATEquery($table,$where,$fields_values) { 00184 $res = mysql_query($this->UPDATEquery($table,$where,$fields_values), $this->link); 00185 if ($this->debugOutput) $this->debug('exec_UPDATEquery'); 00186 return $res; 00187 } 00188 00197 function exec_DELETEquery($table,$where) { 00198 $res = mysql_query($this->DELETEquery($table,$where), $this->link); 00199 if ($this->debugOutput) $this->debug('exec_DELETEquery'); 00200 return $res; 00201 } 00202 00216 function exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='') { 00217 $res = mysql_query($this->SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit), $this->link); 00218 if ($this->debugOutput) $this->debug('exec_SELECTquery'); 00219 return $res; 00220 } 00221 00241 function exec_SELECT_mm_query($select,$local_table,$mm_table,$foreign_table,$whereClause='',$groupBy='',$orderBy='',$limit='') { 00242 $mmWhere = $local_table ? $local_table.'.uid='.$mm_table.'.uid_local' : ''; 00243 $mmWhere.= ($local_table AND $foreign_table) ? ' AND ' : ''; 00244 $mmWhere.= $foreign_table ? $foreign_table.'.uid='.$mm_table.'.uid_foreign' : ''; 00245 return $GLOBALS['TYPO3_DB']->exec_SELECTquery( 00246 $select, 00247 ($local_table ? $local_table.',' : '').$mm_table.($foreign_table ? ','.$foreign_table : ''), 00248 $mmWhere.' '.$whereClause, // whereClauseMightContainGroupOrderBy 00249 $groupBy, 00250 $orderBy, 00251 $limit 00252 ); 00253 } 00254 00264 function exec_SELECT_queryArray($queryParts) { 00265 return $this->exec_SELECTquery( 00266 $queryParts['SELECT'], 00267 $queryParts['FROM'], 00268 $queryParts['WHERE'], 00269 $queryParts['GROUPBY'], 00270 $queryParts['ORDERBY'], 00271 $queryParts['LIMIT'] 00272 ); 00273 } 00274 00287 function exec_SELECTgetRows($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='',$uidIndexField='') { 00288 $res = mysql_query($this->SELECTquery($select_fields,$from_table,$where_clause,$groupBy,$orderBy,$limit), $this->link); 00289 if ($this->debugOutput) $this->debug('exec_SELECTquery'); 00290 00291 unset($output); 00292 if (!$this->sql_error()) { 00293 $output = array(); 00294 00295 if ($uidIndexField) { 00296 while($tempRow = $this->sql_fetch_assoc($res)) { 00297 $output[$tempRow[$uidIndexField]] = $tempRow; 00298 } 00299 } else { 00300 while($output[] = $this->sql_fetch_assoc($res)); 00301 array_pop($output); 00302 } 00303 } 00304 return $output; 00305 } 00306 00307 00308 00309 00310 00311 00312 00313 00314 00315 00316 00317 /************************************** 00318 * 00319 * Query building 00320 * 00321 **************************************/ 00322 00332 function INSERTquery($table,$fields_values) { 00333 00334 // Table and fieldnames should be "SQL-injection-safe" when supplied to this function (contrary to values in the arrays which may be insecure). 00335 if (is_array($fields_values) && count($fields_values)) { 00336 00337 // Add slashes old-school: 00338 foreach($fields_values as $k => $v) { 00339 $fields_values[$k] = $this->quoteStr($fields_values[$k], $table); 00340 } 00341 00342 // Build query: 00343 $query = 'INSERT INTO '.$table.' 00344 ( 00345 '.implode(', 00346 ',array_keys($fields_values)).' 00347 ) VALUES ( 00348 "'.implode('", 00349 "',$fields_values).'" 00350 )'; 00351 00352 // Return query: 00353 if ($this->debugOutput) $this->debug_lastBuiltQuery = $query; 00354 return $query; 00355 } 00356 } 00357 00368 function UPDATEquery($table,$where,$fields_values) { 00369 00370 // Table and fieldnames should be "SQL-injection-safe" when supplied to this function (contrary to values in the arrays which may be insecure). 00371 if (is_string($where)) { 00372 if (is_array($fields_values) && count($fields_values)) { 00373 00374 // Add slashes old-school: 00375 $nArr = array(); 00376 foreach($fields_values as $k => $v) { 00377 $nArr[] = $k.'="'.$this->quoteStr($v, $table).'"'; 00378 } 00379 00380 // Build query: 00381 $query = 'UPDATE '.$table.' 00382 SET 00383 '.implode(', 00384 ',$nArr). 00385 (strlen($where)>0 ? ' 00386 WHERE 00387 '.$where : ''); 00388 00389 // Return query: 00390 if ($this->debugOutput) $this->debug_lastBuiltQuery = $query; 00391 return $query; 00392 } 00393 } else { 00394 die('<strong>TYPO3 Fatal Error:</strong> "Where" clause argument for UPDATE query was not a string in $this->UPDATEquery() !'); 00395 } 00396 } 00397 00407 function DELETEquery($table,$where) { 00408 if (is_string($where)) { 00409 00410 // Table and fieldnames should be "SQL-injection-safe" when supplied to this function 00411 $query = 'DELETE FROM '.$table. 00412 (strlen($where)>0 ? ' 00413 WHERE 00414 '.$where : ''); 00415 00416 if ($this->debugOutput) $this->debug_lastBuiltQuery = $query; 00417 return $query; 00418 } else { 00419 die('<strong>TYPO3 Fatal Error:</strong> "Where" clause argument for DELETE query was not a string in $this->DELETEquery() !'); 00420 } 00421 } 00422 00436 function SELECTquery($select_fields,$from_table,$where_clause,$groupBy='',$orderBy='',$limit='') { 00437 00438 // Table and fieldnames should be "SQL-injection-safe" when supplied to this function 00439 // Build basic query: 00440 $query = 'SELECT '.$select_fields.' 00441 FROM '.$from_table. 00442 (strlen($where_clause)>0 ? ' 00443 WHERE 00444 '.$where_clause : ''); 00445 00446 // Group by: 00447 if (strlen($groupBy)>0) { 00448 $query.= ' 00449 GROUP BY '.$groupBy; 00450 } 00451 // Order by: 00452 if (strlen($orderBy)>0) { 00453 $query.= ' 00454 ORDER BY '.$orderBy; 00455 } 00456 // Group by: 00457 if (strlen($limit)>0) { 00458 $query.= ' 00459 LIMIT '.$limit; 00460 } 00461 00462 // Return query: 00463 if ($this->debugOutput) $this->debug_lastBuiltQuery = $query; 00464 return $query; 00465 } 00466 00477 function listQuery($field, $value, $table) { 00478 $command = $this->quoteStr($value, $table); 00479 $where = '('.$field.' LIKE "%,'.$command.',%" OR '.$field.' LIKE "'.$command.',%" OR '.$field.' LIKE "%,'.$command.'" OR '.$field.'="'.$command.'")'; 00480 return $where; 00481 } 00482 00491 function searchQuery($searchWords,$fields,$table) { 00492 $queryParts = array(); 00493 00494 foreach($searchWords as $sw) { 00495 $like=' LIKE "%'.$this->quoteStr($sw, $table).'%"'; 00496 $queryParts[] = $table.'.'.implode($like.' OR '.$table.'.',$fields).$like; 00497 } 00498 $query = '('.implode(') AND (',$queryParts).')'; 00499 return $query ; 00500 } 00501 00502 00503 00504 00505 00506 00507 00508 00509 00510 00511 00512 00513 00514 00515 00516 00517 /************************************** 00518 * 00519 * Various helper functions 00520 * 00521 * Functions recommended to be used for 00522 * - escaping values, 00523 * - cleaning lists of values, 00524 * - stripping of excess ORDER BY/GROUP BY keywords 00525 * 00526 **************************************/ 00527 00537 function quoteStr($str, $table) { 00538 return addslashes($str); 00539 } 00540 00550 function cleanIntArray($arr) { 00551 foreach($arr as $k => $v) { 00552 $arr[$k] = intval($arr[$k]); 00553 } 00554 return $arr; 00555 } 00556 00566 function cleanIntList($list) { 00567 return implode(',',t3lib_div::intExplode(',',$list)); 00568 } 00569 00580 function stripOrderBy($str) { 00581 return eregi_replace('^ORDER[[:space:]]+BY[[:space:]]+','',trim($str)); 00582 } 00583 00594 function stripGroupBy($str) { 00595 return eregi_replace('^GROUP[[:space:]]+BY[[:space:]]+','',trim($str)); 00596 } 00597 00606 function splitGroupOrderLimit($str) { 00607 $str = ' '.$str; // Prepending a space to make sure "[[:space:]]+" will find a space there for the first element. 00608 // Init output array: 00609 $wgolParts = array( 00610 'WHERE' => '', 00611 'GROUPBY' => '', 00612 'ORDERBY' => '', 00613 'LIMIT' => '' 00614 ); 00615 00616 // Find LIMIT: 00617 if (eregi('^(.*)[[:space:]]+LIMIT[[:space:]]+([[:alnum:][:space:],._]+)$',$str,$reg)) { 00618 $wgolParts['LIMIT'] = trim($reg[2]); 00619 $str = $reg[1]; 00620 } 00621 00622 // Find ORDER BY: 00623 if (eregi('^(.*)[[:space:]]+ORDER[[:space:]]+BY[[:space:]]+([[:alnum:][:space:],._]+)$',$str,$reg)) { 00624 $wgolParts['ORDERBY'] = trim($reg[2]); 00625 $str = $reg[1]; 00626 } 00627 00628 // Find GROUP BY: 00629 if (eregi('^(.*)[[:space:]]+GROUP[[:space:]]+BY[[:space:]]+([[:alnum:][:space:],._]+)$',$str,$reg)) { 00630 $wgolParts['GROUPBY'] = trim($reg[2]); 00631 $str = $reg[1]; 00632 } 00633 00634 // Rest is assumed to be "WHERE" clause: 00635 $wgolParts['WHERE'] = $str; 00636 00637 return $wgolParts; 00638 } 00639 00640 00641 00642 00643 00644 00645 00646 00647 00648 00649 00650 00651 00652 00653 00654 /************************************** 00655 * 00656 * MySQL wrapper functions 00657 * (For use in your applications) 00658 * 00659 **************************************/ 00660 00671 function sql($db,$query) { 00672 $res = mysql_query($query, $this->link); 00673 if ($this->debugOutput) $this->debug('sql'); 00674 return $res; 00675 } 00676 00685 function sql_query($query) { 00686 $res = mysql_query($query, $this->link); 00687 if ($this->debugOutput) $this->debug('sql_query'); 00688 return $res; 00689 } 00690 00698 function sql_error() { 00699 return mysql_error($this->link); 00700 } 00701 00710 function sql_num_rows($res) { 00711 return mysql_num_rows($res); 00712 } 00713 00722 function sql_fetch_assoc($res) { 00723 return mysql_fetch_assoc($res); 00724 } 00725 00735 function sql_fetch_row($res) { 00736 return mysql_fetch_row($res); 00737 } 00738 00747 function sql_free_result($res) { 00748 return mysql_free_result($res); 00749 } 00750 00758 function sql_insert_id() { 00759 return mysql_insert_id($this->link); 00760 } 00761 00769 function sql_affected_rows() { 00770 return mysql_affected_rows($this->link); 00771 } 00772 00782 function sql_data_seek($res,$seek) { 00783 return mysql_data_seek($res,$seek); 00784 } 00785 00795 function sql_field_type($res,$pointer) { 00796 return mysql_field_type($res,$pointer); 00797 } 00798 00809 function sql_pconnect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password) { 00810 if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['no_pconnect']) { 00811 $this->link = mysql_connect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password); 00812 } else { 00813 $this->link = mysql_pconnect($TYPO3_db_host, $TYPO3_db_username, $TYPO3_db_password); 00814 } 00815 return $this->link; 00816 } 00817 00826 function sql_select_db($TYPO3_db) { 00827 return mysql_select_db($TYPO3_db, $this->link); 00828 } 00829 00830 00831 00832 00833 00834 00835 00836 00837 00838 00839 /************************************** 00840 * 00841 * SQL admin functions 00842 * (For use in the Install Tool and Extension Manager) 00843 * 00844 **************************************/ 00845 00854 function admin_get_dbs() { 00855 $dbArr = array(); 00856 $db_list = mysql_list_dbs($this->link); 00857 while ($row = mysql_fetch_object($db_list)) { 00858 if ($this->sql_select_db($row->Database)) { 00859 $dbArr[] = $row->Database; 00860 } 00861 } 00862 return $dbArr; 00863 } 00864 00872 function admin_get_tables() { 00873 $whichTables = array(); 00874 $tables_result = mysql_list_tables(TYPO3_db, $this->link); 00875 if (!mysql_error()) { 00876 while ($theTable = mysql_fetch_assoc($tables_result)) { 00877 $whichTables[current($theTable)] = current($theTable); 00878 } 00879 } 00880 return $whichTables; 00881 } 00882 00891 function admin_get_fields($tableName) { 00892 $output = array(); 00893 00894 $columns_res = mysql_query('SHOW columns FROM '.$tableName, $this->link); 00895 while($fieldRow = mysql_fetch_assoc($columns_res)) { 00896 $output[$fieldRow["Field"]] = $fieldRow; 00897 } 00898 00899 return $output; 00900 } 00901 00909 function admin_get_keys($tableName) { 00910 $output = array(); 00911 00912 $keyRes = mysql_query('SHOW keys FROM '.$tableName, $this->link); 00913 while($keyRow = mysql_fetch_assoc($keyRes)) { 00914 $output[] = $keyRow; 00915 } 00916 00917 return $output; 00918 } 00919 00927 function admin_query($query) { 00928 $res = mysql_query($query, $this->link); 00929 if ($this->debugOutput) $this->debug('admin_query'); 00930 return $res; 00931 } 00932 00933 00934 00935 00936 00937 00938 00939 00940 00941 00942 /****************************** 00943 * 00944 * Debugging 00945 * 00946 ******************************/ 00947 00954 function debug($func) { 00955 00956 $error = $this->sql_error(); 00957 if ($error) { 00958 echo t3lib_div::view_array(array( 00959 'caller' => 't3lib_DB::'.$func, 00960 'ERROR' => $error, 00961 'lastBuiltQuery' => $this->debug_lastBuiltQuery, 00962 'debug_backtrace' => function_exists('debug_backtrace') ? next(debug_backtrace()) : 'N/A' 00963 )); 00964 } 00965 } 00966 } 00967 00968 00969 if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_db.php']) { 00970 include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['t3lib/class.t3lib_db.php']); 00971 } 00972 ?>