假设我有一篇文章有3个不同的标题:
我想使用PHP根据当前用户随机显示这三个标题中的一个(因此每次刷新时都没有获得新的标题),然后通过SQL记录每个标题版本的点击次数在哪里我得到类似的东西:
USER HEADLINE CLICK?
1 1无
2 3是
3 2是
4 3无
5 2是
6 1没有
具体来说,我想咨询一下:
- 检索某种对用户唯一的变量(可能是IP地址?)
- 根据唯一的用户变量随机分配一个数字(在示例中为1-3)
- 根据分配的号码显示不同的文本。
一旦我弄清楚这部分,我就可以弄清楚SQL的东西了。我感谢您提供的任何建议。
答案 0 :(得分:1)
这里有三个问题:
在这里,我认为在一个页面上显示不同的主题不是问题
问题1
基本上你可以使用IP地址,但它不是用户的常量id。例如,如果用户使用移动电话和步行,他可以在塔之间切换或松散连接,然后使用不同的IP恢复它。
有很多方法可以通过网络识别用户,但是没有授权就无法在100%识别用户(用户完成的主动操作)
例如,您可以使用生成的ID将Cookie设置为用户。您可以轻松生成ID,here。当您设置cookie并且用户将返回给您时,您将知道它是谁并完成您需要的东西。
同样在用户唯一性范围内,您可以阅读本文 - browser uniqueness
此外,如果您使用Cookie,则可以轻松存储任务的主题ID。如果您不使用Cookie,我建议您使用mongodb进行此类任务(许多具有小数据的对象,必须非常快速地从db中检索,非常快速地插入到db并且在您的情况下没有更新)
问题2 您显示的表格包含3个字段:ID,已使用的标题,是否已单击标题。
在这种表格中,您将失去所有非唯一点击(当用户点击主题两次,明天去那里或多次刷新目标页面时)
我建议您使用以下表格
在这种情况下,您将按时间段汇总数据,您可以轻松地在管理面板中显示数据
但我们仍然有收集这些数据的问题。此问题的解决方案取决于用户数量。如果一分钟内点击次数超过1000次,我认为您需要一些日志记录系统。例如,您将所有数据发送到文件'clickLog-' . date('Ymd_H') . '.log'
并以某种静态格式将数据发送到此文件,例如:
clientId;SubjectId;
当小时结束时,您可以通过shell脚本或代码聚合此数据并将其放入db:
cat clickLog-20160907_12.log | sort -u | awk -F';' '{print $2}' | sort | uniq -c
在此代码之后,您将拥有2列数据。首先是唯一点击次数,第二次是主题ID
修改此脚本只需删除sort -u
部分
此外,如果您有多个主题ID,则可以使用for
:
例如,可以跟随唯一点击的bash脚本
for i in subj1 subj2 subj3; do
uniqClicks=$(cat clickLog-20160907_12.log |
grep ';'$i'$' |
sort -u |
wc -l);
clicks=$(cat clickLog-20160907_12.log |
grep ';'$i'$' |
wc -l);
# save data here
done
在此操作之后,您将准备用于计算的汇总数据和用于将来处理的源数据(如果需要) 而且您的数据库也会小而快,所有源数据都将存储在文件中。
问题3
如果您要在问题2 部分中执行解决方案,那么获取统计信息的所有查询都将非常简单,您的数据库将执行非常快速
例如,您可以在PostgreSQL中运行此查询:
SELECT
SubjectId,
sum(uniqueClicks) AS uniqueClicks,
sum(clicks) AS clicks
FROM
statistic_table
WHERE
Date BETWEEN '2016-09-01 00:00:00' and '2016-09-08 00:00:00'
GROUP BY
SubjectId
ORDER BY
sum(uniqueClicks) DESC
在这种情况下,如果你有3个主题ID和每小时聚合,你将在几周内有504个新行(3个主题* 24小时* 7天),这对于数据库而言确实是少量数据。
<强>替代强>
您还可以使用Google Analytics进行所有计算。但在这种情况下,您需要执行其他一些步骤。其中大多数都是配置步骤,需要在您的网站上启用Google Analytics分析监控脚本。如果您拥有它,您可以轻松配置goals support并使用GA脚本api仅使用subjectid应用脚本附加数据
答案 1 :(得分:0)
您可以使用用户的IP或他的MAC,如果用户在网络上注册,您可以使用用户ID。 对于第二部分,您可以使用PHP函数mt_rand():
mt_rand(min,max) - &gt;如果你想要1到3个用户之间的数字mt_rand(1,3);
使用数组来存储三个不同的标题,并使用ramdomly生成的数字来访问数组。
最好你可以在0-2之间生成一个数字,因为数组以0开头。