1

我已将统计信息存储在数据库中。我希望我们 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>';    
}
?>

4

2 回答 2

1

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

就像是:

$user->getName();

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

于 2013-04-26T18:21:21.167 回答
1

您的实际问题是您的类缺少右大括号 ( }),从而导致 PHP 语法错误。(实际上,您缺少其中两个。)

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

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

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

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

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

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

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

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

附言。此外,除非您确实打算在其后包含一些 HTML 代码,否则您不应该在 PHP 中使用结束标记。?>文件末尾有 a?>只不过是对神秘错误的邀请。

于 2013-04-26T18:45:42.753 回答