mysql_info

(PHP 4 >= 4.3.0, PHP 5)

mysql_info --  取得最近一条查询的信息

说明

string mysql_info ( [resource link_identifier] )

mysql_info() 返回通过给定的 link_identifier 所进行的最新一条查询的详细信息。如果没有指定 link_identifier,则假定为上一个打开的连接。

mysql_info() 对以下列出的所有语句返回一个字符串。对于其它任何语句返回 FALSE。字符串的格式取决于给出的语句。

例子 1. 相关的 MySQL 语句

INSERT INTO ... SELECT ...
字符串格式:Records: 23 Duplicates: 0 Warnings: 0
INSERT INTO ... VALUES (...),(...),(...)...
字符串格式:Records: 37 Duplicates: 0 Warnings: 0
LOAD DATA INFILE ...
字符串格式:Records: 42 Deleted: 0 Skipped: 0 Warnings: 0
ALTER TABLE
字符串格式:Records: 60 Duplicates: 0 Warnings: 0
UPDATE
字符串格式:Rows matched: 65 Changed: 65 Warnings: 0
上例中的数字只是为了演示的目的,实际的值取决于查询。

注: mysql_info() 对于 INSERT ... VALUES 语句仅在该语句中列出了多个值的情况下返回一个非 FALSE 的值。

参见 mysql_affected_rows()


add a note add a note User Contributed Notes
bdobrica at gmail dot com
25-Apr-2006 03:18
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.
info at granville dot nl
09-Nov-2005 07:25
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 at projectsatellite dot com
23-Sep-2003 05:54
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);
}
carl at NOSPAMthep dot lu dot se
07-Sep-2002 07:44
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.