Php 如何在单击订单时增加发票号?

Php 如何在单击订单时增加发票号?,php,Php,我的表列是invoiceid(主AI)、invoiceno、purchaseorderno、userid。我想我不能使用invoiceid,因为例如:当客户购买2个产品时,2个invoiceid将不同。因此我决定使用invoiceno,每当用户单击订单并购买例如2个产品时,他们都将具有相同的invoiceno。我有以下代码: $invoice = 0000000; $invoiceno = $invoice + 1; $sqlString1 = "INSERT INTO invoice

我的表列是invoiceid(主AI)、invoiceno、purchaseorderno、userid。我想我不能使用invoiceid,因为例如:当客户购买2个产品时,2个invoiceid将不同。因此我决定使用invoiceno,每当用户单击订单并购买例如2个产品时,他们都将具有相同的invoiceno。我有以下代码:

 $invoice = 0000000;
 $invoiceno = $invoice + 1;

$sqlString1 = "INSERT INTO invoice 
               (invoiceno, purchaseorderno, userid) 
               VALUES ('$invoiceno', '$purchaseorderno', '$userid');";
$result1 = mysqli_query($conn, $sqlString1);

它可以工作,但是发票没有保留为1。单击“订单”时,它不会增加。如果我的想法是错误的,建议将不胜感激

我会分两张桌子做,而不是一张桌子

您拥有具有一对多关系的
发票
发票\项目

如果为行项目创建另一个表,所有问题都会消失

表格发票

 id
 date
 total
 status etc...
表1.发票项目

 id
 invoice_id - foreign key
 product_id
 quantity
 etc...
选择它们没有问题

 SELECT 
    {fields}
 FROM
    invoice AS i
 JOIN
    invoice_item AS l ON i.id = l.invoice_id
 WHERE
     i.id = :id
等等

然后,您可以使用发票和所有设置中的主键。它还将更加健壮(不太容易崩溃),可能更快,从长远来看可能更容易编码,等等

它确实给数据模型增加了一点复杂性,在执行插入和删除等操作时要更加小心,但是如果您正确设置了外键约束,在执行插入时使用事务,您应该不会有问题

更新

下面是一个(单击它)示例,其中包含一些如何设置forign键以及如何构建基本表关系的示例。我只是猜测这些字段,您当然可以进行任何必要的更改,添加或删除它们。这只是为了解释一下

CREATE TABLE invoice(
    id INT(10) unsigned NOT NULL AUTO_INCREMENT,
    total DECIMAL(6,2) unsigned NOT NULL,
    email VARCHAR(100),
    submission_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY ( id )
) ENGINE=InnoDB;

CREATE TABLE invoice_item(
    id INT(10) unsigned NOT NULL AUTO_INCREMENT,
    invoice_id INT(10) unsigned NOT NULL,
    product_id INT(10) unsigned NOT NULL,
    qty INT(3) unsigned NOT NULL,
    sub_total DECIMAL(6,2) unsigned NOT NULL,
    PRIMARY KEY ( id ),
    CONSTRAINT FK_InvoiceItems FOREIGN KEY(invoice_id) REFERENCES invoice(id) ON DELETE CASCADE ON UPDATE CASCADE,
    KEY(product_id)
) ENGINE=InnoDB;
仅举几个查询示例:

插入发票

 #in the example fiddle this is AI #2 so invoice.id=2
INSERT INTO invoice (total,email) VALUES ('100.00','user2@example.com');
插入相关发票项目

#both of these line items have same invoice,
INSERT INTO invoice_item (invoice_id,product_id,qty,sub_total) VALUES ('2','200','7','70.00');
INSERT INTO invoice_item (invoice_id,product_id,qty,sub_total) VALUES ('2','270','2','30.00');
基本内部联接(选择包含项目的所有发票及其项目)

计算唯一项目的数量

SELECT
    invoice_id, COUNT(id) AS unique_items
FROM
    invoice_item
GROUP BY invoice_id;
计算项目总数。你可以用同样的方法求和,求和,求和。如果愿意,您可以删除
invoice.total
。将总数计入其中是件好事,但是当/如果您更改发票中的项目数量时,您还必须保持更新

SELECT
    invoice_id, SUM(qty) AS total_items
FROM
    invoice_item
GROUP BY invoice_id;
查找没有项目的发票(不可能添加没有带有fk约束的发票的项目,这正是我们想要的)

最后,删除一张发票,由于约束,这将级联并删除发票_项中的相关项,而无需额外工作,换句话说,这些项将自动magicaly删除。我还发现,让数据库进行级联删除比手动删除要快得多

 DELETE FROM invoice WHERE id=2;
在这个数据模型中,我将发票项按产品分组。所以对于invoice.id#2,我们有两个项目,一个是产品id#200,这是玩具ufo。另一种是#270,是金属气象气球。Tiny Tim以每只10美元的价格获得了7个UFO,总计70美元,然后他以每只15美元的价格获得了2个气象气球(我们的政府所做的一切都不便宜)

好的,这是我今天的DB 101课

更新1

基于这个错误

无法添加或更新子行:外键约束失败

这实际上是一件好事,这是外键的用途。我会尽力解释的

如果您这样做,请插入

 INSERT INTO invoice (total,email) VALUES ('100.00','user2@example.com');
这将在发票中创建一行,这是插入的目的。现在因为它是自动递增Id,这是第一行,所以它的Id是
Id
1
。因为它是第一行,也是发票中唯一的记录。我们都同意,我在一个新表中插入一行,这使它成为第一行也是唯一一行。它的AI id为
1

现在如果我尝试插入

 INSERT INTO invoice_item (invoice_id,product_id,qty,sub_total) VALUES ('2','200','7','70.00');
这一行的
invoice\u id
2
,我们刚才说我们有一张
id
1
的发票。因此,没有id为
2
的发票。这将给您带来与刚才相同的错误,因为您试图添加一个
invoice\u项目
,而没有关联它的
invoice
,这是我们永远不希望发生的事情。这称为“孤立”行,因为它的父行不存在。如果我们允许这样做,我们的数据库可能会充满没有发票的发票项目。然后,如果我们稍后添加一个id为其中一个孤立行的发票,我们只关联了不应该关联的内容。这就是为什么这个错误是有意义的,也是为什么它是一件好事

解决此问题的明显方法是不要插入不属于
发票的
发票项目

我真的希望这是有道理的

那么,我们如何插入有发票的
项目

在PHP中,您希望插入发票,然后获取其id,然后插入发票项。请参阅本页

这里的重要部分是在插入发票项目时使用,
$mysqli->insert_id
。现在,如果要将发票项添加到一段时间前插入的现有发票中,请执行以下操作。然后,您只需查询发票,并将其id取出,并将其用于新的发票项


希望有帮助,享受吧

我会分两张桌子做,而不是一张桌子

您拥有具有一对多关系的
发票
发票\项目

如果为行项目创建另一个表,所有问题都会消失

表格发票

 id
 date
 total
 status etc...
表1.发票项目

 id
 invoice_id - foreign key
 product_id
 quantity
 etc...
选择它们没有问题

 SELECT 
    {fields}
 FROM
    invoice AS i
 JOIN
    invoice_item AS l ON i.id = l.invoice_id
 WHERE
     i.id = :id
等等

然后,您可以使用发票和所有设置中的主键。它还将更加健壮(不太容易崩溃),可能更快,从长远来看可能更容易编码,等等

它确实给数据模型增加了一点复杂性,在执行插入和删除等操作时要更加小心,但是如果您正确设置了外键约束,在执行插入时使用事务,您应该不会有问题

更新