WHMCS自定义模块切换MySQL数据库失败 仍访问默认库表报错如何修复
问题根因
- 调用事务时使用了无参数的
Capsule::connection(),默认调用WHMCS系统的默认数据库连接(对应报错中的admin_billing库),没有使用你自定义配置的rscmodule连接 - 闭包的参数会覆盖你之前定义的
$vpnsql变量,实际执行插入时用的是系统默认连接的实例 - 原有
rscmodule_DatabaseConnect返回的是查询构建器对象,不是数据库连接实例,无法直接用于开启对应库的事务
修复方案
首先调整rscmodule_DatabaseConnect函数,直接返回自定义连接实例,方便后续开启事务:
function rscmodule_DatabaseConnect() { try { $connection = Capsule::getInstance()->getConnection('rscmodule'); return $connection; } catch (\Exception $e) { $config = array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'admin_test', 'username' => 'admin_test', 'password' => '*****', 'charset' => 'utf8', ); try { Capsule::getInstance()->addConnection( $config, 'rscmodule' ); return Capsule::getInstance()->getConnection('rscmodule'); } catch (\Exception $e) { return "Unable to connect to rscmodule Database. " . "Please check rscmodule server configuration. " . $e->getMessage(); } } }
再调整插入函数,在自定义连接实例上开启事务:
function rscmodule_DatabaseInsert() { try { $vpnsql = rscmodule_DatabaseConnect(); if (is_string($vpnsql)) { return $vpnsql; // 连接报错直接返回错误信息 } // 直接在自定义连接实例上开启事务,不要用全局默认连接 $vpnsql->transaction( function ($connection) { $connection->table('test')->insert( [ 'user_id' => 'fdffddfg', ] ); } ); } catch (\Exception $e) { return "VPN Database Query Error: " . $e->getMessage(); } return "success"; }
如果你不想修改原有连接函数的返回值,也可以直接指定连接名执行操作,无需提前拿连接实例:
// 极简实现版本 function rscmodule_DatabaseInsert() { try { Capsule::connection('rscmodule')->transaction(function ($connection) { $connection->table('test')->insert(['user_id' => 'fdffddfg']); }); } catch (\Exception $e) { // 首次调用不存在连接时捕获异常,初始化连接即可 $config = [ 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'admin_test', 'username' => 'admin_test', 'password' => '*****', 'charset' => 'utf8', ]; Capsule::getInstance()->addConnection($config, 'rscmodule'); // 重试执行插入 Capsule::connection('rscmodule')->table('test')->insert(['user_id' => 'fdffddfg']); } return "success"; }
内容的提问来源于stack exchange,提问作者R. Riccardo
相关产品推荐
相关产品推荐

