即使在选择查询之后,mysqli_insert_id仍然返回一个值

时间:2015-04-08 22:20:41

标签: php mysql sql

我的功能不像我期望的那样。其目的是为select查询返回行数组,或者为Insert查询返回插入ID。由于某种原因,如果存在插入查询后跟一个select查询,那么它测试查询是否为插入的函数部分将失败,因为inesrt_id仍然返回插入行的id。我可以围绕这个进行编程,但我真的很想了解它为什么会发生。

我的理解是,如果最近的查询是select,那么应该没有插入ID。我是mysqli的新手,所以也许查询并没有真正结束'当我认为它这样做时,新选择计为同一查询的一部分?如果我在每个查询上重新创建连接但是这不可行,我可以让它工作正常。这是查询功能的代码。

public function __construct(){
    parent::__construct();
    //        @mysql_select_db ('public') OR die('Could not select the database: ' . mysql_error() );
    $this->connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_TABLE, DB_PORT)OR die ('Could not connect to MySQL: ' . mysql_error());
    $this->db = $this;
}

public function query_return($querystring){

    $response = array();
    $this->result_object = $this->connection->query($querystring);
    if($this->result_object != FALSE) {
        $last_id = $this->connection->insert_id;
        if (!empty($last_id)) {
            $response = $last_id;
        }
        else {
            while ($row = mysqli_fetch_assoc($this->result_object)) {
                array_push($response, $row);
            }
        }
    }
    else{
        $response = PEAR::raiseError('There was a problem with the query: '. mysql_error());
    }
    return $response;


}

编辑:好的,感谢下面的人,我在函数中添加了一个is_object测试。我无法直接替换真/假测试,因为我实际上也使用此函数进行删除,我想知道它何时失败。我使用is_object测试包装了insert_id测试,现在似乎正在运行。我想如果连接上有一个先前的插入,那么将返回一个insert_id,但是我不认为这会导致问题,因为这些函数只有在从query_return收到FALSE时才会失败。

我仍然无法理解为什么mysqli_insert_id会在选择查询后返回一个值,因为文档会让我相信它不应该但至少我的代码工作正常。这个query_return函数是从' mysql _' (没有' i')这些方法的程序版本,并且它适用于那些版本,所以我仍然没有理解。无论如何,这是调整后的功能。

private function query_return($querystring){

    $response = array();
    $this->result_object = $this->connection->query($querystring);
    if($this->result_object != FALSE) {
        if (!is_object($this->result_object)) {
            $last_id = $this->connection->insert_id;
            if (!empty($last_id)) {
                $response = $last_id;
            }
        }
        else {
            while ($row = mysqli_fetch_assoc($this->result_object)) {
                array_push($response, $row);
            }
        }
    }
    else{
        $response = PEAR::raiseError('There was a problem with the query: '. mysql_error());
    }
    return $response;
}

3 个答案:

答案 0 :(得分:3)

PHP的{p> Looking though the sourcehttps://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-insert-id.html

的包装器

本文档说明了以下内容

  

LAST_INSERT_ID()(不带参数)返回一个BIGINT(64位)值,表示第一个自动生成的值   由最近执行的INSERT设置为AUTO_INCREMENT列   声明影响这样一个列

https://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

我建议将你的if语句更改为

 if (!is_object($this->result_object)) {

这将检查是否有任何要检索的结果

PHP文档可能应该更新以反映这一点,因为它显然是明显的行为

答案 1 :(得分:1)

这就是它的工作原理,mysqli_insert_id仍然返回一个值,因为它是相同的连接。您需要关闭并打开一个新的设置为0。

答案 2 :(得分:0)

我相信变量会保留上次调用的值。尝试添加一个未设置($ last_id);如下。如果它不起作用,请告诉我。欢呼声。

public function __construct(){
    parent::__construct();
    //        @mysql_select_db ('public') OR die('Could not select the database: ' . mysql_error() );
    $this->connection = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_TABLE, DB_PORT)OR die ('Could not connect to MySQL: ' . mysql_error());
    $this->db = $this;
}

public function query_return($querystring){

    $response = array();
    $this->result_object = $this->connection->query($querystring);
    if($this->result_object != FALSE) {
        $last_id = $this->connection->insert_id;
        if (!empty($last_id)) {
            $response = $last_id;
        }
        else {
            while ($row = mysqli_fetch_assoc($this->result_object)) {
                array_push($response, $row);
            }
        }
        unset($last_id);    //<--------here
    }
    else{
        $response = PEAR::raiseError('There was a problem with the query: '. mysql_error());
    }
    return $response;


}