您需要将这些作为单独的查询执行,并调用mysqli_insert_id() 来获取最后一个插入 ID,而不是尝试在一个查询调用中完成所有操作。出于安全原因,MySQL 库通常不会在一次调用中执行多个语句。
您在原始查询中的SET 行需要替换为语句之间的此代码调用。
$id = (int)mysqli_insert_id($con);
mysqli_insert_id() 将返回 AUTO_INCREMENT 为主键生成的最后一个值,因此在这种情况下,它将返回通过将 NULL 插入列中生成的收据 id。
因此,通过适当的错误检查和单独的语句,您的代码应该如下所示:
// If you aren't already escaping the datetime with mysqli_real_escape_string, you need to do this:
$datetimeSQL = mysqli_real_escape_string($con, $datetimeSQL);
$sql = "INSERT INTO `receipt`
VALUES (null, '{$datetimeSQL}', '0000-00-00 00:00:00')";
$result = mysqli_query($con, $sql);
if ($result) {
$id = (int)mysqli_insert_id($con);
$sql = "INSERT INTO `receipt_product`
VALUES (null, {$id}, '000000', 'NAME', 100.00);"
$result = mysqli_query($con, $sql);
if (!$result) {
print('MySQL error: [' . mysqli_errno($con) . '] ' . mysqli_error($con));
}
} else {
print('MySQL error: [' . mysqli_errno($con) . '] ' . mysqli_error($con));
}
您还可以通过删除mysqli_ 前缀并将它们作为$con 对象上的方法调用mysqli_*() 函数作为mysqli 类的方法,因此mysqli_query($con, $sql) 变为$con->query($sql)、@987654336 @ 变为 $con->errno(),以此类推。
作为附加说明,最好在执行INSERT 语句时始终定义您提供的列名,因为这样可以让您的查询在您稍后向表中添加其他列时继续正常运行。例如,如果receipt 表包含名为id、created_at 和modified_at 的列,并且id 是AUTO_INCREMENT 主键,并且modified_at 在其定义中具有DEFAULT '0000-00-00 00:00:00,则你的第一个查询就变成了这样:
INSERT INTO `receipt` (
`created_at`
) VALUES (
'{$datetimeSQL}'
);