4

用户将创建一篇文章并提交一张图片。

+文章将转到文章表。

+图像将转到图像表(以便可以在网站的其他区域使用)。

有人建议我使用 TRANSACTIONS,但我遇到了错误。

    $sql ='BEGIN INSERT INTO articles(article_title, article_text, article_date)
            VALUES (?, ?, NOW())
            INSERT INTO images(article_id, image_caption)
            VALUES(LAST_INSERT_ID(),?);
            COMMIT';

 $stmt = $conn->stmt_init();
    if ($stmt->prepare($sql)) {
    $stmt->bind_param('sss', $_POST['article_name'], $_POST['description'], $_POST['image_caption']);

        $OK = $stmt->execute();

        printf("%d Row inserted.\n", $stmt->affected_rows);

        $stmt->free_result();

    } else{
        echo "Failure- article not uploaded";
    }
4

3 回答 3

4
$mysqli->query("START TRANSACTION");
$stmt = $mysqli->prepare('INSERT INTO articles(article_title, article_text, article_date) VALUES (?, ?, NOW())');
$stmt->bind_param('ss', $_POST['article_name'], $_POST['description']);
$stmt->execute();
$stmt = $mysqli->prepare('INSERT INTO images (article_id, image_caption) VALUES(LAST_INSERT_ID(),?)');
$stmt->bind_param('s', $_POST['image_caption']);
$stmt->execute();
$stmt->close();
$mysqli->query("COMMIT");
于 2013-04-17T08:33:29.427 回答
2

看起来您正在使用 PDO(很好!)。使用 PDO,您可以使用beginTransaction()commit()轻松获取事务

您的代码如下所示:

$pdo->beginTransaction();
// .. fire your 'normal' queries.
// .. and yet some more queries
$pdo->commit();

然后,我会亲自INSERT在两个单独的语句中编写单独的查询。在我看来更具可读性。

例子:

$pdo->beginTransaction();

$first = $pdo->prepare('INSERT INTO table (field, otherField) VALUES(?,?)');
$second = $pdo->prepare('INSERT INTO table (field, otherField) VALUES(?,?)');

$first->execute(array( .. your data (values) .. ));
$second->execute(array( .. your data (values) .. ));

$pdo->commit();
于 2013-04-17T08:37:09.840 回答
0
$sql ='START TRANSACTION;
       INSERT INTO articles (article_id,article_title, article_text, article_date) VALUES (NULL,?, ?, NOW());
       INSERT INTO images (article_id, image_caption) VALUES(LAST_INSERT_ID(),?);
       COMMIT;';
于 2013-04-17T09:09:14.270 回答