【问题标题】:How to retrieve specific data about user?如何检索有关用户的特定数据?
【发布时间】:2015-08-10 05:19:37
【问题描述】:

我想创建一个系统,如果用户多次点击任何广告,广告将被隐藏。当他们访问我的站点时,它会检查他们的 ip 是否在数据库中,如果没有,则将存储他们的 ip。接下来,它会检查他们到目前为止的点击次数,如果超过 1 个广告将被隐藏。这是我现在正在努力的部分。我已经在下面的代码中注释掉了我想要发生的事情。此外,我的表中有 4 列:id、ip、计数(点击次数)和日期时间。我正在使用 mysqli,我只想知道如何根据用户的 ip 检索用户的点击次数。以下是 Stats 表的示例: id: 1 ip: xx.xx.xx.xx count: 0 creation: datetime

if (!empty($_SERVER['HTTP_CLIENT_IP']))  
{
   $ip = $_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))   
{
   $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
   $ip = $_SERVER['REMOTE_ADDR']; 
}
$query = "SELECT count(*) FROM Stats WHERE ip = '$ip'";
$result = $db->query($query); 
if($result->num_rows > 0)
{
    //if user's click count > 1
    hide ads
    else
    display ads         
}
else {
   $insert = $db->prepare("INSERT INTO Stats(ip, created) VALUES (?, NOW())"); 
   $insert->bind_param('s', $ip);
   $insert->execute();
   $insert->close();
}

【问题讨论】:

  • 不知道能不能加Http_x_forwarded_for...
  • 您不只选择名为count.. 的列吗?因为count(*) 是返回的行数...不是用户点击的实际次数...
  • @Darren 好吧,我使用 count(*) 只是为了检查用户的 ip 是否是新的,如果是新的,我会将其添加到数据库中。我想检查该特定用户的计数,如果计数超过 1,则隐藏广告
  • 请用表Stats的原始数据更新您的问题

标签: php mysqli


【解决方案1】:

您需要使用AS 关键字为您的聚合创建一个别名,以便从fetch_assoc 访问它。

$query = "SELECT count(*) AS total FROM Stats WHERE ip = '$ip'";    

if ($result = $db->query($query)) {

$data = $result->fetch_assoc();

    if($data['total']>1){
        // This user already clicked on at least one AD. Don't show ADS.     
    }else{
        // This user haven't clicked an AD yet. Show ADS.
    }
}

替换

if($result->num_rows > 0)

if($data['total']>1)

因为它不再需要了。感谢@Shehary 指出这一点。

【讨论】:

  • 您还需要在答案中添加一个原因,即$result->num_rows 没用。当您在查询中使用SELECT COUNT(*) 时,我的赞成票:)
  • 为了确定,在获取计数时我只是说: if($data["count"] > 1) { //remove ads } else{ //don't remove ads } ?
  • @JoSmo 别担心,我很快就会;)我还有几个问题。总计是否引用计数列?另外,如果 ip 不在数据库中,我是否只是在您发布的 else 语句中创建它(此用户没有点击任何广告。显示广告)?
  • "total 是否引用计数列?"是的。
  • 如果ip不在数据库中,则total将为0。这样else代码块中的代码将被执行,即// This user haven't clicked an AD yet. Show ADS.
【解决方案2】:
  mysql_query("SELECT * FROM Stats WHERE ip = '$ip'") or die(mysql_error());    

  if (mysql_affected_rows()){
    // This user already clicked on at least one AD. Don't show ADS.     
  }
  else {
   // This user haven't clicked an AD yet. Show ADS.
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多