Intereting Posts
Мне нужно вызвать do_action в моем плагине? Узнайте, есть ли доступное обновление ядра? Пользовательское навигационное меню не отображается Безопасное редактирование файлов ядра Импорт продуктов в WooCommerce с помощью CSV-страницы не открывается Использовать настройки заголовка или боковой панели для настроек заголовка? Невозможно передать переменную в базу данных Как запрашивать пользовательские сообщения с использованием динамической категории Переопределение иерархии шаблонов Можно ли отображать QUICK EDIT по умолчанию для всех сообщений на странице wp-admin / edit.php? Пользовательский контент для загрузки мультимедиа для вставки специального короткого кода сообщения Включая шаблон в короткие коды Динамически отображать значки шрифтов в виджетах Запретить img-тег в комментариях? Автоматически добавлять теги, если флажок установлен

Различные запросы к базе данных в function.php с использованием mysqli

Я пытаюсь подключиться к базе данных в function.php, используя mysqli. Кажется, что код работает нормально, когда он не находится в отдельном файле 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_prefix из моего файла конфигурации. Я не уверен, почему он не может получить к нему доступ. Кто угодно?

Solutions Collecting From Web of "Различные запросы к базе данных в function.php с использованием mysqli"

Начиная с версии 3.9 (которая будет выпущена в ближайшее время, фактически в бета-версии 2) WordPress будет использовать mysqli для подключения к базе данных (версии 3.9-версии используют mysql), чтобы вы могли реально использовать новые экземпляры wpdb и вспомогательную функцию для подключения значений externa из WordPress.

Я предлагаю настроить внешнюю базу данных с помощью констант в wp-config.php таким образом, вы уверены, что тери доступны в WordPress: вам нужно дублировать конфигурацию, но я не думаю, что это действительно проблема.

Поэтому в wp-config.php перед строкой

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

напишите вам внешний db config в константах:

 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 .

 // 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() каждый раз, когда вам нужно: соединение будет выполнено и настроено только один раз.

Вы можете использовать этот код в версиях WordPress до 3,9, и когда вы будете обновлены до 3,9, он будет работать без какого-либо вмешательства. Но в 3.9 он будет использовать mysqli , в предыдущей версии mysql (что приведет к устаревшим уведомлениям с использованием PHP 5.5+).

Вы прочитали это: https://codex.wordpress.org/Custom_Queries

Я думаю, что это поможет вам понять основы, тогда вы можете взять это оттуда.