web-dev-qa-db-fra.com

Requête de base de données différente dans function.php avec mysqli

J'essaie de me connecter à une base de données dans le fichier function.php en utilisant mysqli. Le code semble fonctionner correctement lorsqu'il ne se trouve pas sur un fichier php séparé, pas sur wordpress. Mais lorsque je l'exécute sur wordpress, je reçois le message "Connexion échouée: aucune connexion n'a pu être établie car la machine cible l'a activement refusée". Je ne suis pas sûr si wordpress l'empêche. Alors quelqu'un peut-il m'éclairer sur ce problème?

Le code est fourni ci-dessous si nécessaire.

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;

Merci pour votre temps,

METTRE À JOUR

On dirait que ma requête $ n'obtient pas le préfixe $ table de mon fichier de configuration. Je ne sais pas pourquoi il ne peut pas y accéder. N'importe qui?

1
madmanali93

Depuis la version 3.9 (bientôt disponible en version bêta 2), WordPress utilisera mysqli pour se connecter à la base de données (les versions 3.9 utilisent mysql) afin que vous puissiez réellement utiliser les nouvelles instances wpdb et la fonction d'assistance pour connecter les valeurs externes à partir de WordPress.

Ce que je suggère est de configurer la base de données externe en utilisant les constantes dans wp-config.php de cette façon, vous êtes sûr qu'elles sont disponibles dans WordPress: vous devez dupliquer votre configuration, mais je ne pense pas que ce soit vraiment un problème.

Donc, dans wp-config.php, avant la ligne

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

vous écrivez une configuration de base de données externe en constantes:

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

Ensuite, dans functions.php, écrivez une fonction qui initialise et renvoie une nouvelle instance de 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;
}

Vous êtes maintenant prêt à utiliser votre base de données externe dans comme dans 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 );

Après cela, vous pouvez simplement utiliser les données récupérées. Par défaut, wpdb::get_results() renvoie un tableau d'objets, où chaque ligne est un objet dont les propriétés sont les valeurs des colonnes de lignes:

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

Si vous avez besoin d'interroger la base de données à différents moments, appelez simplement $mydb = get_my_extenal_db() à chaque fois que vous en avez besoin: la connexion sera établie et configurée une seule fois.

Vous pouvez utiliser ce code dans les versions de WordPress antérieures à 3.9 et lors de la mise à jour à 3.9, il fonctionnera sans aucune intervention. Mais en 3.9, il utilisera mysqli, dans la version précédente mysql (cela entraînerait des notifications déconseillées utilisant PHP 5.5+).

4
gmazzap

Avez-vous lu ceci: https://codex.wordpress.org/Custom_Queries

Je pense que cela vous aidera à comprendre les bases, alors vous pourrez le prendre à partir de là.

0
Ziad