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

标签 php mysql wordpress mysqli

我的网站接受慈善捐款。人们捐款,然后他们的捐款和支持信息会显示在捐款页面上。

我有两个问题。

  1. 问题是,捐款有时但并非总是会两次输入数据库,这意味着它们也会在前端显示两次。

Screenshot of double database entry with same transaction id

Screenshot of double entry on the front end

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

  1. 问题:该网站使用 wp 电子商务插件来处理捐款。捐款已添加到 wp eCommerces 购买日志中,但缺少捐款金额。

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;

}

最佳答案

第二个问题我无法回答,因为我对wordpress了解不够。但对于第一个,我可以看到可能导致问题的一两件事。

首先,我注意到这些重复的条目插入时相隔 6 分钟。这意味着该脚本运行了两次,很明显 $cheers 始终为空,因此向 $kd_table 中插入了一个新条目。

现在你可以问了,为什么 $cheers 是空的?因为查询不正确。您没有在 WHERE 子句中的 $transaction 值两边加上单引号。

改变这个

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

为此:

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

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

关于mysql数据库中的php双数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47573373/

相关文章:

php - 由于 noscript nginx,fail2ban 经常禁止我进入 WordPress 管理员

php - 在wordpress中包含父同级文件夹中的PHP文件

javascript - 如何从js发送参数到php codeigniter

php - MD5 哈希值不匹配

mysql - PhpMyadmin 在选择查询中添加了附加参数

php - Drupal 7 - MySQL 语法错误 - 修改 settings.php 后

sql - 在 MySQL 语句中使用 OR 有/没有括号有什么不同?

php - 为什么Varnish的获取比绕过Varnish的速度明显慢?

php - 我应该使用哪种排序规则在 MySQL 中存储这些国家/地区名称?

mysql - PhpMyAdmin 表修复后我无法再编辑帖子