【发布时间】:2015-04-08 22:20:41
【问题描述】:
我有一个功能不符合我的预期。其目的是为选择查询返回一个行数组,或为插入查询返回插入 ID。由于某种原因,如果有一个插入查询后跟一个选择查询,则测试查询是否为插入的函数部分会失败,因为 inesrt_id 仍然返回插入行的 id。我可以围绕这个进行编程,但我真的很想了解它为什么会发生。
我的理解是,如果最近的查询是一个选择,那么应该没有插入 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;
}
【问题讨论】:
-
您插入的列是否具有 AUTO_INCREMENT 属性?