可能为某些人节省一些时间...
<?php
$prototype='Rows matched: 0 Changed: 1 Warnings: 2';
list($matched, $changed, $warnings) = sscanf($prototype, "Rows matched: %d Changed: %d Warnings: %d");
$?>
(PHP 5、PHP 7、PHP 8)
mysqli::$info -- mysqli_info — 检索最近执行查询的信息
面向对象风格
过程化风格
该 mysqli_info() 函数返回一个字符串,提供有关最后执行的查询的信息。此字符串的性质如下所示
查询类型 | 示例结果字符串 |
---|---|
INSERT INTO...SELECT... | Records: 100 Duplicates: 0 Warnings: 0 |
INSERT INTO...VALUES (...),(...),(...) | Records: 3 Duplicates: 0 Warnings: 0 |
LOAD DATA INFILE ... | Records: 1 Deleted: 0 Skipped: 0 Warnings: 0 |
ALTER TABLE ... | Records: 3 Duplicates: 0 Warnings: 0 |
UPDATE ... | Rows matched: 40 Changed: 40 Warnings: 0 |
注意:
不属于上述格式之一的查询不受支持。在这些情况下,mysqli_info() 将返回空字符串。
一个字符字符串,表示有关最近执行的查询的其他信息。
示例 #1 $mysqli->info 示例
面向对象风格
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$mysqli->query("CREATE TEMPORARY TABLE t1 LIKE City");
/* INSERT INTO ... SELECT */
$mysqli->query("INSERT INTO t1 SELECT * FROM City ORDER BY ID LIMIT 150");
printf("%s\n", $mysqli->info);
过程化风格
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
mysqli_query($link, "CREATE TEMPORARY TABLE t1 LIKE City");
/* INSERT INTO ... SELECT */
mysqli_query($link, "INSERT INTO t1 SELECT * FROM City ORDER BY ID LIMIT 150");
printf("%s\n", mysqli_info($link));
以上示例将输出
Records: 150 Duplicates: 0 Warnings: 0
可能为某些人节省一些时间...
<?php
$prototype='Rows matched: 0 Changed: 1 Warnings: 2';
list($matched, $changed, $warnings) = sscanf($prototype, "Rows matched: %d Changed: %d Warnings: %d");
$?>
我不记得我从哪里得到这个信息,但它非常重要,我无法相信文档中缺少它!
如果在添加/更新仅一行记录的“INSERT INTO ... VALUES ()”之后执行 mysqli_info()/$mysqli->info(),则 mysqli::info() 返回空结果(!!!)。
如果为空(php 8+ 中为 null;在 php 7 中我不知道它以何种方式为空),请检查 $mysqli->affectedRows() 或 mysqli_affected_rows()。如果返回 2,则 INSERT 成功更新了一条记录(因此必须存在 ON DUPLICATE KEY UPDATE)。如果返回 1:则插入了一条记录。
这不是错误,这是设计使然,尽管它让我想起了 90 年代的微软“这不是错误,这是一个特性”。我不知道为什么要这样设计,除非是一些奇怪且非常旧的向后兼容性问题。
如果只插入了一行,mysqli_info() 返回空字符串,这可能会令人困惑,但在这种情况下,mysqli_affected_rows() 返回 1。