使用PHP将行双重传递到MySQL数据库

使用PHP将行双重传递到MySQL数据库,php,mysql,ebay-api,Php,Mysql,Ebay Api,易趣建议定期轮询API,以确保收到每一份订单 在我的例子中,我设置了平台通知来解析接收到的XML文件,并使用PHP将其插入MySQL数据库 现在,正如推荐的那样,我希望使用GetOrders进行“双传递”,这实际上应该为每一行(或订单)提供副本 我的结构相当简单。但是我有一个OrderLineItemID的唯一索引,据我所知,它是每个易趣订单的唯一标识符 有没有比我现在做的更好的方法 //retrieve and escape variables for insertion// $sql =

易趣建议定期轮询API,以确保收到每一份订单

在我的例子中,我设置了平台通知来解析接收到的XML文件,并使用PHP将其插入MySQL数据库

现在,正如推荐的那样,我希望使用
GetOrders
进行“双传递”,这实际上应该为每一行(或订单)提供副本

我的结构相当简单。但是我有一个
OrderLineItemID
唯一索引
,据我所知,它是每个易趣订单的唯一标识符

有没有比我现在做的更好的方法

//retrieve and escape variables for insertion//

$sql = "INSERT INTO eBayOrders (OrderLineItemID, SalesRecordNumber, BuyerUserID, BuyerEmail, Title, SKU, Quantity, TransactionPrice)
VALUES ('".$orderlineitemid."', '".$recordnumber."', '".$buyeruserid."', '".$buyeremail."', '".$title."', '".$sku."', '".$qty."', '".$transactionprice."')";
}

if ($connect->query($sql) === TRUE) {
         echo "New Record Created Successfully";
} else {
         echo "Error: " . $sql . "<br />" . $connect->error;
      $connect->close();
      die();
}

为了避免由于唯一键约束导致插入失败时出错,我们可以在INSERT语句上使用IGNORE选项

INSERT IGNORE INTO eBayOrders ...
如果使用IGNORE修饰符,则会忽略执行INSERT语句时发生的错误。例如,在不忽略的情况下,复制表中现有唯一索引或主键值的行将导致重复键错误,语句将中止。使用IGNORE时,将丢弃该行,并且不会发生错误。忽略的错误会生成警告

但这也会影响除重复密钥异常以外的错误情况


作为另一个选项,我们可以使用
INSERT。。。在重复键上…

此处提供的文档:


参考资料:

了解预处理语句以防止SQL注入Kay,我可以用它来了解有关预处理语句的更多信息。我正在使用
mysqli\u real\u escape\u string
来封装我的变量以进行SQL注入,但没有包含它们,因为我觉得这与手头的问题无关。
INSERT。。。在重复键上
可能是您需要的,或者插入。。。选择“但我正在使用GetOrders进行多达100个订单的foreach循环”-您可能应该在问题中包括该部分和任何其他可能的相关代码。或者,看看下面刚刚给出的答案。谢谢各位。现在正在调查这件事@Fred-ii-,我用完整的
foreach
link编辑了我的原始问题,我想这回答了我的问题,我可能会接受它(仍在阅读参考资料)。我遗漏的是,当订单进来时,我还有一个PHP脚本,它从
库存
表中减去
数量
级别。因此,如果记录已经存在,可能我更希望得到一个错误并中止脚本。否则,如果插入该行,它将继续减去库存数量(我当然不想对同一订单的库存数量进行“双重传递”)。至少,我现在是这样设置的。实际上,在
foreach
中,发生错误、关闭连接和中止脚本编写是不可行的(与使用一次只提供一个订单的平台通知不同),因为如果它出错并退出,它将停止未来的迭代,并且会错过一些。调查alternatives@bbruman:发生SQL错误时,代码不一定需要关闭连接并终止。代码可以检测错误(就像它已经在做),使用
mysqli\u error
检索错误(就像它已经在做)。。。然后它可以检查错误,如果是您预期的重复关键错误,跳过其余的处理过程(例如,不要从库存中减去数量),继续循环,处理下一个订单。这正是我的想法,但这是我第一次这样做,所以我不确定。我像这样测试了它,它跳过了复制唯一密钥的命令,并完成了其余部分。我唯一担心的是,大多数
GetOrders
行将导致一个错误,一次最多100个,并且不确定一次重复查询那么多错误是否应该引起关注。@bbruman:运行生成错误的INSERT应该不是问题。这将使用数据库服务器上的资源(时间),实际上并不比运行成功的INSERT语句更昂贵。两者都将进行解析、评估、准备和执行。两者都将尝试获取并持有锁。所以这真的需要一些时间。(总是有规律的并发问题。)但这不会对数据库服务器本身造成问题;其他客户可能会感到不便。我不知道有任何设置会在出现一定数量的错误后断开MySQL客户端的连接。
INSERT IGNORE INTO eBayOrders ...