web-dev-qa-db-ja.com

Mysqliを使用したfunction.phpでの異なるデータベースクエリ

私はfunction.phpでmysqliを使ってデータベースに接続しようとしています。ワードプレスではなく別のphpファイルにない場合、コードは問題なく動作するようです。しかし、ワードプレスで実行すると、「接続に失敗しました。ターゲットマシンが積極的に拒否したため、接続できませんでした」と表示されます。ワードプレスがこれを防いでいるのかどうかは定かではない。それで、誰かがこの問題について私を啓発することができますか?

必要に応じてコードを以下に示します。

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/[email protected]</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_prefixを取得していなかったようです。なぜそれがアクセスできないのか私にはわかりません。誰でも?

1
madmanali93

バージョン3.9以降(まもなくベータ2でリリースされる予定)、WordPressはmysqliを使用してデータベースに接続します(3.9-バージョンはmysqlを使用)ので、実際には新しいwpdbインスタンスとヘルパー関数を使用してWordPressから外部値を接続できます。

私が提案しているのは、wp-config.phpの定数を使って外部データベースを設定することです。これはWordPressで利用できることを確認してください。

wp-config.phpでは、行の前に

/* That's all, stop editing! Happy blogging. */

外部データベース設定を定数で書いてください。

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_' );

その後、functions.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;
}

これで、 WordPressの方法 で外部データベースを使用する準備が整いました。

// 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>";
     }
   }
 }

Dbに異なる時間を問い合わせる必要がある場合は、必要になるたびに$mydb = get_my_extenal_db()を呼び出してください。接続は1回だけ行われ、セットアップされます。

あなたは3.9より前のWordPressバージョンでこのコードを使うことができます、そして3.9にアップデートするときそれはどんな介入なしでも動作します。しかし、3.9ではそれはmysqliを、以前のバージョンではmysqlを使用します(それはPHP 5.5+を使用する非推奨の通知を引き起こすでしょう)。

4
gmazzap

これを読みましたか? https://codex.wordpress.org/Custom_Queries

私はそれがあなたが基本を理解するのを助けると思います、そしてあなたはそこからそれを取ることができます。

0
Ziad