以前在Drupal站中需要数据库查询的时候都是优先考虑使用Views而不是自己写SQL语句,这确实方便了许多。但如果要跨站查询非本站数据库的时候就没法调用其它站的Views了。以前曾经把需要的表复制到当前站再用Views,不过这样可能造成大量冗余的数据表。
前一段时间在网上搜了一下,Drupal的API中本来就准备了这站外数据库查询的接口,下面是一个例子:
function hanzi_emojis($input) { // 原始 sql语句的办法 $database_info = array( 'host' => 'mysql.rds.aliyuncs.com', 'database' => 'database', 'username' => 'username', 'password' => 'password', 'driver' => 'mysql', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', ); Database::addConnectionInfo('name', 'default', $database_info); db_set_active('name'); $sql_1 = "SELECT nid FROM node WHERE title = '$input' LIMIT 1 OFFSET 0";//子查询 $query_1 = db_query($sql_1); $result_1 = $query_1->fetchAll(); //print_r($result_1); if ($result_1 == array()) {//没有找到这个汉字 $output = FALSE;//输出为FALSE } else {//找到这个汉字 ...... } db_set_active(); return $output; }
这样写起来比用Views肯定是麻烦一些,但在需要的时候还是能发挥作用的。✌
2020年8月补充:上面的例子中用户名、密码都写到了程序中,是不妥的,应该写到settings.php中,例如:
$databases['hanyingcidian'] = array( 'default' => array( 'database' => 'cn_18dao_hanyingcidian', 'username' => 'username', 'password' => 'password', 'host' => 'xxxrds.mysql.rds.aliyuncs.com', 'port' => '', 'driver' => 'mysql', 'prefix' => '', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', ), ); $databases['yinghancidian'] = array( 'default' => array( 'database' => 'cn_18dao_yinghancidian', 'username' => 'username', 'password' => 'password', 'host' => 'xxxrds.mysql.rds.aliyuncs.com', 'port' => '', 'driver' => 'mysql', 'prefix' => '', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_general_ci', ), );
然后在模版或者模块程序中调用:
db_set_active('yinghancidian');//修改当前数据库为yinghancidian定义的 查询语句(按照规范应该是调用Drupal的数据库查询API) db_set_active();//修改当前数据库为default
这样就规范了,在查询语句中不会出现用户名、密码等数据库连接信息。
评论