mysql数据库中的php双数据库条目
Posted
技术标签:
【中文标题】mysql数据库中的php双数据库条目【英文标题】:Php double database entry in mysql database 【发布时间】:2018-05-14 09:03:30 【问题描述】:我的网站接受慈善捐款。人们捐款,然后他们的捐款以及支持信息会显示在捐款页面上。
我有两个问题。
-
问题是有时但并非所有时候捐款都会两次输入到数据库中,这意味着它们也会在前端显示两次。
Screenshot of double database entry with same transaction id
Screenshot of double entry on the front end
以下是将捐赠和“欢呼”消息添加到数据库的代码。我无法弄清楚为什么这些条目有时会出现两次,但并非总是如此。当我查看时间戳时,条目相隔几分钟,所以我认为用户可能已经刷新了页面,但我不知道如何防止这种情况发生。
-
问题:该网站使用 wp eCommerce 插件来处理捐款。捐款已添加到 wp eCommerces 购买日志中,但缺少捐款金额。
Screenshot of purchase log with missing donation amounts
我正在使用 Wordpress 4.8.4 和 wp eCommerce 来处理捐款。 php版本:5.6.27 数据库客户端版本:libmysql - 5.1.73
大多数情况下捐款输入正确,但这些重复输入让我发疯,我不知道为什么会这样。希望有更多知识的人可以提供帮助。提前致谢。
以下是将捐赠添加到数据库和购买日志的代码。 代码中的 cmets 是由插件开发人员和我编写的。我无法联系到原始开发人员,所以我试图自己解决这个问题。我更像是一名网页设计师,但对 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】:我无法回答第二个问题,因为我对 wordpress 了解不够。但对于第一个问题,我可以看到可能导致问题的一两件事。
首先,我注意到这些重复条目的插入间隔6 分钟。这意味着该脚本运行了两次,很明显$cheers
始终为空,因此在 $kd_table 中插入了一个新条目。
现在你可以问,为什么 $cheers 是空的?因为查询不正确。您没有在 WHERE 子句中的 $transaction
值周围加上单引号。
改变这个
$sql = "SELECT * FROM ".$t3." WHERE `transaction`=".$transaction;
对此:
$sql = "SELECT * FROM ".$t3." WHERE `transaction`='".$transaction."'";
并在第二次调用此脚本时检查$cheers
是否不为空。
【讨论】:
哇。谢谢!我没想到我会这么快得到回应。我按照您的建议更改了代码。在网站成功收到一些捐款后,我会更新我的问题的状态。 *** 真的有一个很棒的社区。再次感谢。 不客气。我建议您自己对此进行测试,因为它很可能是导致错误的其他原因,而此问题未包含在此问题中。可能交易列是一个整数,不需要我提到的这些单引号。欢迎来到 *** :) 我查了一下,事务列定义为varchar。以下是插件安装部分的代码: /** 安装 **/ function kd_install() global $wpdb;全局$kd_table; $sql = "如果不存在则创建表" . $kd_table 。 " (id
int(11) NOT NULL AUTO_INCREMENT, date
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, from
varchar(255) NOT NULL, content
text NOT NULL, price
int(11) NOT NULL, @ 987654331@ int(11) NOT NULL, transaction
varchar(255) NOT NULL, 唯一键 (id
) )"; require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); dbDelta($sql); register_activation_hook(FILE,'kd_install');以上是关于mysql数据库中的php双数据库条目的主要内容,如果未能解决你的问题,请参考以下文章