0

我有那个 PDO 查询来检查txn_id我的数据库中的重复项。目前我的数据库有NO记录。

每次我运行我的 ipn 脚本时,我都会paypal sandbox收到一封电子邮件,说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(); 
} 
4

3 回答 3

1

您正在尝试将数组与整数/假进行比较。相反,检查数组的计数:

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(); 
} 
于 2013-08-08T14:48:35.707 回答
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()

于 2013-08-08T14:49:14.200 回答
0

你的表达式中有 2 个额外的符号

if ($rows) {

会工作

这就是你真正需要的。

于 2013-08-08T15:29:19.177 回答