首页 文章

PHP中的发票和计费系统

提问于
浏览
0

我制作了一个脚本来创建订单并创建发票 . 这里有两个mysql表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”的字段 .

当客户点击继续付款时,因为它同时生成发票和订单,我使用以下脚本来更新两个表:

$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' .

  • 使用$ order_query我将最后一行添加到订单表,然后我正在使用生成的发票ID更新'invoice_id' .

现在,如果在特定的第二个2个客户创建订单和发票,则会出现问题,这将导致错误的数据进入错误的字段 .

任何人都可以建议我更新这些表的更好方法吗?

1 回答

  • 0

    这里有循环关系 - 发票是指订单,而订单是指发票 . 这是关系数据库设计中非常糟糕的反模式 . 此外,只有当您通过外键放弃关系执行时,才能实现(如果与您相同) . 因此,您最终可能会使数据不一致 . 在与客户相关的领域有多好?钱?

    你有没有问过自己为什么你可能需要这种循环关系呢?

    我可以猜到,即时答案将是“我不知道”,其次是“我实际上不需要它!” . :-)

    所以建议是 - 重建你的数据库,使关系单向

    比如,发票与订单联系在一起 - 这似乎更符合逻辑,因为订单已经存在但尚未开具发票的时间段,但基本上没有关系,因为你在这里有1:1

    然后通过在发票表中的order_id之外创建一个外键来强制执行它 .

    或者 - 再次,只要您在此处拥有1:1关系 - 将发票和订单合并到一个表中并立即创建记录 .

相关问题