Php 如何在MediaWiki中查询数据库?

Php 如何在MediaWiki中查询数据库?,php,mediawiki,mediawiki-extensions,Php,Mediawiki,Mediawiki Extensions,我第一次在自定义扩展/特殊页面上工作。我试图创建一个简单的页面,查询数据库并在页面上显示结果。我得到了如下代码: class SpecialBuildRating extends SpecialPage { function __construct() { parent::__construct( 'BuildRating' ); } function execute( $par ) { if(isset($_GET['id'])){ $buildId =

我第一次在自定义扩展/特殊页面上工作。我试图创建一个简单的页面,查询数据库并在页面上显示结果。我得到了如下代码:

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;输出调用,是否有更简单/更有效的方法

$res = $db->select(
    'build_rating',
    array('article_id', 'user_id', 'vote', 'comment', 'date'),
    array( 'article_id' => $buildId ),
    __METHOD__,
    array( 'ORDER BY' => 'date ASC' )
);
有关详细信息,请参阅

在输出时,使用$output->addHTML,但是在这种情况下,您需要自己负责


另一点,在MediaWiki中,建议使用$this->getRequest->getInt'name',$defaultValue,而不是直接访问请求全局变量。

好的,那么只在select调用中传递变量是安全的吗?另外,如果我坚持使用当前的$output->addWikiText$var;我不需要担心注入和XSS?是的,只要你依赖MW原语你就可以了。但在非标准使用情况下,如article_id>$buildId.addWikiText通过MW解析器处理其输入,该解析器不允许任何非安全HTML通过。就像它是在编辑期间添加到使用的页面一样。