mysql_info

(PHP 4 >= 4.3.0, PHP 5)

mysql_info获取有关最近查询的信息

警告

此扩展在 PHP 5.5.0 中已弃用,并在 PHP 7.0.0 中移除。应该使用 MySQLiPDO_MySQL 扩展。另请参见 MySQL: 选择 API 指南。此函数的替代方法包括

描述

mysql_info(resource $link_identifier = NULL): string

返回有关最后查询的详细信息。

参数

link_identifier

MySQL 连接。如果未指定链接标识符,则假定为 mysql_connect() 打开的最后一个链接。如果没有找到此类链接,它将尝试创建链接,就好像 mysql_connect() 被调用时没有参数一样。如果找不到或建立连接,则会生成 E_WARNING 级别的错误。

返回值

如果成功,则返回有关语句的信息,否则返回 false。有关哪些语句提供信息以及返回值可能是什么样的,请参见下面的示例。未列出的语句将返回 false

示例

示例 #1 相关的 MySQL 语句

返回字符串值的语句。数字仅用于说明目的;它们的值将对应于查询。

INSERT INTO ... SELECT ...
String format: Records: 23 Duplicates: 0 Warnings: 0 
INSERT INTO ... VALUES (...),(...),(...)...
String format: Records: 37 Duplicates: 0 Warnings: 0 
LOAD DATA INFILE ...
String format: Records: 42 Deleted: 0 Skipped: 0 Warnings: 0 
ALTER TABLE
String format: Records: 60 Duplicates: 0 Warnings: 0 
UPDATE
String format: Rows matched: 65 Changed: 65 Warnings: 0

注释

注意:

mysql_info() 仅当在语句中指定了多个值列表时,才会为 INSERT ... VALUES 语句返回非 false 值。

参见

添加注释

用户贡献注释 5 个注释

8
info at granville dot nl
18 年前
我快速转换了 eric 的函数,只是为了从查询中计算匹配或受影响的行数。

/**GD gdf_db_count_query_v1: 返回与最后查询匹配或受最后查询影响的行数。必须在相关查询后立即使用。
*/

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;

}
6
eric at projectsatellite dot com
20 年前
我同意,当尝试检查更新查询是否匹配特定行时,这是一个有用的函数。我创建了一个简单的函数,它返回一个关联数组,其中包含在返回字符串中划分的这些值。

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;
}

在尝试更新可能存在或可能不存在的行后,您可以像这样使用上面的函数

$vals = get_mysql_info($linkid);
if($vals['rows_matched'] == 0){
mysql_query("INSERT INTO table values('val1','val2', 'valetc')", $linkid);
}
4
tomas at matfyz dot cz
15 年前
请注意,由于 MySQL 错误 #41283 和 #41285,无法从 mysql_info() 中获取警告计数信息

http://bugs.mysql.com/?id=41283
http://bugs.mysql.com/?id=41285
1
bdobrica at gmail dot com
18 年前
作为对指向 mysql_affected_rows() 在进行更新查询时返回 0 的问题的解决方案,即使字段未修改,但查询有效,我发布了以下函数。它非常简单,基于之前的帖子。

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;
}

希望您会发现它有用。
-8
carl at NOSPAMthep dot lu dot se
21 年前
此函数可用于解决 MySQL 的一个错误:在 UPDATE 中,不会在 mysql_affected_rows() 中看到 _仅因为它们在之前看起来相同而没有更新_ 的行。当您想要使用更新结果来确定是否需要执行 INSERT 时,这会导致问题。使用 MySQL,如果您没有因重复键(除了在 UPDATE 中使用的键之外)而导致失败的风险,您可以执行 INSERT IGNORE。但是,如果情况并非如此,或者您想要一些 RDBMS 独立性,那么就没有简单/漂亮的解决方法。我想我会诉诸于在执行更新/插入之前执行 SELECT 来确定主键,因为对我来说,使用 CVS 版本的 PHP 并不是一个选项。
To Top