Php 即使数据库中没有数据,ID也会重复
我有那个PDO查询来检查数据库中是否存在重复的Php 即使数据库中没有数据,ID也会重复,php,pdo,Php,Pdo,我有那个PDO查询来检查数据库中是否存在重复的txn\u id。目前,我的数据库没有记录 每次我在paypal sandbox上运行我的ipn脚本时,我总是收到一封电子邮件,上面写着重复的交易ID。我不明白。我的数据库中没有记录,因此该事务应该已经完成 有人能发现错误吗 $this_txn = $_POST['txn_id']; $stmt = $conn->prepare(" SELECT txn_id FROM Transactions WHERE txn_id =:txn_id L
txn\u id
。目前,我的数据库没有记录
每次我在paypal sandbox
上运行我的ipn脚本时,我总是收到一封电子邮件,上面写着重复的交易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();
}
您试图将数组与整数/false进行比较。相反,请检查数组的计数:
if (count($rows) > 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();
}
改用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();
}
致:
这将检查受最后一条SQL语句影响的行数。您的原始代码无法工作,因为它返回一个数组。因此,即使没有行,$rows也将是eaual Array()表达式中还有两个额外的符号
if ($rows) {
行得通
这就是您实际需要的所有内容。
$rows>0
这是不正确的,$rows不是将其与零进行比较的数字,请参见:fetchAll
不返回要与>0
进行比较的整数。使用$stmt->num_rows
你是PHP程序员还是刚找到脚本?从你所做的其他回答和评论来看,看起来你拿走了某人的脚本或是在网上找到的。检查行数的部分并不是代码的唯一问题。@N.B.这是第一次尝试创建购物车,必须使用paypalIPN
对PDO也有点陌生。是的,如果使用行数方法。如果使用count($rows),则需要保留fetchAll行。我进行了编辑。这也会给你更多关于复制内容的信息。你能给我一个完整的答案吗。我仍然觉得很难理解你在说什么。我很抱歉it@Angel您的代码是否与上面一样,只是添加了使用$count;的更改@安吉尔,你能更新你原来帖子中的代码吗?这样我就可以看到你在做什么了?
$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();
}
if ($rows) {