mysql数据库中的Php双数据库条目

时间:2017-11-30 12:21:01

标签: php mysql wordpress mysqli

我的网站接受慈善机构捐款。人们捐赠,然后他们的捐款以及支持信息显示在捐赠页面上。

我有两个问题。

  1. 问题是有时,但并非所有捐赠都是两次输入数据库,这意味着它们也会在前端显示两次。
  2. Screenshot of double database entry with same transaction id

    Screenshot of double entry on the front end

    以下是将捐款和“欢呼”消息添加到数据库的代码。我无法弄清楚为什么这些条目有时会出现两次但并非总是如此。当我查看时间戳时,条目相隔几分钟,所以我认为用户可能刷新了页面,但我不知道如何防止这种情况。

    1. 问题:该网站使用wp电子商务插件来处理捐款。捐款被添加到wp eCommerces购买日志中,但他们缺少捐款金额。
    2. Screenshot of purchase log with missing donation amounts

      我正在使用Wordpress 4.8.4和wp eCommerce来处理捐款。 Php版本:5.6.27 数据库客户端版本:libmysql - 5.1.73

      大部分时间都是正确输入捐款,但这些双重条目让我发疯,我无法弄清楚它们为什么会发生。希望有更多知识的人可以提供帮助。提前谢谢。

      以下是将捐款添加到数据库和购买日志的代码。 代码中的注释是由插件开发人员和我完成的。我无法联系原始开发人员,所以我试图自己解决这个问题。我不仅仅是一名网页设计师,而且拥有一些基本的php和mysql知识。

      /** Function to add cheers when transaction is completed **/
      
      function kd_add_cheers () {
      global $wpdb;
      global $kd_table;
      $prefix = $wpdb->prefix;
      $stamp = $_GET['STAMP'];
      $session = $_GET['sessionid'];
      $transaction = $stamp.$session;
      $t1 = $prefix."wpsc_submited_form_data";
      $t2 = $prefix."wpsc_purchase_logs";
      $t3 = $kd_table;
      $t4 = $prefix."postmeta"; //remove if doesnt work edit by oliver
      
      // Set these in production!!!
      
      $firstname_field = '2';
      $lastname_field = '3';
      $message_field = '22';
      $recipient_field = '29';
      $price_field = '19';
      $anonymous_field = '23';
      
      
      
      $sql = "SELECT * FROM ".$t3." WHERE `transaction`=".$transaction;
      $cheers = $wpdb->get_results($sql);
      
      // Make sure this transaction gets submitted only once
      // (To prevent page refresh re-injection)
      if (empty($cheers)) {
          $sql = "
              SELECT ".$t1.".form_id, ".$t1.".value FROM ".$t1."
              INNER JOIN ".$t2." 
              ON ".$t1.".log_id = ".$t2.".id
              WHERE ".$t2.".sessionid = ".$session." 
              AND ".$t2.".id = ".$stamp;
      
          $posts = $wpdb->get_results($sql);
          if (!empty($posts)) {
      
              $insert = array();
              $insert['transaction'] = $transaction;
      
      
              foreach ($posts as $post) {
                  $insert['field_'.$post->form_id] = $post->value;
                  $insert['field_price'] = $post->totalprice;
              }
      
              if ($insert['field_'.$recipient_field] != '' &&   trim($insert['field_'.$recipient_field]) != '') {
      
      
                  if (isset($insert['field_'.$anonymous_field]) && $insert['field_'.$anonymous_field] == 'Kyllä') {
                      $donator = '';
                  }
                  else $donator = $insert['field_'.$firstname_field]." ".$insert['field_'.$lastname_field];
      
                  $msg = esc_attr($insert['field_'.$message_field]);
                  $msg = str_replace(':', '', $msg);
                  $msg = str_replace(';', '', $msg);
                  $msg = str_replace('"', '', $msg);
                  $msg = str_replace(')', '', $msg);
                  $msg = str_replace('(', '', $msg);
      
                  $sql = "INSERT INTO ".$t3." (`from`, `content`, `for`, `transaction`, `price`) VALUES 
                  ('".esc_attr($donator)."', '".$msg."', '".$insert['field_'.$recipient_field]."', '".$insert['transaction']."', '".$insert['field_'.$price_field]."')";
                  $inserted = $wpdb->get_results($sql);
      
                  if ($inserted) return true;
      
              }
      
          }
      }
      }
      
      function kd_update_transaction_status() {
      global $wpdb;
      $prefix = $wpdb->prefix;
      $stamp = $_GET['STAMP'];
      $session = $_GET['sessionid'];
      $table = $prefix."wpsc_purchase_logs";
      
      $sql = "UPDATE ".$table." SET `processed`=2,`email_sent`=1 WHERE `sessionid` = '".$session."' AND `id` = '".$stamp."'";
      
      $inserted = $wpdb->get_results($sql);
      if ($inserted) return true;
      
      }
      

1 个答案:

答案 0 :(得分:0)

我无法回答的第二个问题,因为我对wordpress知之甚少。但对于第一个,我可以看到一两件可能导致问题的事情。

首先,我注意到这些重复的条目已经插入了6分钟。这意味着该脚本运行了两次,显然$cheers总是为空,因此在$ kd_table中插入一个新条目。

现在你可以问,为什么$欢呼空了?因为查询不正确。您没有在WHERE子句中的$transaction值附近放置单引号。

更改此

$sql = "SELECT * FROM ".$t3." WHERE `transaction`=".$transaction;

到此:

$sql = "SELECT * FROM ".$t3." WHERE `transaction`='".$transaction."'";

并在第二次调用此脚本时检查$cheers是否为空。