1

現在、画像アップローダーを含むフォームにトランザクションを使用していますが、トランザクションに慣れていません。次のコードをトランザクションに追加する方法がわかりません。

これが私の取引の様子です

$conn->query("START TRANSACTION");
$stmt = $conn->prepare('INSERT INTO articles(article_title, article_text, article_date) VALUES (?, ?, NOW())');
$stmt->bind_param('ss', $_POST['article_name'], $_POST['description']);
$stmt->execute();
$stmt = $conn->prepare('INSERT INTO images (article_id, image_caption, image_filename) VALUES(LAST_INSERT_ID(),?,?)');
$stmt->bind_param('ss', $_POST['image_caption'], $_FILES['image_filename']['name']);
$stmt->execute();
$stmt->close();
$conn->query("COMMIT");

以下の3つを追加しようとしています

1.アップロードされた画像が移動するフォルダーを定義します。

define('UPLOAD_DIR', '../images/');

2.ファイル名のスペースをアンダースコアに置き換え、より単純な変数名に割り当てる str_replace

$imageFile = str_replace(' ', '_', $_FILES['upload']['name']);

3.ファイルを通常の画像アップロードフォルダーに移動し、名前を変更します

move_uploaded_file($_FILES['upload']['tmp_name'], UPLOAD_DIR.$imageFile);

お手伝いありがとう!

4

1 に答える 1

3

例外を使用します。そして、ロールバックを忘れないでください。

mysqli_report(MYSQLI_REPORT_STRICT); // mysqli will throw exceptions on error

//....

$conn->query("START TRANSACTION");
try
    {
    define('UPLOAD_DIR', '../images/');
    $imageFile = str_replace(' ', '_', $_FILES['upload']['name']);
    if (!move_uploaded_file($_FILES['upload']['tmp_name'], UPLOAD_DIR . $imageFile))
        throw new Exception('Cannot upload file');

    $stmt = $conn->prepare('INSERT INTO articles(article_title, article_text, article_date) VALUES (?, ?, NOW())');
    $stmt->bind_param('ss', $_POST['article_name'], $_POST['description']);
    $stmt->execute();
    $stmt = $conn->prepare('INSERT INTO images (article_id, image_caption, image_filename) VALUES(LAST_INSERT_ID(),?,?)');
    $stmt->bind_param('ss', $_POST['image_caption'], $_FILES['image_filename']['name']);
    $stmt->execute();
    $stmt->close();
    $conn->query("COMMIT");
    echo 'Uploaded';
    } catch (Exception $e)
    {
    $conn->query("ROLLBACK");
    echo 'Error occurred';
    }
于 2013-04-26T01:02:07.050 に答える