【发布时间】:2017-09-09 01:19:12
【问题描述】:
我有一个针对商店情况的复杂设置。
人们可以在短时间内购买独特的产品并通过 PayPal 付款。
所以我需要确保产品不会被多次购买。为此,在结帐时,我使用了一个自定义 PHP 文件,该文件将数据库中的项目更新为“保留”状态,然后通过header() 将表单发送到 PayPal。这一切都很好。
由于我们要出售的商品有限且时间有限,因此如果买家中止付款流程,我想再次提供商品。我确实设置并运行了 PDT,但事务协议有时会延长延迟。 所以结账后十分钟我想检查数据库,看看交易是否通过。如果该项目真的售出(状态由 PDT 脚本更改)一切都很好,如果它没有售出,我想重置预订状态并再次将该项目提供给其他买家。
这是我的代码设置:
if ($resstatus == "0"){
$result = mysqli_query($mysqli, "UPDATE `table` SET `Reserved`='1' WHERE `AID`='$AID' AND `itemID`='$itemD1'");
header('Location: https://www.paypal.com/cgi-bin/webscr?'.$post_string);
sleep(600); //wait ten minutes before checking DB
if ($sold == "0"){
$reset = mysqli_query($mysqli, "UPDATE `table` SET `Reserved`='0' WHERE `AID`='$AID' AND `itemID`='$itemD1'");
}
}
一切都已执行,但标头重定向也延迟了sleep() 中定义的时间跨度。这对我来说根本没有意义。如果它会重定向并且之后不执行任何操作 - 那是一回事。但它执行所有操作,但表现得好像订单首先是 sleep(),然后是 header()。
我现在要采用不同的方法,在结账时保存时间戳,并在商店加载时检查预订时间戳早于十分钟的单位。这应该可行,而且可能更优雅。
但我仍然对上述行为感到困惑,想知道我的推理错误埋在哪里。
【问题讨论】:
-
Little Bobby 说 you may be at risk for SQL Injection Attacks。通过parameterized queries 了解Prepared Statements。我推荐
PDO,我推荐wrote a function for,使其比使用非参数化查询更加简单、干净和安全。 This may help you choose betweenMySQLiandPDO.