2017-02-21 3 views
0

Я создал сценарий для создания порядка и создания счета-фактуры. Вот две таблицы mysql tbl_order и tbl_invoice.Система выставления счетов и выставления счетов в PHP

tbl_invoice:

`id`, `customer_id`, `status`, `invoicedate`, `total`, `payment_method`, `duedate`, `paiddate`, `details`, `order_id` 

tbl_order

`id`, `customer_id`, `status`, `orderdate`, `invoice_id`, `total`, `reseller`, `nextdue` 

Так в основном, Когда заказ будет размещена после клиента нажмите перейти к оплате, он будет генерировать счета-фактуры в tbl_invoice и добавить детали заказа в tbl_order.

Однако в tbl_invoice их одно поле называется order_id, а в tbl_order их поле называется invoice_id.

Когда щелкает клиент Приступить к оплате, поскольку она приносит как счета-фактуры и порядок, я использовал следующий сценарий обновить обе таблицы:

$invoice = mysql_query("INSERT INTO `tbl_invoice` (customer_id, status, invoicedate, payment_method, total, duedate) VALUES ('$client', '$status', '$date', '$method', '$total', '$duedate')") or die("Failed to connect invoice query " .mysql_error()); 


$order = mysql_query("INSERT INTO `tbl_order` (customer_id, status, total, orderdate) VALUES ('$client', '$status', '$total', '$date')") or die("Failed to connect order query " .mysql_error()); 

$invoice_query =mysql_query("SELECT * FROM `tbl_invoice` ORDER BY `id` DESC LIMIT 1" .mysql_error()); 
$invoice_result = mysql_fetch_assoc($invoice_query); 
$invoice_id = $invoice_result['id']; 

$order_query =mysql_query("SELECT * FROM `tbl_order` ORDER BY `id` DESC LIMIT 1" .mysql_error()); 
$order_result = mysql_fetch_assoc($order_query); 
$order_id = $order_result['id']; 

$invoice = mysql_query("UPDATE `tbl_invoice` SET `order_id` = '$order_id' ORDER BY `id` DESC LIMIT 1") or die("Failed to connect invoice query 1" .mysql_error()); 
$order = mysql_query("UPDATE `tbl_order` SET `invoice_id` = '$invoice_id' ORDER BY `id` DESC LIMIT 1") or die("Failed to connect order query 1 " .mysql_error()); 

Вот как это работает:

  • Сначала он производит счет-фактуру. (поле order_id не заполнено)
  • Затем он генерирует заказ. (поле идентификатора счета остается пустым)
  • С $ invoice_query я получаю последнее (используя ORDER BY id DESC LIMIT 1), добавленную в таблицу счетов, а затем я обновляю 'order_id' с таким идентификатором заказа.

  • С $ order_query я получаю последнюю строку, добавленную в таблицу заказов, а затем я обновляю 'invoice_id' с таким идентификатором счета-фактуры.

Теперь проблема возникает, если на втором втором заказчике создается заказ и счет-фактура. Это приведет к неправильным данным в неправильных полях.

Может ли кто-нибудь предложить мне лучший способ обновить эти таблицы?

+0

Вы используете устаревший интерфейс mysql, который крайне небезопасен. Перейдите к PDO и проверьте [PDO :: lastInsertId] (http://php.net/manual/en/pdo.lastinsertid.php) – rustyx

+0

Остановить убой невинных котят :-( – Strawberry

+0

Перед переносом вы можете использовать эквивалент [mysql_insert_id] (http://php.net/manual/en/function.mysql-insert-id.php), но я согласен, что вы должны перейти на PDO ASAP. – Gondrup

ответ

0

Циклические отношения здесь - счет-фактура относится к заказу, а заказ относится к счет-фактуре. Это очень плохой анти-шаблон в реляционном дизайне БД. Кроме того, только достижимый (в таком случае как у вас), когда вы отдаете контроль соблюдения через внешние ключи. Таким образом, у вас могут быть непоследовательные данные. Насколько это хорошо в области, связанной с деньгами клиента (и компании)?

Вы когда-нибудь спрашивали себя, почему вам, возможно, понадобится такое циклическое отношение?

Я могу догадаться, что мгновенный ответ будет «Я не знаю», а затем «Мне это действительно не нужно!».:-)

Так предложение - перестроить базу данных, сделать соотношение односторонний

как, счет-фактура привязываются на заказ - что кажется более логичным, так как существует период времени, когда заказ сделан, но не но в действительности это не имеет значения, так как у вас есть 1: 1 здесь

затем принудительно выполнить его, сделав внешний ключ из order_id в таблице счетов.

Или - опять же, как только у вас есть отношение 1: 1 здесь - скомбинируйте счет-фактуру и заказ в одной таблице & создайте запись сразу.

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