【问题标题】:PHP if else always goes to else conditionPHP if else 总是进入 else 条件
【发布时间】:2016-07-14 11:26:08
【问题描述】:

我有下面的脚本来获取 $_REQUEST 数据来执行数据库进程,我可以通过在同一台服务器上为测试分配测试数据来毫无问题地执行这个脚本,但是在实时测试中,它总是显示 Transaction aborted! Specific transaction not found! 消息$trx !== FALSE 正在执行,我也可以检查数据库中的所有数据是否已更新,它会停在这里,其余的过程如 points deductioncreate invoice 没有执行,我想知道为什么 TEST DATAREAL TIME DATA 是在不同的行为和结果中,都在相同的服务器环境下测试,所有设置都相同,实时数据也适用于测试。

我需要有人帮忙看看我的代码有什么问题吗??

<?php

//Real time data get from payment provider
$refNo        = $_REQUEST['RefNo'];
$transId      = $_REQUEST['TransId'];
$authcode     = $_REQUEST['AuthCode'];
$eStatus      = $_REQUEST['Status'];
$signature    = $_REQUEST['Signature'];


/* TEST DATA */
$eStatus     = 1;
$refNo       = '1468408036-0JSKZ8';
$transId     = 'T108902465200';
$authcode    = '3FL931320S778334X';
$signature   = 'zVq0m7WKxyDuOKVdExIQbaoJCi0=';


if($eStatus == 1){

        try {

            // Check whether have such order in db
            // If yes, get all relevant details for invoice generation.
            $trx = $buyer->get_transaction_if_exist(filter_var($refNo, FILTER_SANITIZE_STRING), $mysqli);

            if($trx !== FALSE){

                //Update payment status in db
                $postVars = array(
                                'payment_status' => 'completed',
                                'payment_id' => $transId,
                                'auth_code' => $authcode,
                                'signature' => $signature
                            );

                if($buyer->update($postVars, 'pp_transaction', 'order_num', $refNo, $mysqli) === TRUE){

                    //perform Points deduction if found checkout with Points+Cash
                    $points_consume  = $trx->total_points_consume;
                    $checkout_method = $trx->checkout_method;
                    $member_id = $trx->member_id;

                    //get existing Points
                    $cust = $buyer->get_customer_by_id($account_id, $mysqli);
                    $leftover_Points = $cust->my_points - $points_consume;

                    if($checkout_method == 2){

                        //update deduction points to member account 
                        $arr1 = array('my_points' => $leftover_Points);
                        $buyer->update($arr1, 'members', 'acct_id', $member_id, $mysqli);

                        //log
                        $logVar = array(
                                    'acct_id' => $account_id,
                                    'order_num' => $refNo,
                                    'point_consume' => $points_consume
                                );
                        $buyer->insert($logVar, 'points_consume_log', $mysqli);
                    }


                    //Generate invoice and send to buyer
                    require(WEBROOT.'/createInvoice.php');
                    require(WEBROOT.'/sendInvoice.php');


                }

            }else{

                //Cannot found specific transaction record in DB
                $payment_error = 'Transaction aborted!';
                $error_desc = 'Specific transaction not found!';

            }

        } catch (Exception $e) {

            $payment_error = $e->getMessage();
            //die();
        }

}

?>

查询是否存在这样的订单:

public function get_transaction_if_exist($refno, $mysqli)
{
    if(empty($refno)){
        return false;
    }

    $q  = "SELECT * FROM `pp_transaction` ";
    $q .= "WHERE order_num='".$refno."' ";
    $q .= "AND payment_status IN('pending','failed')";

    $sql = $mysqli->query($q);

    if($sql->num_rows > 0){
        $obj = $sql->fetch_object();
        return $obj;
    }
    return false;
}

非常感谢。

【问题讨论】:

  • 什么是 $buyer?你在哪里初始化的?

标签: php


【解决方案1】:

以下是我能想到的关于为什么它适用于测试数据而不适用于真实数据的可能性:

  1. 没有找到真实数据的$refno,或者匹配记录的payment_status不是IN ('pending','failed')
  2. 如果事务存在,则可能是 http 请求格式不正确,导致传递给脚本的 $refNo 值不是您所期望的
  3. 如果事务存在,并且$refNo是正确的,可能是执行查询出错了,所以它永远不会成功运行SELECT命令

测试场景 1

像以前一样使用所有真实数据,但将$refNo 硬编码为您知道在数据库中的记录,记录上您知道其payment_statuspendingfailed。如果脚本有效,那么您就发现了问题。

测试场景 2

在运行查询之前,在 get_transaction_if_exist 函数中添加 var_dump($refno); die();。验证回显的值是否符合场景 1 的良好数字。

测试场景 3

get_transaction_if_exist添加一些错误处理

$sql = $mysqli->query($q);
if($sql === false){
    //there was an error
    die('SQL error: '$mysqli->error);
}

如果打印出 SQL 错误,则说明您发现了问题

【讨论】:

  • 仅供参考,我可以毫无问题地运行此查询$buyer-&gt;update($postVars, 'pp_transaction', 'order_num', $refNo, $mysqli)===TRUE,我可以看到所有数据都存储在数据库中
  • 谢谢。该信息不会改变我的答案或我的建议,因为当您描述的失败时,您的脚本永远不会到达-&gt;update 行。
  • 测试场景1找到了问题,我硬编码了$refNo,其余数据恢复为实时数据,整体过程完全完成。但我想知道为什么 $refNo = $_REQUEST['RefNo']; 作为方法 get_transaction_if_exist() 的参数失败了?你能给我一个想法吗?谢谢!
  • 我猜RefNo 不是正确的名称。也许refNorefno 是你需要的。我会使用print_r($_REQUEST) 输出屏幕上的所有参数,并仔细查看该值。这是我在回答中强调的第二种可能性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 2020-05-21
相关资源
最近更新 更多