Как запросить базу данных в MediaWiki?
Я работаю над пользовательским расширением / специальной страницей в первый раз. Я пытаюсь создать простую страницу, которая запрашивает базу данных и отображает результат на странице. Я получил следующий код, который делает это:
class SpecialBuildRating extends SpecialPage {
function __construct() {
parent::__construct( 'BuildRating' );
}
function execute( $par ) {
if(isset($_GET['id'])){
$buildId = $_GET['id'];
$db = wfGetDB( DB_SLAVE );
$res = $db->select(
'build_rating',
array('article_id', 'user_id', 'vote', 'comment', 'date'),
'article_id = 1485', //BuildId instead of 1485
__METHOD__,
array( 'ORDER BY' => 'date ASC' )
);
}
$request = $this->getRequest();
$output = $this->getOutput();
$this->setHeaders();
# Get request data from, e.g.
$param = $request->getText( 'param' );
# Do stuff
# ...
$wikitext = 'Hello world!';
$output->addWikiText( $wikitext );
$outP = '<table style="width:100%">
<tr>
<td>article_id</td>
<td>user_id</td>
<td>vote</td>
<td>comment</td>
<td>date</td>
</tr>
';
if ($res != null) {
foreach( $res as $row ) {
$outP .= '<td>' . $row->article_id . '</td><td>' . $row->user_id . '</td><td>' . $row->vote . '</td><td>' . $row->comment . '</td><td>' . $row->date . '</td>';
}
}
$output->addWikiText( $outP );
}
}
Как мне пройти $buildId
к WHERE
заявление вместо 1485
безопасным способом, который предотвращает инъекцию?
Другой вопрос, который у меня есть, который на самом деле не является проблемой, это $output->addWikiText($var);
выходной вызов, есть ли более простой / эффективный способ сделать это?
1 ответ
$res = $db->select(
'build_rating',
array('article_id', 'user_id', 'vote', 'comment', 'date'),
array( 'article_id' => $buildId ),
__METHOD__,
array( 'ORDER BY' => 'date ASC' )
);
См. https://www.mediawiki.org/wiki/Manual:Database_access для получения подробной информации.
Начиная с использования $output->addHTML()
Однако в этом случае вы сами несете ответственность за предотвращение XSS.
Еще один момент, в MediaWiki рекомендуется использовать $this->getRequest()->getInt( 'name', $defaultValue )
вместо прямого доступа к глобальным запросам.