即使数据库中没有数据,也会重复ID

时间:2013-08-08 14:44:29

标签: php pdo

我有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(); 
} 

3 个答案:

答案 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) {

会起作用

这就是你真正需要的。