【问题标题】:Selecting UserID's Database Entry选择用户 ID 的数据库条目
【发布时间】:2021-03-08 16:08:01
【问题描述】:

我正在使用 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']){
        ...
    }
}

虽然这不允许我限制每个用户 ID 的结果,但如果我能让 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'] . '

【问题讨论】:

  • WHERE userid = $vbulletin-&gt;userinfo['userid'] ...请在整行的上下文中显示此内容。附言无论如何,您应该使用准备好的语句和参数化查询,所以这个问题不应该出现 - 永远不要将变量值直接连接到您的 SQL 中。
  • 对于查询中的变量,整行将是SELECT * FROM logins WHERE userid = $vbulletin-&gt;userinfo['userid'] ORDER BY phpdate ASC LIMIT 5,您的意思是我应该做类似$var = $vbulletin-&gt;userinfo['userid']; 然后在查询中使用$var 吗?
  • as for the variable in the query, are you meaning I should do something like $var = $vbulletin-&gt;userinfo['userid']; then use $var in the query?...不,那将有完全相同的问题。您使用什么数据库库连接到数据库? mysqli?还是 PDO?或者是其他东西?它们都有自己特定的语法来使用准备好的语句和参数,因此您需要查看特定库的文档和教程。 bobby-tables.com 给出了风险解释,以及如何使用流行的 PHP 库安全地编写查询的一些示例
  • SELECT * FROM logins WHERE userid = $vbulletin-&gt;userinfo['userid'] ORDER BY phpdate ASC LIMIT 5...但是,它必须在您的应用程序的 PHP 字符串中吗?再次,请您显示 整个 行 PHP 代码。 (我猜你在已经单引号的字符串中遇到了引号问题,或者类似的东西。但无论如何,如果你正确使用参数,问题就会完全消失 - 它不仅解决了 SQL 注入问题,它也解决了各种潜在的语法问题)。
  • 想通了,不知道为什么或如何准确,只是效仿了另一种产品。立即添加答案

标签: php mysql sql vbulletin


【解决方案1】:

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

我的最终结果是:

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

区别在于引号的类型以及它们的放置位置。

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

【讨论】:

  • 在 SQL 中,变量周围的单引号允许您在查询中使用字符串(非数字)值。大概您的 ID 不是数字。附:正如我上面提到的,正确参数化查询可以让您完全避免这个问题(因为将变量值正确包含到查询中的过程由数据库引擎自动处理)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2011-01-11
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多