验证我的notify_url代码以进行PayPal


Verify my notify_url code for PayPal

notify_url.php

<?php
include('connection.php');
$sql = "UPDATE tablename 
        SET credit = credit + {$_POST['amount']} 
        WHERE username = '123456789'";
mysqli_query($con, $sql);
?>

表单网页

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
          <input type="hidden" name="cmd" value="_s-xclick">
          <input type="hidden" name="hosted_button_id" value="6RNT8A4HBBJRE">
          <input type="image" 
            src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynowCC_LG.gif" 
            border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
          <img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif" 
            width="1" height="1">
            <input name="amount" value=10.95 type="hidden"> <<< not sure if this line should be here
            <input name="notify_url" value="notify_url.php" type="hidden">
    </form>

上面的代码是我在notify_url.php文件中的代码。我的数据库未:(更新。我的连接文件正常。当我输入一个数字而不是 POST 变量时,它工作正常。这只意味着我的 POST 变量可能是错误的,或者根本没有调用脚本!

编辑:第二个代码是从PayPal网站生成的表单("购买"按钮)。

编辑:

你有value=10.95,用引号括起来 value="10.95" - 这没什么大不了的,但很好的做法。

if(isset($_POST['amount'])){...}if(!empty($_POST['amount'])){...}

同时确保您的列DECIMAL长度/值(例如 10,2),以便能够接受小数,例如 10.95

咨询:

  • http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html
  • http://dev.mysql.com/doc/refman/5.0/en/fixed-point-types.html

我测试它的方式是使用:

$amount = $_POST['amount'];
$sql = "UPDATE tablename 
        SET credit = credit + $amount 
        WHERE username = '123456789'";

或者您可以尝试使用连接:

SET credit = credit + '".$amount."' 

此外,您的发布操作应该是action="notify_url.php"的,而不是您现在使用的。


发布 HTML 表单之前的原始答案:

我怀疑您的表单元素没有名称属性和/或值,并且不使用 POST 方法。

如果您的表单没有定义的方法为 POST,因为您使用的是 $_POST['amount'] ,它将默认为 GET 方法,进而以静默方式失败。

由于您尚未发布 HTML 表单,因此您可以基于以下任何一项:

如果使用具有预设值的隐藏类型:(在本例中,我使用了 1000)。

<form method="post" action="your_handler.php">
<input type="hidden" name="amount" value="1000">
<input type="submit" name="submit">
</form>

如果来自用户输入:

<form method="post" action="your_handler.php">
<input type="text" name="amount">
<input type="submit" name="submit">
</form>

您还可以使用以下方法检查表单的元素是否设置为空:

if(isset($_POST['amount'])){...}if(!empty($_POST['amount'])){...}

  • 还要确保您的列是int而不是varchar,这也可能是代码可能失败的原因之一。

我需要注意的是,您当前的代码对SQL注入是开放的。使用预准备语句或带有预准备语句的 PDO它们更安全


将错误报告添加到文件顶部,这将有助于查找错误

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code

以及or die(mysqli_error($con)) mysqli_query().

旁注:错误报告只应在暂存中完成,而不应在生产环境中完成。


  • 如果这仍然不起作用,请发布您的 HTML 表单和数据库架构以绝对确定。

你能尝试重写代码如下:

$sql = "UPDATE tablename SET credit = credit + ". $_POST['amount'] ." WHERE username = '123456789'";

无论如何,我不鼓励这种方法(将 POST 直接传递给查询),因为容易受到 mysql 注入的攻击。

并尝试改变

    <input name="notify_url" value="notify_url.php" type="hidden">

    <input name="notify_url" value="http://www.domain.com/notify_url.php" type="hidden">