在函数.php中使用mysqli进行不同的数据库查询

时间:2014-03-21 作者:madmanali93

我正在尝试连接函数中的数据库。使用mysqli的php。如果代码不在单独的php文件上,而不是在wordpress上,那么它似乎运行良好。但当我在wordpress上运行它时,我得到“连接失败:无法建立连接,因为目标计算机主动拒绝了它。”我不确定wordpress是否阻止了这一点。那么有人能在这个问题上启发我吗?

如果需要,下面提供代码。

require_once($_SERVER[\'DOCUMENT_ROOT\'] . \'/forum/config.php\');
$mysqli = new mysqli($dbhost,$dbuser,$dbpasswd,$dbname);

if ($mysqli->connect_errno)
{
    printf("Connect failed: %s\\n", $mysqli->connect_error);
    exit();
}

$data = \'<?xml version="1.0"?>
<!-- squad info -->
<squad nick="DC">
<name>Dog Company</name>
<email>n/a@gmail.com</email>
<web> http://www.dog-company.com</web>
<picture>sqd_logo.paa</picture>
<title>Dog Company</title>
<!-- start of member list/info -->
<!-- Updated users and updated to xml on server-->\';

$query = \'SELECT *
        FROM \'.$table_prefix.\'users u 
        LEFT JOIN \'.$table_prefix.\'profile_fields_data f
        ON (u.user_id = f.user_id)
        LEFT JOIN \'.$table_prefix.\'user_group g
        ON (u.user_id = g.user_id)
        WHERE g.group_id = 9\';

if ($result = $mysqli->query($query)) {

    /* fetch associative array */
    while ($row = $result->fetch_assoc()) {
        if($row[\'pf_xml_arma_id\'] != ""){
            $data .= \'<member id="\'.$row[\'pf_xml_arma_id\'].\'" nick="\'.$row[\'pf_xml_player_name\'].\'">\';

            $name = ($row[\'pf_xml_name\'] == \'\' ? "N/A" : $row[\'pf_xml_name\']);
            $email = ($row[\'pf_xml_email\'] == \'\' ? "N/A" : $row[\'pf_xml_email\']);
            $steam = ($row[\'pf_xml_steam_user\'] == \'\' ? "N/A" : "Steam: ".$row[\'pf_xml_steam_user\']);
            $quote = ($row[\'pf_xml_remark\'] == \'\' ? "N/A" : $row[\'pf_xml_remark\']);

            $data .= \'<name>\'.$name.\'</name>
            <email>\'.$email.\'</email>
            <icq>\'.$steam.\'</icq>
            <remark>\'.$quote.\'</remark>\';
            $data .= \'</member>\';
        }
    }

    /* free result set */
    $result->free();
}

/* close connection */
$mysqli->close();

$data .= \'</squad>\'; 

return $data;
感谢您抽出时间,

使现代化

似乎我的$查询没有从配置文件中获取$table\\u前缀。我不知道为什么它不能访问它。任何人

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

由于3.9版(即将发布,实际上是beta 2版)WordPress将使用mysqli连接到数据库(3.9版-使用mysql),所以您可以使用新的wpdb实例和帮助函数连接WordPress的externa值。

我建议使用中的常量配置外部数据库wp-config.php 通过这种方式,您可以确定WordPress中有可用的配置:您必须复制配置,但我认为这不是一个真正的问题。

所以在wp-config.php, 在生产线之前

/* That\'s all, stop editing! Happy blogging. */
在常量中写入外部db配置:

define( \'MY_EXT_DB_HOST\', \'xxx.xxx.xxx.xxx\' );
define( \'MY_EXT_DB_USER\', \'my-dummy-user\' );
define( \'MY_EXT_DB_PWD\', \'my-dummy-password\' );
define( \'MY_EXT_DB_NAME\', \'my-dummy-db-name\' );
define( \'MY_EXT_DB_PREFIX\', \'mydummyprefix_\' );
之后,在函数中。php编写一个初始化并返回新wpdb实例的函数

function get_my_extenal_db() {
  static $myextdb;
  if ( is_null( $myextdb ) ) {
    // new wpdb instance
    $myextdb = new wpdb( MY_EXT_DB_USER, MY_EXT_DB_PWD, MY_EXT_DB_NAME, MY_EXT_DB_HOST );
    // set prefix
    $myextdb->set_prefix( MY_EXT_DB_PREFIX, FALSE );
    // set table names:
    // 1. add all unprefixed table names to an array
    $tables = array( \'users\', \'profile_fields_data\', \'user_group\' ); 
    // 2. replace standard tables
    $myextdb->tables = $tables;
    $myextdb->global_tables = array();
    $myextdb->ms_global_tables = array();
    // 3. set your tables
    foreach ( $tables as $table ) {
      $myextdb->$table = MY_EXT_DB_PREFIX . $table;
    }
    // optional, set DB collate and chartset
    $myextdb->collate = \'utf8_general_ci\';
    $myextdb->charset = \'utf8\';
  }
  return $myextdb;
}
现在,您可以在中使用外部db了WordPress way.

// get db instance
$mydb = get_my_extenal_db();

// prepare query
$query = $mydb->prepare(
   "SELECT * FROM {$mydb->users} u 
   LEFT JOIN {$mydb->profile_fields_data} f ON (u.user_id = f.user_id)
   LEFT JOIN {$mydb->user_group} g ON (u.user_id = g.user_id)
   WHERE g.group_id = %d", 9
);

// get results
$results = $mydb->get_results( $query );
之后,您可以只使用检索到的数据。默认情况下wpdb::get_results() 返回对象数组,其中每一行都是一个对象,其属性是行列的值:

// do stuff with data
if ( ! empty( $results ) ) {
   foreach ( $results as $row ) {
     if( $row->pf_xml_arma_id != "" ){
        $data .= \'<member id="\' . $row->pf_xml_arma_id;
        $data .= \'" nick="\' . $row->pf_xml_player_name . \'">\';
        $name  = $row->pf_xml_name === \'\' ? "N/A" : $row->pf_xml_name;
        $email = $row->pf_xml_email === \'\' ? "N/A" : $row->pf_xml_email;
        $steam = $row->pf_xml_steam_user === \'\'
                 ? "N/A"
                 : "Steam: {$row->pf_xml_steam_user}";
        $quote = $row->pf_xml_remark === \'\' ? "N/A" : $row->pf_xml_remark;
        $data  .= "<name>{$name}</name>";
        $data  .= "<email>{$email}</email>";
        $data  .= "<icq>{$steam}</icq>";
        $data  .= "<remark>{$quote}</remark>";
        $data  .= "</member>";
     }
   }
 }
如果需要在不同的时间查询数据库,只需调用$mydb = get_my_extenal_db() 每次需要时:连接将完成并只设置一次。

您可以在3.9之前的WordPress版本中使用此代码,当您更新到3.9时,它将不需要任何干预即可工作。但在3.9中,它将使用mysqli, 在以前的版本中mysql (这将导致使用PHP 5.5+发出不推荐的通知。

SO网友:Ziad

你读过这个吗:https://codex.wordpress.org/Custom_Queries

我认为这将帮助你理解基本知识,然后你可以从那里学习。

结束