我创建了一个片段,它从数据库表中提取数据并以表格格式显示它。该片段将 id 作为参数,并将其添加到 sql 查询中。
我的问题是,如果我在同一页面上有超过 1 个片段调用(有时需要在页面上显示不同 id 的表格数据),所有表数据都与最后一个数据库调用相同片段。
我需要做什么才能不缓存片段数据库调用并让它们都显示自己的内容?
我尝试将页面设置为不可缓存。还使用了 [! !] 用于片段调用的括号,甚至使用了 function_exists() 方法,但它们都没有帮助。
请问有人可以帮我吗?
谢谢
我创建了一个片段,它从数据库表中提取数据并以表格格式显示它。该片段将 id 作为参数,并将其添加到 sql 查询中。
我的问题是,如果我在同一页面上有超过 1 个片段调用(有时需要在页面上显示不同 id 的表格数据),所有表数据都与最后一个数据库调用相同片段。
我需要做什么才能不缓存片段数据库调用并让它们都显示自己的内容?
我尝试将页面设置为不可缓存。还使用了 [! !] 用于片段调用的括号,甚至使用了 function_exists() 方法,但它们都没有帮助。
请问有人可以帮我吗?
谢谢
如果您可以发布您的代码段,这将有助于回答。我在页面上进行了多次调用而没有问题,因此代码段内部有问题,或者您需要输出到唯一的占位符名称。
在代码段末尾试试这个:
mysql_connect('host', 'user', 'pass');
mysql_select_db('db_name');
您当然需要指定连接参数。
你遇到了ModX的一个小故障,我花了很长时间才解决。ModX 通过使用散列进行大量缓存,显然,当在一个页面内建立多个连接时,该页面分为多个片段,可以看到这种不稳定的行为。这很可能是非常不受欢迎的行为,它可以很容易地解决,但会让你非常头疼。
一种症状是$modx->getObject($classname, $id)返回 null(通常)。
解决方案非常简单:要么使用带有单个 db 实例的静态类,要么使用$modx->setPlaceholder($instance, $tag);,或组合使用。
我的解决方案是:
class dt__xpdo {
private function __construct() {}
public function __destruct() {
$this->close();
}
static public function db($modx = null) {
if ($modx->getPlaceholder('dt_xpdo') == '') {
$dt_user = 'xxxxxxxxx';
$dt_pw = 'xxxxxxxxx';
$dt_host = 'localhost';
$dt_dbname = 'xxxxxxxxx';
$dt_port = '3306';
$dt_dsn = "mysql:host=$dt_host;dbname=$dt_dbname;port=$dt_port;charset=utf8";
$dt_xpdo = new xPDO($dt_dsn, $dt_user, $dt_pw);
$dt_xpdo->setPackage('mymodel', MODX_CORE_PATH.'components/mymodel/'.'model/', '');
//$modx->log(modX::LOG_LEVEL_DEBUG, 'mymodel.config.php');
//$modx->log(modX::LOG_LEVEL_DEBUG, 'Could not addPackage for mymodel!');
$modx->setPlaceholder('dt_xpdo', $dt_xpdo);
}
return $modx->getPlaceholder('dt_xpdo');
}
}
现在您可以在代码中使用:
require_once 'above.php';
并使用类似的东西
$xpdo = dt__xpdo::db($modx);
并继续完美无缺!