PHP 中的发票和计费系统
Invoicing and Billing System in PHP
我制作了一个脚本来创建订单和发票。这里有两个 mysql tables tbl_order 和 tbl_invoice.
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' 的字段。
当客户点击继续付款时,因为它同时生成了发票和订单,我使用以下脚本来更新这两个 tables:
$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)行添加到发票 table 然后我正在更新 'order_id' 和如此生成的订单 ID。
使用 $order_query 我将最后一行添加到订单 table 然后我用生成的发票 ID 更新 'invoice_id'。
现在,如果在特定的第二个客户创建订单和发票,就会出现问题,这将导致错误的数据进入错误的字段。
谁能建议我更新那些 table 的更好方法?
此处的循环关系 - 发票指订单,而订单指发票。
这是关系数据库设计中非常糟糕的反模式。
此外,只有当您放弃通过外键执行关系时,才能实现 (像您这样的情况)。
因此,您最终可能会导致数据不一致。
在与客户(和公司)的钱相关的领域有多好?
您有没有问过自己,到底为什么需要这种循环关系?
我猜即时答案是 "I don't know",然后是 "I actually don't need it!"。 :-)
所以建议是 - 重建你的数据库,使关系成为单向的
例如,发票与订单相关联 - 这似乎更合乎逻辑,因为存在下订单但尚未开具发票的时间段,但基本上这无关紧要,因为你在这里 1:1
然后通过在发票 table 中从 order_id 中创建一个外键来强制执行它。
或者 - 同样,只要您在这里有 1:1 关系 - 将发票和订单合二为一 table 并立即创建记录。
我制作了一个脚本来创建订单和发票。这里有两个 mysql tables tbl_order 和 tbl_invoice.
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' 的字段。
当客户点击继续付款时,因为它同时生成了发票和订单,我使用以下脚本来更新这两个 tables:
$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)行添加到发票 table 然后我正在更新 'order_id' 和如此生成的订单 ID。使用 $order_query 我将最后一行添加到订单 table 然后我用生成的发票 ID 更新 'invoice_id'。
现在,如果在特定的第二个客户创建订单和发票,就会出现问题,这将导致错误的数据进入错误的字段。
谁能建议我更新那些 table 的更好方法?
此处的循环关系 - 发票指订单,而订单指发票。 这是关系数据库设计中非常糟糕的反模式。 此外,只有当您放弃通过外键执行关系时,才能实现 (像您这样的情况)。 因此,您最终可能会导致数据不一致。 在与客户(和公司)的钱相关的领域有多好?
您有没有问过自己,到底为什么需要这种循环关系?
我猜即时答案是 "I don't know",然后是 "I actually don't need it!"。 :-)
所以建议是 - 重建你的数据库,使关系成为单向的
例如,发票与订单相关联 - 这似乎更合乎逻辑,因为存在下订单但尚未开具发票的时间段,但基本上这无关紧要,因为你在这里 1:1
然后通过在发票 table 中从 order_id 中创建一个外键来强制执行它。
或者 - 同样,只要您在这里有 1:1 关系 - 将发票和订单合二为一 table 并立即创建记录。