1

私はこれで丸一日立ち往生しており、これは私がこれまでコーディングで立ち往生してきた最長のものです。私を助けてください。

私は次のコードを持っています、それはデータベースのアカウントを確認するために使用されるペイパルipnURLです。私は最初にSQLなどに接続し、次にペイパルからユーザー情報を取得し、次にデータベースからユーザー情報を取得します。支払う前に、ユーザーはuser_level列に「unverified」の値を持っている必要があり、「unverified」の場合は更新する必要があります。

これが私が立ち往生している奇妙なことです。コードを実行する前に実際のデータベースをチェックインしたにもかかわらず、user_levelの値が「未確認」になることはありません。実際には「未確認」です。しかし、mysql_query($ u)をコメントアウトすると、値'unverified'が返されます。

何が起こっているのかというと、実際のコードが呼び出されて更新されるかどうかを確認する前に、レコードが更新されているようです。

どなたか助けてください、大歓迎です。私

$sql_connect = @mysql_connect($_SERVER['HTTP_HOST'].':3306','root', '******')   or  die('Could not connect: ' . mysql_error());
mysql_select_db('4bkk');

$url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';

$postFields = 'cmd=_notify-validate';

foreach($_POST as $key => $value)
{
    $postFields .= "&$key=".urlencode($value);
}

$ch = curl_init();

curl_setopt_array($ch, array(
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $postFields
));

$result = curl_exec($ch);
curl_close($ch);


if($result=='VERIFIED'){

$log = 'Verfied --- ';

    //get buyers information from PAYPAL checkout
    $email = $_POST['payer_email'];
    $first_name = $_POST['first_name'];
    $last_name = $_POST['last_name'];
    $amount = $_POST['amount3'];
    $plan = $_POST['option_selection1'];

    $q = "SELECT * FROM users WHERE email='$email'";
    $data = mysql_query($q);

    $con = mysql_fetch_array($data); 

    //get buyers information from DATABASE
    $email2 = $con['email'];
    $first_name = $con['first_name'];
    $last_name = $con['last_name'];
    $active = $con['active'];
    $user_level = $con['user_level'];

$log .= $first_name.' ,  '.$last_name.' ,  '.$email2.' ,  '.$active.' ,  '.$user_level.' **************** '.$email ;

if($email2==$email){ //User already has a record 
    if($user_level=='unverified'){ // User unverified, ready for verification
        $log .= 'Emails match, and user is VERIFIED';
        $u = "UPDATE users SET active='verified', user_level='$plan' WHERE email='$email' LIMIT 1";
        $log .= $u;

        mysql_query($u);

    }
    else{ // User is already verified, 
$log .= 'Emails match, BUT user is NOT VERIFIED';


    }
}
else{  //User doesn't have a record
    $log .= 'Emails DONT match, execute update here';
}

$fh = fopen('result_ipn_test.txt', 'w');
//fwrite($fh, $subject.' --- '.$message);
fwrite($fh, $message.' ********** '.$log);
fclose($fh);

}
else
    echo 'INVALID';


mysql_close();
4

2 に答える 2

0

ユーザーレベルではなくステータスをチェックするべきではありませんか?

if($user_level=='unverified')

する必要があります

if($active=='unverified')
于 2012-10-31T16:13:48.283 に答える
0

ユーザーがデータベースで検証されていないことを確認してから、ユーザーが検証されたことをすぐに記録しています。また、$plan の値を $user_level に配置しているため、これは $user_level ではなく $active をチェックしないでください。

if($user_level=='unverified'){ // User unverified, ready for verification
    $log .= 'Emails match, and user is VERIFIED';

同様に、ユーザーがデータベースで「検証済み」としてリストされている場合、そのユーザーが検証されていないことをログに記録しています。

else{ // User is already verified, 
    $log .= 'Emails match, BUT user is NOT VERIFIED';

SQL クエリをコメントアウトすると、$data が空になり、$user_level が空になります。$user_level は未検証と一致せず、「Emails match, BUT user is NOT VERIFIED」というログが記録されます

于 2012-10-31T16:17:21.407 に答える