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

+0

К сожалению, не все из нас настолько искусны, что я боюсь, но спасибо вам за помощника. –

+0

Я имел в виду, что если вы не знаете, вы должны это выяснить. Либо используя отладчик, либо, если это не доступно вам, написав фактическое значение где-нибудь, где вы можете его прочитать. – svick

ответ

1

Я предполагаю, что вы делаете это внутри расширения MediaWiki. Из вашего вопроса было непонятно, было ли это так, но я вижу, что вы регистрируете крючок. Обратите внимание, что на крюке, который вы регистрируете UserLoginComplete, показана другая сигнатура функции, которую вы определяете. Чтобы получить имя пользователя, вам нужно использовать экземпляр объекта $wgUser object, который вы передаете, а затем вызвать метод getName для этого объекта.

Что-то вроде:

$user->getName(); 

$user сам по себе является ссылкой на объект.

+0

Я пытаюсь получить имя пользователя к внешнему php-файлу. Я буду хранить файл в том же месте, что и MediaWiki, но я не хочу его расширять. Я попытался использовать крючок, чтобы посмотреть, смогу ли я получить данные, которые мне нужны, без везения. Возможно ли получить имя пользователя из сеанса во внешний php-файл? –

1

Актуально Проблема в том, что ваш класс не имеет закрывающей фигурной скобки (}), вызывая синтаксическую ошибку PHP. (На самом деле, вы упускаете два из них.)

Чтобы избежать и/или поймать такие ошибки, вы должны:

  • настроить PHP для display error messages,

  • также настроить PHP до log errors and warnings to a file, и не забудьте проверить файл после тестирования нового кода и

  • indent your code properly, чтобы вы могли обнаружить такие ошибки без хави нг для подсчета каждой фигурной скобки.

В любом случае, как только вы устранили эти проблемы (и синтаксическую ошибку), у вас все еще есть другие проблемы. Один, указал Джейми Тингельстад, заключается в том, что параметры для вашего 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, который ваши пользователи могут посетить, чтобы просмотреть статистику.

Ps. Кроме того, вы должны never use the closing ?> tag in PHP, если вы на самом деле не собираетесь включать какой-то код HTML после него. Наличие ?> в конце файла - не что иное, как приглашение для mysterious errors.

+0

Я не уверен, могу ли я вообще использовать крючок. Я пытаюсь получить имя пользователя из сеанса во внешний php-файл, но, как вы уже видели, мои навыки кодирования хромые. Возможно ли получить имя пользователя из сеанса и использовать его во внешнем php-файле? –

+0

Быстрый и грязный способ получить имя пользователя MediaWiki - просто использовать '$ _COOKIE [" xxxUserName "]', где 'xxx' является [префикс cookie] (http://www.mediawiki.org/wiki/Manual : $ wgCookiePrefix) для вашей вики (которая будет основана на имени/префиксе базы данных, если вы не указали ее явно). Если вы не уверены, что это такое, загляните в банку cookie вашего браузера, чтобы проверить. –

+0

Это сработало Ilmari Karonen, спасибо! –

Смежные вопросы