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

実際問題は、クラスに右中括弧 ( }) がなく、PHP 構文エラーが発生することです。(実際には、それらのうちの2 つがありません。)

このようなエラーを回避および/またはキャッチするには、次のことを行う必要があります。

いずれにせよ、これらの問題 (および構文エラー) を修正しても、まだいくつかの問題があります。Jamie Thingelstad が指摘した 1 つは、UserLoginComplete フックのパラメーターが間違っていることです。彼らはする必要があります:

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

第二にecho、UserLoginComplete フック (または MediaWiki 拡張コードではまったく) では何もすべきではありません。この場合にできることは、次のように、出力する HTML を$inject_htmlパラメーターに追加することです。

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

(この出力方法は、この特定のフックに特有のものです。MediaWiki 拡張機能で何かを出力する通常の方法は、フックに渡されたインスタンスを介して、またはフックに渡された他のオブジェクトを介して取得されたOutputPage クラスを使用することです。 IContextSourceを実装します— または、存在しない場合はグローバル インスタンスを使用します$wgOut)。

また、SQL クエリで変数をエスケープしていないため、コードはSQL インジェクションに対して脆弱になる可能性があります。それに、とにかく古い関数を使用するべきではありません。それらは廃止されました$usermysql

最後に、とにかく UserLoginComplete が本当にやりたいことの正しいフックであるかどうかはわかりません。名前が示すように、ユーザーが MediaWiki にログインしたときにのみ実行され、ユーザーがログアウトして再度ログインしない限り、再度実行されることはありません。ユーザーがいつでも統計を表示できるようにしたい場合は、次のいずれかを行う必要があります。すべてのページ ビューで実行されるフックを使用するか、ユーザーがアクセスして統計情報を確認できるカスタムの特別ページを作成することをお勧めします。

Ps。また、実際に HTML コードをその後に含めるつもりがない限り、PHPで終了タグを使用しないでください。?>ファイルの最後に があることは、不可解なエラー?>の誘因に他なりません。

于 2013-04-26T18:45:42.753 に答える