9

我想从我的typo3 扩展中获取一些数据库表。该扩展基于 extbase。

查询始终不返回任何内容,但数据存在

我试过这个:

$query = $this->createQuery();
$query->statement('SELECT * FROM `my_table`
    WHERE field = ? ORDER BY date DESC LIMIT 1',
    array($condition));

$results = $query->execute();

和这个:

$query = $this->createQuery();

$query->matching($query->equals('field', $condition));
$query->setOrderings(array('date' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
$query->setLimit(1);

$results = $query->execute();

两者都返回null作为结果。

是否可以获取该类创建的 sql 以查看错误在哪里?

我查看了一些 extbase 持久类,但没有找到线索

编辑:对于那些有兴趣的人..我找到了一个“解决方案”。

如果使用 statement() 方法创建查询,则可以使用此函数打印查询

echo $query->getStatement()->getStatement();

它不会替换占位符。但是您可以使用此方法获取变量

var_dump($query->getStatement()->getBoundVariables());

这是我找到的最好的解决方案,无需编辑 extbase 扩展

4

8 回答 8

6

在 TYPO3 6.2 中,您可以使用 Extbase DebuggerUtility 来调试查询。

在 $query->execute() 之前添加这段代码:

/** @var Typo3DbQueryParser $queryParser */
$queryParser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbQueryParser');
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($queryParser->parseQuery($query));
于 2014-10-14T19:23:10.710 回答
5

检查此代码段,虽然它使用起来不是很舒服,但它有很大帮助:

通常,您需要在方法结束时使用此代码buildQuery(array $sql)(*) - 就在之前return $statement;

if (in_array("your_table_name", $sql['tables'])) {
    var_dump($statement);
    print_r($statement);
}

(*) 类文件:

  • TYPO3 版本:4.x:typo3/sysext/extbase/Classes/Persistence/Storage/Typo3DbBackend.php
  • TYPO3 版本:6.x:typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php

在 6.2.x ...

您可以在方法内尝试\TYPO3\CMS\Core\Database\DatabaseConnection::exec_SELECTquery,只需在获取 $query 后添加条件,例如(修剪很重要!):

public function exec_SELECTquery($select_fields, $from_table, $where_clause, $groupBy = '', $orderBy = '', $limit = '') {
    $query = $this->SELECTquery($select_fields, $from_table, $where_clause, $groupBy, $orderBy, $limit);

    if (trim($from_table) == 'fe_users') {
        DebuggerUtility::var_dump($query);
    }

// rest of method
于 2012-10-26T10:37:06.703 回答
3

一种无需更改任何 Typo3 核心代码且目前未在任何论坛中提及的简单方法是使用 php "serialize()" 方法:

$result = $query->execute();
echo (serialize($result));

在结果对象中,您可以找到 SQL 查询 ("statement;" ...)

于 2014-11-08T12:41:36.513 回答
2

改进 biesiors 答案:

由于 Extbase 在调用 buildQuery() 后替换了一些占位符,您可能更愿意将调试输出放在getObjectDataByQuery()$ this->replacePlaceholders($sql, $parameters, $tableName);之后。

if (strpos($sql, "your_table_name.")) {
    debug($sql, 'my debug output');
};

此外,最好使用 debug() 而不是 var_dump()。
[文件:typo3\sysext\extbase\Classes\Persistence\Generic\Storage\Typo3DbBackend.php. 6.1 版中的第 339 行]:

于 2013-06-25T17:52:21.987 回答
1
$query = $this->createQuery();
$query->getQuerySettings()->setReturnRawQueryResult(TRUE);
$getHotelInfo = 'SELECT * FROM `my_table` WHERE field = ? ORDER BY date DESC LIMIT 1';
return $query->statement($getHotelInfo)->execute();

要执行查询,您必须在存储库中写入“setReturnQueryResult”

于 2015-06-16T12:13:18.617 回答
0

使用 TYPO3 6.1 时调试语句的一种更简洁的方法使用Typo3DbBackend.

$parser = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Storage\\Typo3DbBackend');
$params = array();
$queryParts = $parser->parseQuery($query, $params);

\TYPO3\CMS\Core\Utility\GeneralUtility::devLog('query', 'my_extension', 1, array('query' => $queryParts, 'params' => $params));

解析器返回一个数组,其中包含生成的 SQL 语句的不同部分。

在 TYPO3 6.2 中,该parseQuery方法被移到Typo3DbQueryParser并丢失了它的第二个参数。

于 2014-05-23T11:54:08.260 回答
0

我只是用 $_GET 条件扩展了上面的代码片段。对于调试,只需将“?dbg_table=tx_some_of_my_tables”附加到您的地址,您就可以开始了;-)

if (in_array($_GET['dbg_table'], $sql['tables'])) {
        echo('<div style="background: #ebebeb; border: 1px solid #999; margin-bottom: 20px; padding: 10px;"><pre style="white-space: normal">'.$statement.'</pre></div>');
    }
于 2014-03-14T15:58:51.647 回答
0

我建议在“SYS”数组下的typo3conf/LocalConfiguration.php 文件中设置它

'SYS' => array(
......
'displayErrors' => 1,
'sqlDebug' => 1
.......
)

然后故意在查询中写错字段名,然后执行代码。这将显示最后一个查询执行错误。

于 2015-06-15T06:42:02.217 回答