php - MySQL insert_id 总是返回零

标签 php mysql oop

我正在将一个旧项目从 php 5.3 编辑到 php 7+。 不愉快的工作,但我必须对代码进行最少的更改。

我遇到了以下问题。 insert_id 始终返回 0。

我读到这可能是因为我的表上没有 auto_increment 键,或者最后一个查询不是 INSERTUPDATE 语句,但我的问题不是因为这个。请求成功将信息输入数据库。

这是代码:

class DBTable{

 function connection(){
    $mysqli = new mysqli('localhost', 'username', 'pass', 'db');

    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }

    if (!$mysqli->set_charset("utf8")) {
        printf("Error loading character set utf8: %s\n", $mysqli->error);
        exit();
    }
    return $mysqli;
  }

  function addrow_id($row){
    $query="some INSERT query";
    $res = $this->connection()->query($query);
    if ($res) $response = $this->connection()->insert_id; //always returns zero    
    return $response;
  }
}

我很清楚这不是一个好的 PHP 但我不能从一个新项目开始这个项目,我的任务只是让它与 PHP 7+< 一起工作/强>

最佳答案

$this->connection() 每次都会返回一个新连接。插入 ID 特定于连接,否则您会受到并行客户端的干扰。您需要重用您的连接对象:

$query="some INSERT query";
$con = $this->connection();
$res = $con->query($query);
if ($res) $response = $con->insert_id;

您最好在__construct 中执行一次$this->con = $this->connection() 并在整个对象中重用相同的连接;或者,更好的是,在实例化对象时注入(inject)一个已在全局范围内建立的连接作为依赖项:

$con = new mysqli(...);
$db = new DBTable($con);

否则你会有很多开销不断地建立和拆除连接。更不用说硬编码连接的可测试性等了。

关于php - MySQL insert_id 总是返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51786863/

相关文章:

php - 刷新内容,不加载

javascript - 识别外部文件中某些标签之间的字符串 - PHP

php - JPEG 图像在 Android 和 IOS 后端 php webservice 中显示不同

php - 尝试使用 pdo 语句删除行,其中行项与 php 变量匹配

oop - 我应该如何在数据库和 OOP 中建模组关系?

java - 跟踪列表中对象的最佳方式?

php - SOLID - 单一职责原则是否适用于类中的方法?

php - 仅返回在 MYSQL 查询中找到的记录数

php - 如何在 Laravel 4 中批量更新

mysql - 无法在 MySQL 中创建外键