2013-04-17 4 views
3

Пользователь создаст статью и отправит изображение с ней.Вставьте 2 таблицы из 1 формы. Mysql Transaction?

+ Статья пойдет в таблицу статей.

+ Изображение отправится в таблицу изображений (чтобы ее можно было использовать в других областях сайта).

Было предложено использовать ОПЕРАЦИИ, но я получаю ошибки.

$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"; 
    } 
+0

"Я получаю сообщение об ошибке". Какие ошибки вы получаете? –

+0

У вас просто отсутствует точка с запятой между двумя операциями INSERT –

+1

У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с статьями «INSERT INTO» (article_title, article_text, article_date). VALUES (?,?, NO 'в строке 2 –

ответ

3
$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"); 
+0

У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с статьями «INSERT INTO» (article_title, article_text, article_date) VALUES (?,?, NO 'в строке 2 –

+0

Пробовал ли это с помощью '[space]'. d answer –

+0

Я думаю, что использование одинарных кавычек заставляет интерпретатора думать, что NOW() является строкой, но не окружена кавычками. Вы можете попытаться окружить его двойными кавычками или использовать переменную с выражением DateTime –

1

Похоже, что вы используете 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(); 
+1

Куда это пойдет? –

+0

До и после ваших запросов. –

+0

$ pdo-> beginTransaction(); \t \t \t \t \t \t \t $ SQL = 'INSERT INTO статей (article_title, article_text, article_date) ЗНАЧЕНИЯ (, сейчас()?) INSERT INTO изображений (article_id, image_caption)'; \t \t \t \t \t $ pdo-> commit(); –

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;'; 
Смежные вопросы