$smcFunc

In SMF 2.0, multiple database support was introduced. This was implemented by developers as a new layer of database functions along with a new security model, which provides a fast and secure method to work across database systems.

Below is a list of the database functions that currently exist in 2.0. Each of these links will direct you towards a section about that function that will help you understand what each one does, how its input is expected and if possible, the exact duplicate function for mysql. An example is provided as well for most of these, these examples come straight from the SMF Source code.

Please note our Function Database now has the latest SMF 2.0 functions for your information and may help in explaining the functions. They do not use the $smcFunc variables that this guide does. For most of your functions you will see "smf_db_xxx" where xxx is the function name such as "smf_db_insert" that is used by $smcFunc['db_insert'].

db_query
Usage $smcFunc['db_query'] (identifier, query, values, connection)=== Example $result = $smcFunc['db_query'](''', '               SELECT poster_time                FROM {db_prefix}messages                WHERE id_msg = {int:id_msg}                LIMIT 1',                array( 'id_msg' =&gt; $user_settings['id_msg_last_visit'], )           );}
 * Works Similar to how db_query worked in 1.x versions.
 * Identifier is used for identifying specific queries that will be handled specially.
 * Values is an array of values you are intending to use in the query.

db_quote
Usage $smcFunc['db_quote'] (query, values, connection)=== Example $realNameMatches[] = $smcFunc['db_quote'](               '{string:possible_user}',                 array( 'possible_user' =&gt; $possible_user )           );}
 * Works Similar to how db_query works with the exception of no identifier.
 * Values is an array of values you are intending to use in the query.
 * Does not execute the query, Formats as if it where going to be and returns the string.

db_fetch_assoc
Usage $smcFunc['db_fetch_assoc'] ($result)=== Example while ($row = $smcFunc['db_fetch_assoc']($request)) $search_params['brd'][] = $row['id_board'];}
 * Will return exact same results as mysql_fetch_assoc

db_fetch_row
Usage $smcFunc['db_fetch_row'] ($result)=== Example while ($row = $smcFunc['db_fetch_row']($request)) $toDelete[] = $row[0];}
 * Will return exact same results as mysql_fetch_row.
 * Emulated while using SQlite with smf_sqlite_fetch_row.

db_free_result
Usage $smcFunc['db_free_result'] ($result)=== Example $smcFunc['db_free_result']($request);}
 * Will return exact same results as mysql_free_result.
 * Emulated while using SQlite with smf_sqlite_free_result.

db_insert
Usage $smcFunc['db_insert'] (method, table, columns, data, keys, disable_trans, connection)=== Example $smcFunc['db_insert']('replace',           '{db_prefix}log_topics',            array( 'id_member' =&gt; 'int', 'id_topic' =&gt; 'int', 'id_msg' =&gt; 'int', ),           array( $user_info['id'], $topic, $modSettings['maxMsgID'], ),           array('id_member', 'id_topic')        );}
 * Emulated with smf_db_insert.
 * Method tells how to change the data. Accepts "replace" "ignore" or "insert".
 * Table: the data will be changed on.
 * Columns: An array ( column_name =&gt; input_type) set that holds all column names that will be changed and their expected input type.
 * Data holds an array that must be as long as the column array with all the data that will be used.
 * Keys is supposed to hold the tables key information, only appears to affect sqlite and postrgresql (when using "replace") versions.

db_insert_id
Usage $smcFunc['db_insert_id'] (table, field, connect)=== Example $bcinfo['id_poll'] = $smcFunc['db_insert_id']('{db_prefixpolls', 'id_poll');}
 * Will return exact same results as mysql_insert_id.
 * Emulated while using PostgreSQL with smf_db_insert_id.
 * Table holds the table name that was affected.
 * Field holds the name of the field that was affected.

db_num_rows
Usage $smcFunc['db_num_rows'] ($result)=== Example if ($smcFunc['db_num_rows']($request) == 0) fatal_lang_error('admin_file_not_found', true, array($_REQUEST['filename']));}
 * Will return exact same results as mysql_num_rows.

db_data_seek
Usage $smcFunc['db_data_seek'] ($result, row_number)=== Example // Start from the beginning... if ($reset) return @$smcFunc['db_data_seek']($messages_request, 0);}
 * Will return exact same results as mysql_data_seek.
 * Emulated while using PostgreSQL with db_data_seek.
 * Row_number is the row number you wish the pointer to be at.

db_num_fields
Usage $smcFunc['db_num_fields'] ($result)=== Example // Get the fields in this row... $field_list = array; for ($j = 0; $j &lt; $smcFunc['db_num_fields']($result); $j++) {           // Try to figure out the type of each field. (NULL, number, or 'string'.) if (!isset($row[$j])) $field_list[] = 'NULL'; elseif (is_numeric($row[$j])) $field_list[] = $row[$j]; else $field_list[] = '''. $smcFunc['db_escape_string']($row[$j]). ''';       }}
 * Will return exact same results as mysql_num_fields.

db_escape_string
Usage $smcFunc['db_escape_string'] (uncleaned_string)=== Example // Add slashes to every element, even the indexes! foreach ($var as $k =&gt; $v) $new_var[$smcFunc['db_escape_string']($k)] = escapestring__recursive($v);}
 * MySQL databases use addslashes function instead of mysql_escape_string.
 * Does not require a database connection to use this.

db_unescape_string
Usage $smcFunc['db_unescape_string'] (cleaned_string)=== Example // Strip the slashes from every element. foreach ($var as $k =&gt; $v) $new_var[$smcFunc['db_unescape_string']($k)] = unescapestring__recursive($v);}
 * MySQL databases use stripslashes function.
 * PostgreSQL databases will emulate this with smf_postg_unescape_string.
 * SQlite databases will emulate this with smf_sqlite_unescape_string.
 * Does not require a database connection to use this.

db_server_info
Usage $smcFunc['db_server_info'] (connection)=== Example // Some MySQL versions are superior to others. $this-&gt;canDoBooleanSearch = version_compare($smcFunc['db_server_info']($db_connection), '4.0.1', '&gt;=') == 1;}
 * Attempts to get database server information.

db_tablename
Usage $smcFunc['db_tablename'] ($result, table_number)=== No example provided
 * Will return exact same results as mysql_tablename</a>.
 * Finds a table by a number.
 * Does not appear to be used in SMF coding yet.

db_affected_rows
Usage $smcFunc['db_affected_rows'] (connection)=== Example if ($smcFunc['db_affected_rows'] &lt;= 0) {           loadLanguage('Admin'); fatal_lang_error('salvaged_category_error', false); }}
 * Will return exact same results as mysql_affected_rows</a>.

db_transaction
Usage $smcFunc['db_transaction'] (type, connection)=== Example $smcFunc['db_transaction']('begin'); // Do the table and indexes... $smcFunc['db_query'](''', $table_query,       'security_override'    ); foreach ($index_queries as $query) $smcFunc['db_query'](''', $query,       'security_override'    );
 * Same as calling mysql queries for "BEGIN", "ROLLBACK", and "COMMIT".
 * Accepts "begin", "rollback", and "commit".

$smcFunc['db_transaction']('commit');}

db_error
Usage $smcFunc['db_error'] (connection)=== Example Code: [Select]</a> <pre style="margin: 0pt; padding: 0pt;">
 * Will return the exact same results as mysql_error</a>.
 * SQlite databases will emulate this with smf_sqlite_last_error, and the connection is ignored.

db_select_db
Usage $smcFunc['db_select_db'] (database_name, connection)=== No Examples
 * Will return exact same results as mysql_select_db</a>.
 * PostgreSQL functions will have this return true always in postg_select_db. PostgreSQL has database selected upon creating the connection.
 * SQlite will do nothing as there is only one database per file.

db_title
Usage $smcFunc['db_title'] === No Examples
 * Name of the database being used. Such as MySQL, PostgreSQL and SQlite.
 * Should not be called as a function, but used a string.

db_sybase
Usage $smcFunc['db_sybase'] === No Examples
 * Tells SMF whether the Database uses sybase or not.
 * PostgreSQL and SQlite use sybase, MySQL does not.

db_case_sensitive
Usage $smcFunc['db_case_sensitive'] === No Examples
 * Tells SMF whether the Database is case sensitive or not.
 * PostgreSQL is case sensitive, MySQL and SQlite are not.

==Database Package Functions only.== The below functions only exist when using db_extend('packages');

db_add_column
Usage $smcFunc['db_add_column'] (table_name, column_into, parameters, if_exists, error)=== Column Info should be an array of data containing with keys* 'name' of the column
 * with db_extend('packages');
 * This function allows for adding a column to a table.
 * Table name should be an already existing table. If you specific a database prefix, add 'no_prefix' to the paramaters.
 * 'type' of the column
 * 'size' of the column if required by type.
 * 'null', whether to use "null" or "not null"
 * 'default' should contain the default value for the column
 * 'auto' tells wether the column uses auto_increment or not.
 * As of 2.0 RC2, 'unsigned' (true/false) specifies whether the column is unsigned or not.
 * Parameters contains special items such in an array such as 'no_prefix' to not auto add a the database prefix.
 * if_exists controls what to do if the column exists, by default it updates the column

db_add_index
Usage $smcFunc['db_add_index'] (table_name, index_into, parameters, if_exists, error)=== index Info should be an array of data containing with keys* 'name' of the index
 * with db_extend('packages');
 * This function allows for adding an index to a table.
 * Table name should be an already existing table. If you specific a database prefix, add 'no_prefix' to the paramaters.
 * 'type' of the column ('primary', 'unique')
 * 'is_primary' allows the column to be primary or not.
 * Parameters contains special items such in an array such as 'no_prefix' to not auto add a the database prefix.
 * if_exists controls what to do if the column exists, by default it updates the column

db_calculate_type
Usage $smcFunc['db_calculate_type'] (type_name, type_size, reverse)===
 * with db_extend('packages');
 * This function will calculate the type and size for a column.
 * type_name should be the type of the column.
 * type_size contains the size of the column (can be empty

db_change_column
Usage $smcFunc['db_change_column'] (table_name, old_column, column_info, parameters, error)=== 'column_info' should be an array of data containing with keys* 'name' of the column
 * with db_extend('packages');
 * This function allows for changing an existing column structure.
 * 'table name' should be an already existing table. If you specific a database prefix, add 'no_prefix' to the paramaters.
 * 'old_column' should be an already existing column name.
 * 'type' of the column
 * 'size' of the column if required by type.
 * 'null', whether to use "null" or "not null"
 * 'default' should contain the default value for the column
 * 'auto' tells whether the column uses auto_increment or not.
 * As of 2.0 RC2, 'unsigned' (true/false) specifies whether the column is unsigned or not.
 * Parameters contains special items such in an array such as 'no_prefix' to not auto add a the database prefix.

db_create_table
Usage $smcFunc['db_create_table'] (table_name, columns, indexes, parameters, if_exists, error)===
 * with db_extend('packages');
 * This function allows for creating a table. You can not create a SMF default table.
 * Table_name can have a database prefix. If you specific a database prefix, add 'no_prefix' to the paramaters.
 * columns is a multi-dimensional array containing the columns to be in the table. This is passed to $smcFunc['db_add_column'] function for handling.
 * if_exists is by default using "update". Other options are 'overwrite', 'ignore', 'error', 'update_remove',
 * Parameters contains special items such in an array such as 'no_prefix' to not auto add a the database prefix.
 * if_exists controls what to do if the column exists, by default it updates the column

db_drop_table
Usage $smcFunc['db_drop_table'] (table_name, parameters, error)===
 * with db_extend('packages');
 * This function allows for removal a table. You can not delete a SMF default table.
 * Table_name can have a database prefix. If you specific a database prefix, add 'no_prefix' to the parameters.
 * Parameters contains special items such in an array such as 'no_prefix' to not auto add a the database prefix.

db_table_structure
Usage $smcFunc['db_table_structure'] (table_name)===
 * with db_extend('packages');
 * This function returns the structure of a table.
 * If you need to specific the database prefix use {db_prefix}.
 * Returns with an array with table name, columns, and indexes.

db_list_columns
Usage $smcFunc['db_list_columns'] (table_name, detail)===
 * with db_extend('packages');
 * This function returns the current columns in a table in a multi-dimensional array
 * If you need to specific the database prefix use {db_prefix}.
 * If 'detail' is specified a formated array will be returned of the column info, otherwise the plain straight column info is returned. The detailed array is 'name', 'null', 'default', 'type', 'size', 'auto'.

db_list_indexes
Usage $smcFunc['db_list_indexes'] (table_name, detail)===
 * with db_extend('packages');
 * This function returns the current indexes in a table in a multi-dimensional array
 * If you need to specific the database prefix use {db_prefix}.
 * If 'detail' is specified a formated array will be returned of the index info, otherwise the plain straight index info is returned. The detailed array is 'name', 'type', 'columns'

db_remove_column
Usage $smcFunc['db_remove_column'] (table_name, column_name, parameters, error)===
 * with db_extend('packages');
 * This function removes a column
 * Table_name can have a database prefix. If you specific a database prefix, add 'no_prefix' to the paramaters.

db_remove_index
Usage $smcFunc['db_remove_index'] (table_name, index_name, parameters, error)===
 * with db_extend('packages');
 * This function removes a index
 * Table_name can have a database prefix. If you specific a database prefix, add 'no_prefix' to the paramaters.