我有PDO查询来检查数据库中的重复txn_id
。目前我的数据库有NO
条记录。
每次我在paypal sandbox
上运行我的ipn脚本时,我都会收到电子邮件说Duplicate Transaction ID.
我得不到它。我的数据库中没有记录,所以交易应该已经过去了。
请有人发现错误。
$this_txn = $_POST['txn_id'];
$stmt = $conn->prepare("
SELECT txn_id FROM Transactions
WHERE txn_id =:txn_id LIMIT 1
");
$stmt->bindParam('txn_id',$this_txn);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($rows > 0) {
$messagerr = "Duplicate Transaction ID.";
mail("example@test.com", "Duplicate txn_id in the IPN system", $messagerr, "From: test@example.com" );
exit();
}
答案 0 :(得分:1)
您正在尝试将数组与整数/ false进行比较。相反,检查数组的计数:
if (count($rows) > 0) {
您还可以查看rowCount:
if($stmt->rowCount() > 0)
修改:这是完整的代码,还会为您提供有关哪些ID显示为重复的详细信息:
$stmt->execute();
if ($stmt->rowCount() > 0) {
$messagerr = "Duplicate Transaction ID. There are ".$stmt->rowCount() ." rows";
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row){
$messageerr .= "\n TxnId = ".$row['txn_id'];
}
mail("example@test.com", "Duplicate txn_id in the IPN system", $messagerr, "From: test@example.com" );
exit();
}
答案 1 :(得分:1)
使用stmt-> rowCount()> 0而不是fetchAll返回一个数组
修改
变化:
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($rows > 0) {
$messagerr = "Duplicate Transaction ID.";
mail("example@test.com", "Duplicate txn_id in the IPN system", $messagerr, "From: test@example.com" );
exit();
}
为:
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($stmt->rowCount() > 0) {
$messagerr = "Duplicate Transaction ID.";
mail("example@test.com", "Duplicate txn_id in the IPN system", $messagerr, "From: test@example.com" );
exit();
}
这将检查受上一个SQL语句影响的行数。您的原始代码不起作用,因为它返回一个数组。因此,即使没有行,$ rows也会使用Array()
答案 2 :(得分:0)
表达式中有2个额外的符号
if ($rows) {
会起作用
这就是你真正需要的。