获取MediaWiki会话()用户名

时间:2013-04-26 07:14:54

标签: php session mediawiki 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>';    
}
?>

2 个答案:

答案 0 :(得分:1)

我假设您在MediaWiki扩展程序中执行此操作。从你的问题不清楚是否是这种情况,但我看到你正在注册一个钩子。请注意,您注册的挂钩UserLoginComplete显示的功能签名与您定义的不同。要获取用户名,您需要使用正在传递的$wgUser object对象的实例,然后在该对象上调用getName方法。

类似的东西:

$user->getName();

$user本身就是一个对象引用。

答案 1 :(得分:1)

您的实际问题是您的类缺少结束大括号(}),导致PHP语法错误。 (实际上,你错过了两个。)

为避免和/或发现此类错误,您应该:

无论如何,一旦你修复了这些问题(以及语法错误),你仍然会遇到一些其他问题。 Jamie Thingelstad指出的一个问题是UserLoginComplete hook的参数是错误的;他们应该是:

function onUserLoginComplete( &$user, &$inject_html ) {

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

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

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

此外,您的SQL查询中不是escaping $user变量,因此您的代码可能是vulnerable to SQL injection。此外,你不应该使用旧的mysql函数; they've been deprecated

最后,无论如何,我不确定UserLoginComplete是否真的是你想要做的hook。顾名思义,它仅在用户登录MediaWiki时运行,除非用户注销并重新登录,否则不会再次运行。如果您希望用户能够随时查看统计信息,则应该使用在每个页面视图上运行的一些钩子,或者更好的是,让用户可以访问custom special page以查看统计信息。

聚苯乙烯。此外,除非您确实打算在其后添加一些HTML代码,否则您应该never use the closing ?> tag in PHP。在文件末尾加?>只是mysterious errors的邀请。