PHP - MySQLi - 最后插入SELECT无法正常工作

时间:2016-10-19 22:01:27

标签: php sql mysqli

我在PHP中有这个功能。我试图插入(如果有必要)然后从表中获取app_id。

private function addApp($bundle_identifier,$os_id) {

$driver = new mysqli_driver();
$driver->report_mode = MYSQLI_REPORT_ALL;

//Insert or update app details
if ($stmt = $this->db->prepare("INSERT IGNORE INTO app (app_identifier,os_id) VALUES (?,?); SELECT app_id FROM app WHERE app_identifier = ? AND os_id = ?")){
    $stmt->bind_param("ssss", $bundle_identifier,$os_id,$bundle_identifier,$os_id);
    $stmt->execute();
    $stmt->bind_result($app_id);

    if (!isset($app_id)) {
      echo "is set";
       $app_id=$stmt->insert_id;
    }
}

if($this->db->commit()){
  return $app_id;
}

return  0;
}

这里的问题是stmt始终为false并带有错误:

  

未捕获的异常'mysqli_sql_exception',消息'你有一个   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,用于在'SELECT app_id附近使用正确的语法   FROM app WHERE app_identifier =? AND os_id =?'在第1行

奇怪的是这个查询在我的SQL中工作正常。 这是mysqli的限制吗?

1 个答案:

答案 0 :(得分:1)

根据http://php.net/manual/en/mysqli.prepare.php

  

查询必须由单个SQL语句组成。

这基本上回答了你的问题。您必须对两个查询使用两个db调用。或者使用类似http://php.net/manual/en/mysqli.multi-query.php

的内容

以下内容仅供参考,因为它引用了PDO,而问题是关于mysqli。它通常很有用。

我认为这个在mysql中运行的原因,而不是在mysqli中的原因是后者本身支持预处理语句,而前者使用仿真。由于表达式包含两个查询,因此驱动程序将所有绑定参数提供给第一个查询(其中两个使用两个并丢弃另外两个)。然后第二个查询没有参数,因此问号是语法错误。使用准备好的语句仿真PHP实际上用正确的转义值替换问号,因此形成两个有效的查询。

您可以使用$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true)启用模拟,但这可能会略微影响性能。

另见http://www.php.net/manual/en/pdo.setattribute.php