2017-02-21 50 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字段保持爲空)
  • 然後它生成一個訂單。 (發票ID字段保持爲空)
  • 使用$ invoice_query我得到最後一個(使用ORDER BY id DESC LIMIT 1)行添加到發票表中,然後我使用所生成的訂單ID更新'order_id'。

  • With $ order_query我將最後一行添加到訂單表中,然後使用生成的發票ID更新'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儘快 – Gondrup

回答

0

此處的循環關係 - 發票是指訂單,而訂單是指發票。 這是關係數據庫設計中非常糟糕的反模式。 此外,只有在您通過外鍵投降關係執行時纔可以實現(如您的情況)。因此,您可能最終導致數據不一致。 在與客戶(和公司)有關的領域有多好?

你有沒有想過自己爲什麼需要這種循環關係呢?

我可以猜測即時答案是「我不知道」,其次是「我其實不需要它!」。:-)

所以建議是 - 重建你的數據庫,使關係單向

一樣,發票是依賴於訂單 - 這似乎更符合邏輯的,因爲當命令作出存在一段時間,但不但基本上沒有關係,因爲您有1:1這裏

然後通過使發票表中的order_id超出外鍵來強制執行此操作。

或者,只要您有1:1的關係,就可以將發票和訂單結合在一張表中&立即創建記錄。