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