2015-05-02 4 views
2

Я строю свой проект электронной коммерции для школы, но я столкнулся с проблемой. Как автоматически сократить запасы и изменить статус заказа в одном запросе?Как обновить две записи из разных таблиц в одном запросе?

вот моя база данных:

стол заказов: идентификатор | customer_id | дата | статус | всего

таблица orderitems: ID | order_id | product_id | количество:

изделия для столовой: ID | категория | название | описание | изображение | цена | запас

Вот код для просмотра записей из таблицы заказов:

<?php session_start(); 
    ob_start(); 
    if(ISSET($_SESSION['SESS_ADMINLOGGEDIN'])){ 
    } 
    else{ 
    header("location: login.php"); 
    } 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:// www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/ > 
    <link rel="stylesheet" href="css/style_admin.css" type="text/css" /> 
    <title>Untitled Document</title> 
</head> 

<body> 
    <?php 
    require("../config.php"); 
    require("../functions.php"); 
    if(!isset($_SESSION['SESS_ADMINLOGGEDIN'])) { 
     header("Location: " . $config_basedir); 
    } 
    if(isset($_GET['func']) == TRUE) { 

     $funcsql = "UPDATE orders SET status = 10 WHERE id = " . $_GET['id']; 
     mysql_query($funcsql); 

     header("Location: orders.php"); 
    } 
    else { 
     require("header.php"); 
     echo "<h1>Outstanding orders</h1>"; 
     $orderssql = "SELECT * FROM orders WHERE status = 2"; 
     $ordersres = mysql_query($orderssql); 
     $numrows = mysql_num_rows($ordersres); 
     if($numrows == 0) 
     { 
     echo "<strong>No orders</strong>"; 
     } 
     else 
     { 
     echo "<table cellspacing=10>"; 
     while($row = mysql_fetch_assoc($ordersres)) 
     { 
      echo "<tr>"; 
      echo "<td>[<a href='adminorderdetails.php?id=" . $row['id']. "'>View</ a>]</td>"; 
      echo "<td>". date("D jS F Y g.iA", strtotime($row['date'])). "</td>"; 
      echo "<td>"; 
      if($row['registered'] == 1) 
      { 
      echo "Registered Customer"; 
      } 
      else 
      { 
      echo "Non-Registered Customer"; 
      } 
      echo "</td>"; 
      echo "<td>Rp. ;" . sprintf('%.2f', 
      $row['total']) . "</td>"; 
      echo "<td>"; 
      if($row['payment_type'] == 1) 
      { 
      echo "PayPal"; 
      } 
      else 
      { 
      echo "Cheque"; 
      } 
      echo "</td>"; 
      echo "<td><a href='orders.php?func=conf&id=" . $row['id']. "'>Confirm Payment</a></td>"; 
      echo "</tr>"; 
     } 
     echo "</table>"; 
     } 
    } 
    ?> 

</body> 
</html> 

я успешно для обновления статуса «10», но я хочу, чтобы уменьшить запас на складе таблицы продукции - количество от table orderitems, когда администратор нажимает «Подтвердить платеж».

+2

Почему это должен быть один запрос? Используйте несколько запросов и поместите их в транзакцию. Пример [в этом уроке вы узнаете о транзакции MySQL и о том, как использовать инструкцию MySQL COMMIT и MySQL ROLLBACK statemen] (http://www.mysqltutorial.org/mysql-transaction.aspx) –

ответ

3

Вы можете сделать это, как пример кода ниже.

Предположим, что есть две таблицы.

Таблица 1

create table db1 (
username varchar(10), 
user_level integer 
); 

Таблица 2

create table db2 (
username varchar(10), 
user_level integer 
); 

Для выборки данных вставки несколько записей со значениями.

insert into db1 values ('a', 0), ('b', 2), ('c', 3); 
insert into db2 values ('a', 2), ('b', 1), ('c', 3); 

Вот один запрос, который вы просили в качестве образца ниже

update db1 inner join db2 on db1.username = db2.username 
    set db1.user_level = 6, 
     db2.user_level = 5 
    where db1.username = 'a'; 
0

Вы не можете обновлять разные таблицы в одном запросе. Если вы хотите сделать это и предотвратить несоответствие в db из-за неудачи второго обновления, вы должны использовать транзакции, иначе вы должны использовать 2 запроса. Вы можете реализовать транзакции в своем коде, вы можете реализовать триггер при обновлении или вы можете создать хранимую процедуру в БД.

Пожелайте, чтобы я поняла, и это помогает!

Смежные вопросы