【问题标题】:Running custom database queries in ModX Revo在 ModX Revo 中运行自定义数据库查询
【发布时间】:2012-09-10 07:45:21
【问题描述】:

我正在尝试在 ModX Revo 的 sn-p 中查询数据库:

<?php

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

$result = mysql_query($leadersql);

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

?>

在 Evo 上这工作正常,但在 Revo 中没有返回任何内容。

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

【问题讨论】:

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


    【解决方案1】:

    理想情况下,您应该使用xPDO 方法来构建数据库查询。它自动转义提供的参数,创建跨数据库类型(当前为 mysql 和 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 插件,用于在数据库表行之间进行迭代 - 如果您的要求很简单。

    【讨论】:

    • 谢谢,但没有运气!用自己的表创建自己的数据库并正常连接会更容易吗?
    • 我刚刚添加了一条关于 Rowboat 的行 - 你看过了吗?
    • 是的 - Rowboat 只是输出查询结果不是吗?我不能把它放到 PHP 变量中吗?
    【解决方案2】:

    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>';
    

    如果不是: - 你有定义菜单项吗? - 你称你的 sn-p 未缓存?

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        你可以试试这个代码:

        <?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 调用的示例参数。

        【讨论】:

        • 请勿在 GET 或 POST 中使用此参数组合,以防止 SQL 注入。使用准备而不是这个。检查php.net/manual/ro/mysqli.prepare.php
        • 感谢您的评论,但我的帖子的目的是展示如何在工作版本中从 Modx Revo 连接到数据库。是否需要天气 sql 注入保护由作者决定。例如,您也可以将 modx 用于内部网站,其中没有 sql 注入的风险。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多