获取MediaWiki session()用户名


Get MediaWiki session() username

我有统计数据存储在数据库中。我希望用户在我们的MediaWiki中只查看与他们的用户名相关的统计数据。我已经尝试了下面,但它给我只是一个空白页(没有错误)。我的猜测是它没有从会话中获取用户名。我该怎么做呢?

<?php
$dbtype           = "mysql";
$dbhost           = "localhost";
$dbname           = "test";
$dbuser           = "username";
$dbpassword       = "passw0rd";
$conn = mysql_connect($dbhost, $dbuser, $dbpassword);
if(! $conn )
{
die('Could not connect: ' . mysql_error());
}   
$wgHooks['UserLoginComplete'][] = 'test::onUserLoginComplete';
class test
{
public static function UserLoginComplete( $user, $password, &$retval, &$msg ) {
    $dbr = wfGetDB( DB_SLAVE );
    $row = $dbr->selectRow(
        'coaching',                                 // $Table
        'Name',                                     // $vars (column of the table)
        array( 'Name' => $user ),                   // $Conitions
        __METHOD__                                  // $fname = 'Database::select'
    );
mysql_select_db($dbname, $conn);
echo '<table border="0" border-color="#CCCCCC" bgcolor="#FFFFFF"><thead><tr><td><b>ID</b></td><td><b>Namn</b></td><td><b>Datum</b></td><td><b>Score</b></td></tr></thead><tbody>';
$query = "SELECT ID, Name, Date, Score FROM coaching WHERE Name = $user";
$result = mysql_query($query) or die(mysql_error());
$color="1";
while($row = mysql_fetch_array($result)){
if($color==1){
echo '<tr bgcolor="#D0D0D0">';
$color="2";
} else {
echo '<tr bgcolor="#E0E0E0">';
$color="1";
}
echo '<td>'.$row['ID'].'</td><td>'.$row['Name'].'</td><td>'.$row['Date'].'</td><td>'.$row['Score'].'</td></tr>';    
}
?>

我假设你是在MediaWiki扩展内这样做。从你的问题中不清楚是否是这种情况,但我看到你正在注册一个钩子。注意,您正在注册的钩子UserLoginComplete显示了与您定义的函数签名不同的函数签名。要获得用户名,您需要使用$wgUser对象对象的实例,然后调用该对象的getName方法。

类似:

$user->getName();

$user本身是一个对象引用

您的实际问题是您的类缺少右花括号(}),导致PHP语法错误。(实际上,你漏掉了两个)

要避免和/或捕获此类错误,您应该:

  • 配置PHP 显示错误信息

  • 还配置PHP 日志错误和警告到文件,并确保在测试新代码后检查文件,和

  • 正确缩进你的代码,这样你就可以发现这样的错误而不必计算每个大括号

无论如何,一旦你修复了这些问题(和语法错误),你仍然有一些其他的问题。首先,Jamie Thingelstad指出,你的UserLoginComplete钩子的参数是错误的;它们应该是:
function onUserLoginComplete( &$user, &$inject_html ) {

第二,你不应该在UserLoginComplete钩子(或在任何MediaWiki扩展代码,真的)echo任何东西。在这种情况下,可以做的是将要输出的HTML附加到$inject_html参数,如下所示:

$inject_html .= '<table border="0" ...';

(这个输出方法是这个特定钩子特有的。在MediaWiki扩展中输出某些东西的通常方法是使用OutputPage类,或者通过传递给钩子的实例—或者通过传递给它的其他对象获得,比如任何实现IContextSource —或者,如果没有,使用全局实例$wgOut。)

此外,您没有在SQL查询中转义$user变量,因此您的代码可能容易受到SQL注入的攻击。此外,无论如何都不应该使用旧的mysql函数;它们已被弃用。

最后,我不确定UserLoginComplete是否真的是你想要做的事情的正确钩子。顾名思义,它只在用户登录到MediaWiki时运行,除非用户注销并重新登录,否则它不会再次运行。如果你希望你的用户能够随时查看你的统计数据,你应该在每个页面视图上使用一些钩子,或者,也许更好的是,让用户可以访问一个自定义的特殊页面来查看统计数据。

p。此外,在PHP中永远不要使用结束的?>标记,除非您确实打算在它后面包含一些HTML代码。如果在文件末尾有一个?>,那就意味着会出现神秘的错误。