我有统计数据存储在数据库中。我希望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 :(得分:1)
我假设您在MediaWiki扩展程序中执行此操作。从你的问题不清楚是否是这种情况,但我看到你正在注册一个钩子。请注意,您注册的挂钩UserLoginComplete显示的功能签名与您定义的不同。要获取用户名,您需要使用正在传递的$wgUser object对象的实例,然后在该对象上调用getName方法。
类似的东西:
$user->getName();
$user
本身就是一个对象引用。
答案 1 :(得分:1)
您的实际问题是您的类缺少结束大括号(}
),导致PHP语法错误。 (实际上,你错过了两个。)
为避免和/或发现此类错误,您应该:
将PHP配置为display error messages,
还将PHP配置为log errors and warnings to a file,并确保在测试新代码后检查文件,
indent your code properly,这样您就可以发现此类错误,而无需计算每个支撑。
无论如何,一旦你修复了这些问题(以及语法错误),你仍然会遇到一些其他问题。 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的邀请。