如何在 Typo3 版本 10 ($GLOBALS['TYPO3_DB']->sql_query()) 中执行普通 SQL?
Posted
技术标签:
【中文标题】如何在 Typo3 版本 10 ($GLOBALS[\'TYPO3_DB\']->sql_query()) 中执行普通 SQL?【英文标题】:How to execute plain SQL in typo3 version 10 ($GLOBALS['TYPO3_DB']->sql_query())?如何在 Typo3 版本 10 ($GLOBALS['TYPO3_DB']->sql_query()) 中执行普通 SQL? 【发布时间】:2020-08-27 05:32:14 【问题描述】:有没有办法在typo3 版本10 中执行普通SQL?我该怎么做?
// in previous versions you could do the following
$sql = 'SELECT * FROM tt_content;';
$GLOBALS['TYPO3_DB']->sql_query($sql);
while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res))
// ...
编辑
简单的脚本SELECT * FROM tt_content
只是一个占位符。我想对我的统计页面做一些特殊的迁移或一些特殊的请求。
【问题讨论】:
【参考方案1】:不再需要在 TYPO3 中执行原始 SQL,因为基于 Doctrine 的 DBAL API 功能强大,基本上可以让您做任何事情。
你的例子using the TYPO3 Connection
class:
$result = GeneralUtility::makeInstance(ConnectionPool::class)
->getConnectionForTable('tt_content')
->select(['*'], 'tt_content');
foreach ($result as $row)
// ...
【讨论】:
对不起,简单的脚本只是一个占位符。我想对我的统计页面做一些特殊的迁移或一些特殊的请求。 当然,但我写的仍然是真的,你应该可以用 DBAL API 做任何事情。 不支持INSERT .. ON DUPLICATE UPDATE
- ***.com/questions/4555323/…
这就是我写“基本上”的原因。 ;-) 当然,它不能涵盖所有边缘情况。【参考方案2】:
$connection = GeneralUtility::makeInstance(ConnectionPool::class)
->getConnectionForTable('tt_content');
$resultSet = $connection->query('SELECT * FROM tt_content')->execute();
【讨论】:
这可能是一个正确的答案,但对您的代码提供额外的解释会很有用,以便开发人员能够理解您的推理。这对于可能不熟悉语法的新开发人员特别有用。此外,它可以帮助减少对后续问题的需求。您介意用更多详细信息更新您的评论吗? 答案对我有帮助,但如果有解释当然会更好。 我不知道可以用什么样的解释,因为代码很琐碎......让我试着解释一下:“你需要创建一个新的连接池实例,获取一个数据库连接对象从中调用它的 query() 方法”。我希望它有所帮助。【参考方案3】:对我来说与 TYPO3 9 一起工作。
// looky-looky at 20200609: https://www.strangebuzz.com/en/snippets/running-raw-sql-queries-with-doctrine
/** @var Connection $connection */
$connection = GeneralUtility::makeInstance(ConnectionPool::class)
->getConnectionForTable(self::TABLENAME);
/** @var DriverStatement $statement */
$statement = $connection->prepare($sql);
$statement->execute();
感谢Idea
【讨论】:
以上是关于如何在 Typo3 版本 10 ($GLOBALS['TYPO3_DB']->sql_query()) 中执行普通 SQL?的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试在 TYPO3 版本上安装自定义扩展时,如何解决我得到的错误。 10?