我的功能不像我期望的那样。其目的是为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;
}
答案 0 :(得分:3)
本文档说明了以下内容
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;
}