2013-04-26 68 views
1

我有统计存储在数据库中。我希望我们的MediaWiki中的用户仅查看与其用户名相关联的统计信息。 我在下面试过,但它给了我一个空白页面(没有错误)。 我的猜测是它没有从会话中获取用户名。 我应该如何设法做到这一点?获取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>';  
} 
?> 

+0

你不应该猜测,你应该知道你的代码中发生了什么。 – svick 2013-04-26 09:01:15

+0

不幸的是,我们并不是所有人都是那种技术娴熟的人,但是谢谢你的助手。 – 2013-04-26 09:33:21

+0

我的意思是,如果你不知道,你应该找出答案。无论是通过使用调试器,还是通过将实际值写入某个可以读取它的地方(如果这对您不可用)。 – svick 2013-04-26 09:35:37

回答

1

我假设你正在做这个链接到MediaWiki扩展的内部。从你的问题来看,这是不是很清楚,但我看到你正在注册一个钩子。请注意,您正在注册的钩子UserLoginComplete会显示与您定义的功能签名不同的功能签名。要获得用户名,您需要使用正在传递的$wgUser object对象的实例,然后调用该对象上的getName方法。

是这样的:

$user->getName(); 

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

+0

我想将用户名转换为外部的php文件。 我将该文件存储在与MediaWiki相同的位置,但我不想对其进行扩展。 我试图使用一个钩子来查看我是否可以设法以没有运气的方式检索我需要的数据。 是否有可能从会话检索到外部php文件的用户名? – 2013-04-29 06:27:47

1

您的实际问题在于您的班级缺少闭合大括号(}),导致PHP语法错误。 (实际上,你缺少他们)

为了避免和/或赶上这样的错误,你应该:

无论如何,一旦你解决了这些问题(和语法错误),你仍然有一些其他问题。其中一个由Jamie Thingelstad指出,UserLoginComplete hook的参数是错误的;他们应该是:

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

其次,你应该没有任何echo在UserLoginComplete钩(或任何链接到MediaWiki扩展代码可言,真的)。你可以做,在这种情况下,是追加HTML要输出到$inject_html参数,就像这样:

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

(这种输出方式所特有的这种特定的钩子通常的方式输出一些在链接到MediaWiki扩展使用OutputPage class,无论是通过传递给你的钩子—或获得通过传递给它,如任何其他对象实现IContextSource —一个实例,或者如果没有任何使用全局实例$wgOut 。)

而且,你不是escaping$user变量在您的SQL查询,让你的代码是潜在vulnerable to SQL injection。此外,你不应该使用旧的mysql功能; they've been deprecated

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

诗篇。另外,你应该never use the closing ?> tag in PHP,除非你实际上打算在它之后包含一些HTML代码。在文件末尾有?>只不过是mysterious errors的邀请。

+0

我不确定如果我可以使用钩子。我试图从会话中获取用户名到一个外部的php文件,但你已经看到我的编程技能是跛脚的。 是否有可能从会话中检索用户名并在外部php文件中使用它? – 2013-04-29 06:29:27

+0

获取MediaWiki用户名的一种快速且肮脏的方法是使用'$ _COOKIE [“xxxUserName”]',其中'xxx'是[cookie前缀](http://www.mediawiki.org/wiki/Manual :$ wgCookiePrefix)(如果您没有明确设置,将基于数据库名称/前缀)。如果您不确定它是什么,请查看浏览器的cookie jar进行检查。 – 2013-04-29 13:37:09

+0

Ilmari Karonen,谢谢! – 2013-04-30 07:07:23