PHP-MySQLi-插入时最后使用SELECT不起作用


PHP - MySQLi - Insert with SELECT at the end not working

我在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总是错误的,错误为:

未捕获异常"mysqli_sql_exception",消息为"您有SQL语法错误;查看与您的在SELECT app_id附近使用正确语法的MySQL服务器版本FROM应用程序WHERE app_identifier=?AND os_id=?'在1'线上

奇怪的是,这个查询在我的SQL中运行良好。这是mysqli的限制吗?

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

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

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

以下内容仅供参考,因为它涉及PDO,而问题是关于mysqli的。不过,它通常是有用的

我认为这在mysql中工作,但在mysqli中不工作的原因是后者本机支持prepared语句,而前者使用模拟。由于您的表达式包含两个查询,所有绑定参数都由驱动程序提供给第一个查询(其中使用了两个查询并丢弃了另外两个查询(。第二个查询没有得到任何参数,因此问号是语法错误。通过准备好的语句模拟,PHP实际上用正确转义的值替换问号,从而形成两个有效的查询。

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

另请参阅http://www.php.net/manual/en/pdo.setattribute.php