以前在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
這樣就規範了,在查詢語句中不會出現用戶名、密碼等數據庫連接信息。
评论