|
mysql_info
Get information about the most recent query
(PHP 4 >= 4.3.0, PHP 5, PECL mysql:1.0)
Example 1446. Relevant MySQL StatementsStatements that return string values. The numbers are only for illustrating purpose; their values will correspond to the query. INSERT INTO ... SELECT ... Code Examples / Notes » mysql_infocarl
This function can be used as a workaround for a misfeature of MySQL: on an UPDATE, rows that aren't updated _solely because they looked the same before_ will not be seen in mysql_affected_rows(). This causes problems when you want to use the result of the update to determine if there's need to do an INSERT. With MySQL you can do an INSERT IGNORE if there's no risk of if failing because of a duplicate key other than the one used in the UPDATE. However, if this isn't the case or you want a bit of RDBMS independence, there's no easy/pretty workaround. I think I'll resort to doing a SELECT to determine the primary key before doing the update/insert, as using the CVS version of PHP isn't an option for me.
info
Imade a quick conversion of eric's function just to count matched or affected rows from a query. /**GD gdf_db_count_query_v1: returns the amount of rows matched or affected by the last query. Must be used immediately after the concerned query. */ function gdf_db_count_query($link = 'dbh') { $info_str = mysql_info($$link); if (ereg("Records: ([0-9]*)", $info_str, $count) == false) { ereg("Rows matched: ([0-9]*)", $info_str, $count); } return $count; } eric
I agree that this is a useful function to use when trying to check on whether an update query matched a particular row. I created a simple function that returns an associative array with the values delineated in the returned string. function get_mysql_info($linkid = null){ $linkid? $strInfo = mysql_info($linkid) : $strInfo = mysql_info(); $return = array(); ereg("Records: ([0-9]*)", $strInfo, $records); ereg("Duplicates: ([0-9]*)", $strInfo, $dupes); ereg("Warnings: ([0-9]*)", $strInfo, $warnings); ereg("Deleted: ([0-9]*)", $strInfo, $deleted); ereg("Skipped: ([0-9]*)", $strInfo, $skipped); ereg("Rows matched: ([0-9]*)", $strInfo, $rows_matched); ereg("Changed: ([0-9]*)", $strInfo, $changed); $return['records'] = $records[1]; $return['duplicates'] = $dupes[1]; $return['warnings'] = $warnings[1]; $return['deleted'] = $deleted[1]; $return['skipped'] = $skipped[1]; $return['rows_matched'] = $rows_matched[1]; $return['changed'] = $changed[1]; return $return; } After trying to update a row that may or may not exist, you can use the above function like so: $vals = get_mysql_info($linkid); if($vals['rows_matched'] == 0){ mysql_query("INSERT INTO table values('val1','val2', 'valetc')", $linkid); } bdobrica
As a solution to the problem pointed in the post reffering to mysql_affected_rows() returning 0 when you are making an update query and the fields are not modified although the query is valid, i'm posting the following function. It is very simple and based on a previous post. function mysql_modified_rows () { $info_str = mysql_info(); $a_rows = mysql_affected_rows(); ereg("Rows matched: ([0-9]*)", $info_str, $r_matched); return ($a_rows < 1)?($r_matched[1]?$r_matched[1]:0):$a_rows; } Hope you'll find it usefull. |
Change Languagemysql_affected_rows mysql_change_user mysql_client_encoding mysql_close mysql_connect mysql_create_db mysql_data_seek mysql_db_name mysql_db_query mysql_drop_db mysql_errno mysql_error mysql_escape_string mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_lengths mysql_fetch_object mysql_fetch_row mysql_field_flags mysql_field_len mysql_field_name mysql_field_seek mysql_field_table mysql_field_type mysql_free_result mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql_insert_id mysql_list_dbs mysql_list_fields mysql_list_processes mysql_list_tables mysql_num_fields mysql_num_rows mysql_pconnect mysql_ping mysql_query mysql_real_escape_string mysql_result mysql_select_db mysql_set_charset mysql_stat mysql_tablename mysql_thread_id mysql_unbuffered_query |