it-swarm.com.de

Unterschiedliche Datenbankabfrage in function.php mit mysqli

Ich versuche mit mysqli eine Verbindung zu einer Datenbank in der function.php herzustellen. Der Code scheint gut zu laufen, wenn er sich nicht in einer separaten PHP-Datei befindet, nicht in WordPress. Aber wenn ich es auf WordPress ausführe, erhalte ich die Meldung "Verbindung fehlgeschlagen: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer sie aktiv abgelehnt hat." Ich bin nicht sicher, ob WordPress dies verhindert. Kann mich jemand über dieses Problem aufklären?

Der Code wird unten angegeben, falls erforderlich.

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;

Vielen Dank für Ihre Zeit,

AKTUALISIEREN

Anscheinend hat meine $ query das $ table_prefix nicht aus meiner Konfigurationsdatei abgerufen. Ich bin mir nicht sicher, warum es nicht darauf zugreifen kann. Jemand?

1
madmanali93

Seit Version 3.9 (die in Kürze veröffentlicht wird, tatsächlich in Beta 2) verwendet WordPress mysqli, um eine Verbindung zur Datenbank herzustellen (3.9-Versionen verwenden mysql), sodass Sie tatsächlich neue wpdb-Instanzen und Hilfsfunktionen verwenden können, um externe Werte aus WordPress zu verbinden.

Was ich vorschlage, ist die Konfiguration einer externen Datenbank unter Verwendung von Konstanten in wp-config.php. Auf diese Weise sind Sie sicher, dass diese in WordPress verfügbar sind: Sie müssen Ihre Konfiguration duplizieren, aber ich denke nicht, dass es wirklich ein Problem ist.

Also in wp-config.php vor der Zeile

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

schreiben Sie Ihre externe Datenbankkonfiguration in Konstanten:

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

Danach schreiben Sie in functions.php eine Funktion, die eine neue wpdb-Instanz initialisiert und zurückgibt

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

Jetzt können Sie Ihre externe Datenbank in WordPress way verwenden.

// 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 );

Danach können Sie einfach die abgerufenen Daten verwenden. Standardmäßig gibt wpdb::get_results() ein Array von Objekten zurück, wobei jede Zeile ein Objekt ist, dessen Eigenschaften die Werte für Zeilenspalten sind:

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

Wenn Sie db zu unterschiedlichen Zeiten abfragen müssen, rufen Sie einfach jedes Mal $mydb = get_my_extenal_db() auf: Die Verbindung wird nur einmal hergestellt und eingerichtet.

Sie können diesen Code in WordPress-Versionen vor 3.9 verwenden, und wenn Sie auf 3.9 aktualisieren, funktioniert er ohne Intervention. In 3.9 wird jedoch mysqli verwendet, in der vorherigen Version mysql (was zu veralteten Benachrichtigungen mit PHP 5.5+ führt).

4
gmazzap

Haben Sie dies gelesen: https://codex.wordpress.org/Custom_Queries

Ich denke, es wird Ihnen helfen, die Grundlagen zu verstehen, dann können Sie es von dort nehmen.

0
Ziad