【问题标题】:MySQL query not executed while listening for PayPal answer收听 PayPal 答案时未执行 MySQL 查询
【发布时间】:2018-11-15 19:05:10
【问题描述】:

已经 三个 小时了。我什么都试过了:(
基本上,使用我已经在其他项目中使用的一些代码,我等待 PayPal 的确认,我得到它,我应该将信息存储在数据库中。所有 PayPal 信息均正常且运行良好。
这是我尝试过的:

  1. 考虑到数据库连接可能会在空闲一段时间后自行关闭,我重新连接它,甚至重新创建它(此时,我不在乎内存泄漏、性能等)
  2. 尝试了简单的 SELECT 和 INSERT
  3. 每行添加打印输出(到 txt 文件),打印所有可能的错误
  4. 我在文件中打印查询,然后将其复制/粘贴到 Adminer/PHPMyAdmin/HeidiSQL 中,查询正常运行,没有任何错误

结果:

  1. 我没有收到任何错误(所有mysqli_connect_errnomysqli_error 总是空字符串)
  2. 根本没有修改数据库

这是代码的一部分,清除了无用的检查(无论如何都有效):

if ($sandbox)   
  $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
else
  $fp = fsockopen ('ssl://www.paypal.com', 443, $errno, $errstr, 30);
if (!$fp) {
  debug("http error");
} else {
  fputs($fp, $header . $req);
  while (!feof($fp)) {
    $res = fgets ($fp, 1024);
    if (stripos($res, "VERIFIED") !== false) {
      if (is_array($data)) {
        $conn->close();
        $conn = new mysqli(SERVER_NAME, DB_USERNAME, DB_PASSWORD, DB_NAME);
        if (!$conn) {
          $err  = "Error: Unable to connect to MySQL." . PHP_EOL;
          $err .= "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
          $err .= "Debugging error: " . mysqli_connect_error() . PHP_EOL;              
          debug("DB ERROR $err");
        }             
        $conn->set_charset('utf8');
        $s = "INSERT INTO sold SET txnid=2";
        debug("trying query $s");
        $sql = $conn->query($s);
        $err = mysqli_error($sql);
        debug("DB result ***$sql*** ***$err***");
        $orderid = $conn->insert_id;
        debug("orderid ***$orderid***");

总结一下:

  1. (重新)连接到数据库时没有错误
  2. 查询 INSERT INTO sold SET txnid=2 如果手动输入,则运行完美
  3. mysqli_error 永远不会返回错误
  4. $conn->insert_id 始终为空
  5. ...但数据库从未更新!
  6. 如前所述,我尝试打印一个简单 SELECT 的结果(结果始终为空),我尝试在每个行,而且每一行都执行,所以PHP没有语法错误,...我要疯了...
  7. 它在带有 PHP7 的 Ubuntu16.04 VPS 上运行,我不太熟悉 PHP5 和 PHP7 之间可能存在的差异,也许我忽略了一些与 PHP 相关的东西...

知道可能发生了什么吗?
很抱歉篇幅太长,但我想展示我尝试过的所有东西:(
提前谢谢你:)

【问题讨论】:

  • 您的if (is_array($data)) { 在哪里关闭?
  • 几行下来......我不想把整个源代码,只是重要的部分。如前所述,有一次我在每一行都放了一个打印输出,以确保它不会因为 PHP 中的语法错误而停止:(

标签: php mysql paypal


【解决方案1】:

这是一个疯狂的事件序列,但最后它是(当然:) :) :) 我的错。
我在之前的包含文件中定义了一个 SERVER 常量,但我在代码中使用了 SERVER_NAME。
PHP 从来没有给我一个错误,因为首先这个文件是由 PayPal 调用的,它不是用户启动的,其次是日志已经关闭。
我启用了日志,我看到了错误。
让我失望的第一个问题是:

$conn = new mysqli(SERVER_NAME, DB_USERNAME, DB_PASSWORD, DB_NAME);
  if (!$conn) {
    // IT NEVER GOES INSIDE HERE IF IT FAILS!!!

然后在这里:

$sql = $conn->query($s);
$err = mysqli_error($sql);
debug("DB result ***$sql*** ***$err***");

基本上,由于$conn 没有被实例化,所有使用它的后续调用都失败了,返回我认为是一个空字符串(意思是没有错误),而实际上要么是false 或 NULL 值。

学过的知识?好吧,在开发过程中保持 PHP 日志运行 :)

【讨论】:

    【解决方案2】:

    请检查是否进入下面的if条件

    if (stripos($res, "VERIFIED") !== false) {
      if (is_array($data)) {
       //Put some debug code here and check
    

    希望对你有帮助

    【讨论】:

    • 是的,它在里面,因为我在后面的代码中看到了所有的打印输出
    猜你喜欢
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多