在ModX Revo中运行自定义数据库查询

时间:2012-09-18 04:22:01

标签: php mysql content-management-system modx modx-revolution

我正在尝试在ModX Revo中的代码段内查询数据库:

<?php

$leadersql = "SELECT * FROM `modx_menus`";

$result = mysql_query($leadersql);

while ($row = mysql_fetch_array($result)) {
  echo "hello";
};

?>

在Evo上,这种方法很好但在Revo中没有任何返回。

我需要以不同的方式进行设置吗?

4 个答案:

答案 0 :(得分:8)

Christian的代码确实有用,您可能需要首先定义$ rows数组:

$leadersql = "SELECT * FROM `modx_menus`";

$query = $modx->query($leadersql);

$rows = array();

if ($query) {
    // loop through the result set and inspect one row at a time
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {

        array_push($rows, $row);

    }
}

echo '<br /><br /><pre>';
        print_r($rows);
echo '</pre>';

如果不是: - 你确实定义了菜单项吗? - 你正在调用你的片段未缓存?

答案 1 :(得分:4)

理想情况下,您可以使用xPDO方法构建数据库查询。它会自动转义提供的参数,创建跨数据库类型(当前为mysql&amp; mssql)转换的查询,并具有许多其他好处。但是,设置因为需要为自定义表创建类和映射也很棘手。 Bob's guides有很好的信息,Lazylegs

也是如此

但是当然你可以在不使用XPDO的情况下实现你的特定查询:

$leadersql = "SELECT * FROM `modx_menus`";
$query = $modx->query($leadersql);
if ($query) {
    // loop through the result set and inspect one row at a time
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
        array_push($rows, $row);
    }
}

还有Rowboat加载项,用于跨数据库表行进行迭代 - 如果您的要求很简单。

答案 2 :(得分:3)

为什么不使用内置的xPDO方法:

$menus = $modx->getCollection('modMenu');
if ($menus) {
    foreach ($menus as $menu) {
        echo $menu->get('text');
    }
}

答案 3 :(得分:-2)

您可以尝试以下代码:

<?php
include './core/config/config.inc.php';

$con=mysqli_connect($database_server,$database_user,$database_password,$dbase);
// Check connection
mysqli_set_charset($con, "utf8");
if (mysqli_connect_errno()) {
    //echo "Failed to connect to MySQL: " . mysqli_connect_error();
    return "DB error";
}

$result = mysqli_query($con,"SELECT id, pagetitle, uri FROM `modx_site_content` WHERE parent = ".$parentId); 
while($row = mysqli_fetch_array($result))
{
  //do something with $row['pagetitle'];
}

其中$ parentId是来自Snippet调用的示例参数。