【问题标题】:duplicate ID even when no data in database即使数据库中没有数据,ID 也会重复
【发布时间】:2013-08-08 14:44:28
【问题描述】:

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

【问题讨论】:

  • $rows > 0 这是不正确的,$rows 不是与零比较的数字,请参见:stackoverflow.com/questions/460010/…
  • fetchAll 不返回 int 以与 > 0 进行比较。 php.net/manual/en/pdostatement.fetchall.php
  • 使用$stmt->num_rows
  • 您是 PHP 编码员还是刚刚找到了一个脚本?从您正在制作的其他答案和 cmets 来看,您似乎拿走了某人的剧本或在网上找到了它。检查行数的部分不是代码的唯一问题。
  • @N.B.这是第一次尝试创建购物车并且必须使用贝宝IPN 对 PDO 也有点陌生。

标签: php pdo


【解决方案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()

【讨论】:

  • 你能给我一个完整的答案吗?我仍然很难理解你在说什么。我很抱歉
  • @Angel 你的代码是不是和上面一样,只是增加了使用 $count; 的变化?
  • @Angel 您能否更新您原始帖子中的代码,以便我可以看到您在做什么?
【解决方案2】:

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

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

【讨论】:

  • 是的,如果您使用 rowCount 方法。如果使用 count($rows),则需要保留 fetchAll 行。
  • 我进行了编辑。这还将为您提供有关正在复制的内容的更多信息。
【解决方案3】:

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

if ($rows) {

会工作

这就是你真正需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多