2013-04-26 71 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