【问题标题】:mysqli_query in PHP with SET带有 SET 的 PHP 中的 mysqli_query
【发布时间】:2014-03-11 00:22:29
【问题描述】:

我对 PHP 中的 sql 查询有一点问题。我在互联网上搜索,但我没有找到我的答案。

$row = "(null, @last_id, '000000', 'NAME', 100.00);";

mysqli_query($con,"
    INSERT INTO receipt
    VALUES (null, '$datetimeSQL', '0000-00-00 00:00:00');
    SET @last_id = LAST_INSERT_ID();

    INSERT INTO receipt_product
    VALUES $row
");

INSERT INTO 和 VALUES 有效,但是当我添加另一部分时它就不起作用了。我认为问题出在 SET 上,但我不确定。我的代码在 phpMyAdmin 中可以正常使用 SQL。

非常感谢:)

【问题讨论】:

  • 我不认为 VALUES 行末尾的分号可以在那里。应该是逗号吧?

标签: php mysql sql mysqli set


【解决方案1】:

您需要将这些作为单独的查询执行,并调用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 表包含名为idcreated_atmodified_at 的列,并且idAUTO_INCREMENT 主键,并且modified_at 在其定义中具有DEFAULT '0000-00-00 00:00:00,则你的第一个查询就变成了这样:

INSERT INTO `receipt` (
    `created_at`
) VALUES (
    '{$datetimeSQL}'
);

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 2018-05-04
    • 2015-10-25
    • 2015-12-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多