私は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を取得していなかったようです。なぜそれがアクセスできないのか私にはわかりません。誰でも?
バージョン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+を使用する非推奨の通知を引き起こすでしょう)。
これを読みましたか? https://codex.wordpress.org/Custom_Queries
私はそれがあなたが基本を理解するのを助けると思います、そしてあなたはそこからそれを取ることができます。