我有统计数据存储在数据库中。我希望用户在我们的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 日志错误和警告到文件,并确保在测试新代码后检查文件,和
-
正确缩进你的代码,这样你就可以发现这样的错误而不必计算每个大括号
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代码。如果在文件末尾有一个?>
,那就意味着会出现神秘的错误。