首页 > 解决方案 > 选择用户 ID 的数据库条目

问题描述

我正在使用 vBulletin 论坛软件 3.8,其中有多种方法可以提取当前用户的用户 ID:

$vbulletin->GPC['userid']
$vbulletin->userinfo['userid']
$bbuserinfo['userid']

在我的情况下,所有这些都返回相同的值1

我创建了一个表来存储登录信息,其中存储用户 ID,如下所示:

INSERT INTO logins (userid, phpdate)
VALUES (" . $vbulletin->userinfo['userid'] . ", " . TIMENOW . ")

使用 Navicat 我可以运行一个查询:

SELECT *
FROM logins
WHERE userid = 1
ORDER BY phpdate ASC
LIMIT 5

这给了我正确的结果,因此我将此查询转换为 vBulletin 格式,将WHERE子句更改为:

WHERE userid = $vbulletin->userinfo['userid']

这样做会引发错误:

syntax error, unexpected 'userid' (T_STRING), expecting ')'

我已经尝试将变量包装在其中,intval($var) IN ($var)但我似乎无法让它的任何变体起作用,我什至试图逃避' $vbulletin->userinfo[\'userid\'].

所以提问时间:如何在我的查询中选择用户 ID?

我在PHP 7.4

为了克服这个问题,我在我的 while 循环中使用了 if 条件

while ($row = $result->fetch_assoc()){
    $row['phpdate'] =    vbdate( $vbulletin->options['dateformat'], $row['phpdate'], true );
    if ($vbulletin->userinfo['userid'] == $row['userid']){
        ...
    }
}

虽然这不允许我限制每个用户标识的结果,但如果我能让 SQL 语句正常运行,我还有其他计划。

我一直在搞砸这个等待一些帮助我目前的方法是:

$result = $db->query('
SELECT *
FROM logins
WHERE userid = ' . $vbulletin->userinfo['userid'] . '
ORDER BY phpdate ASC
LIMIT 5
');
    while ($row = $result->fetch_assoc()){
        $row['phpdate'] =   vbdate( $vbulletin->options['dateformat'], $row['phpdate'], true );

     if ($vbulletin->userinfo['userid'] == $row['userid']){
      $drcpi_tbl_gutz .= '
        <li><ul class="device">
        <li class="icon">';
          $drcpi_tbl_gutz .= '<i class="fal fa-question-square fa-fw"></i>';
       $drcpi_tbl_gutz .= '</li>
        <li class="browser">' . $row['os'] . ' <small>(' . $row['browser'] . ')</small></li><li class="logindate time">' . $row['phpdate'] . '</li>
        <li class="ip-address">' . $row['ipaddress'] . ' <a class="location-lookup" title="Get approximate location of this IP address." href="https://www.iplocation.net/?query=' . $row['ipaddress'] . '"><i class="fal fa-location-arrow"></i></a></li></ul></li>
     ';
      }
    }
    $result->free();

这是抛出一个无效的 SQL 错误:

WHERE userid = ' . Array['userid'] . '

标签: phpmysqlsqlvbulletin

解决方案


在多次尝试解决这个问题后,我决定看看其他一些 vBulletin 产品。跟随他们,我写了我的查询它们是如何出现在其他产品中的。

我的最终结果是:

$result = $db->query("
SELECT *
FROM logins
WHERE userid='".$vbulletin->userinfo['userid']."'
");

不同之处在于引号的类型以及它们的放置位置。

如果有人愿意详细说明为什么在原始帖子中提供的方法不起作用时此解决方案有效,我将不胜感激。我所知道的是这种方式有效,而那种方式无效。


推荐阅读