Posted March 3, 20196 yr Добрый день. Подскажите как мне сделать так чтобы IPS после покупки определенного продукта выполнил php скрипт? Или как сделать так чтобы после покупки IPS внёс лицензионный ключ в другую таблицу? По умолчанию он вносит ключ в таблицу _nexus_licensekeys
March 3, 20196 yr Author Или помогите написать скрипт для внесения данных в другую БД вот в этот метод public function save() { if ( !$this->key ) { do { $this->key = $this->generate(); } while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) ); } return parent::save(); }
March 3, 20196 yr В какую таблицу нужно внести данные? Создать новую запись в таблице или обновить существующую?
March 3, 20196 yr Если нужно добавить новую запись в определённую таблицу, то добавьте это после условия: if ( !\IPS\Db::i()->select( 'COUNT(*)', 'your_table', array( 'license_key=?', $this->key ) )->first() ) { \IPS\Db::i()->insert( 'your_table', array( 'license_key' => $this->key ) ); } Замените your_table на название своей таблицы, а license_key на название колонки с ключами. Так же добавьте другие данные (помимо license_key) в insert.
March 3, 20196 yr А чем таблица форума не устраивает? Можно создать mysql триггер таблицы при inserte чтобы данные копировались в другую таблицы. wanted, достаточно будет в конце условия добавить \IPS\Db::i()->insert( 'your_table', array( 'license_key' => $this->key ) ); Только насколько я понял ТС нужно вставить еще и в другую бд. Тут либо создать другое подключение, либо если у mysql пользователя есть доступ к этой бд, использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table
March 3, 20196 yr Author 1 час назад, siv1987 сказал: А чем таблица форума не устраивает? Можно создать mysql триггер таблицы при inserte чтобы данные копировались в другую таблицы. wanted, достаточно будет в конце условия добавить \IPS\Db::i()->insert( 'your_table', array( 'license_key' => $this->key ) ); Только насколько я понял ТС нужно вставить еще и в другую бд. Тут либо создать другое подключение, либо если у mysql пользователя есть доступ к этой бд, использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table Совершенно верно, мне надо скопировать ключ в другую БД 1 час назад, siv1987 сказал: А чем таблица форума не устраивает? Можно создать mysql триггер таблицы при inserte чтобы данные копировались в другую таблицы. wanted, достаточно будет в конце условия добавить \IPS\Db::i()->insert( 'your_table', array( 'license_key' => $this->key ) ); Только насколько я понял ТС нужно вставить еще и в другую бд. Тут либо создать другое подключение, либо если у mysql пользователя есть доступ к этой бд, использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table Очень напрягает что на этом форуме нельзя редактировать свой текст. Дело в том что в том php я не могу почему то создать новое подключение использую $mysqli_key = new mysqli("****", "****", "****", "****"); 1 час назад, siv1987 сказал: А чем таблица форума не устраивает? Можно создать mysql триггер таблицы при inserte чтобы данные копировались в другую таблицы. wanted, достаточно будет в конце условия добавить \IPS\Db::i()->insert( 'your_table', array( 'license_key' => $this->key ) ); Только насколько я понял ТС нужно вставить еще и в другую бд. Тут либо создать другое подключение, либо если у mysql пользователя есть доступ к этой бд, использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table Может быть ты в курсе где искать "использовать нативный метод \IPS\Db::i()->query с указанием таблицы другой базы данных INSERT INTO other_db.your_table"
March 3, 20196 yr mysql пользователь который использует форум имеет доступ к этой базе данных? Если да, то запрос можно выполнить от текущего подключения. Если нет то http://ipbskins.ru/forum/topic15779.html#entry105651 /* create external connect */ \IPS\Db::i( 'remote_database_name', array( 'sql_host' => 'host', 'sql_user' => 'user', 'sql_pass' => 'pass', 'sql_database' => 'database', ) ); \IPS\Db::i('remote_database_name')->insert('you_table', array('license_key' => $this->key));
March 3, 20196 yr Author 2 минуты назад, siv1987 сказал: mysql пользователь который использует форум имеет доступ к этой базе данных? Если да, то запрос можно выполнить от текущего подключения. Если нет то http://ipbskins.ru/forum/topic15779.html#entry105651 /* create external connect */ \IPS\Db::i( 'remote_database_name', array( 'sql_host' => 'host', 'sql_user' => 'user', 'sql_pass' => 'pass', 'sql_database' => 'database', ) ); \IPS\Db::i('remote_database_name')->insert('you_table', array('license_key' => $this->key)); Не совсем понял вопрос про пользователя который имеет доступ но я думаю что нет? Мне надо создать новое подключение. А куда код вставлять? Вот весь код файла LicenseKey.php если я всё плавильно понял в конце функция save() отвечает за кол-во ключей которое купили <?php /** * @brief License Key Model * @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a> * @copyright (c) Invision Power Services, Inc. * @license https://www.invisioncommunity.com/legal/standards/ * @package Invision Community * @subpackage Nexus * @since 30 Apr 2014 */ namespace IPS\nexus\Purchase; /* To prevent PHP errors (extending class does not exist) revealing path */ if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) ) { header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' ); exit; } /** * License Key Model */ abstract class _LicenseKey extends \IPS\Patterns\ActiveRecord { /** * License Key Types * * @return array */ public static function licenseKeyTypes() { return array( 'Standard' => 'IPS\nexus\Purchase\LicenseKey\Standard', 'Mdfive' => 'IPS\nexus\Purchase\LicenseKey\Mdfive', ); } /** * @brief Multiton Store */ protected static $multitons; /** * @brief Database Table */ public static $databaseTable = 'nexus_licensekeys'; /** * @brief Database Prefix */ public static $databasePrefix = 'lkey_'; /** * @brief [ActiveRecord] Database ID Column */ public static $databaseColumnId = 'key'; /** * @brief [ActiveRecord] Database ID Fields */ protected static $databaseIdFields = array( 'lkey_purchase' ); /** * @brief [ActiveRecord] Multiton Map */ protected static $multitonMap = array(); /** * Construct ActiveRecord from database row * * @param array $data Row from database table * @param bool $updateMultitonStoreIfExists Replace current object in multiton store if it already exists there? * @return static */ public static function constructFromData( $data, $updateMultitonStoreIfExists = TRUE ) { $classname = 'IPS\nexus\Purchase\LicenseKey\\' . mb_ucfirst( $data['lkey_type'] ); /* Initiate an object */ $obj = new $classname; $obj->_new = FALSE; /* Import data */ foreach ( $data as $k => $v ) { if( static::$databasePrefix AND mb_strpos( $k, static::$databasePrefix ) === 0 ) { $k = \substr( $k, \strlen( static::$databasePrefix ) ); } $obj->_data[ $k ] = $v; } $obj->changed = array(); /* Init */ if ( method_exists( $obj, 'init' ) ) { $obj->init(); } /* Return */ return $obj; } /** * Set Default Values * * @return void */ public function setDefaultValues() { $exploded = explode( '\\', \get_class( $this ) ); $this->type = mb_strtolower( array_pop( $exploded ) ); $this->active = TRUE; $this->uses = 0; $this->activate_data = array(); $this->generated = new \IPS\DateTime; } /** * Set purchase * * @param \IPS\nexus\Purchase $purchase The purchase * @return void */ public function set_purchase( \IPS\nexus\Purchase $purchase ) { $this->_data['purchase'] = $purchase->id; $this->_data['member'] = $purchase->member->member_id; } /** * Set purchase * * @return \IPS\nexus\Purchase */ public function get_purchase() { return \IPS\nexus\Purchase::load( $this->_data['purchase'] ); } /** * Set activate data * * @param array $data The data * @return void */ public function set_activate_data( array $data ) { $this->_data['activate_data'] = json_encode( $data ); } /** * Set activate data * * @return \IPS\DateTime */ public function get_activate_data() { return json_decode( $this->_data['activate_data'], TRUE ); } /** * Set generated time * * @param \IPS\DateTime $generated Generated time * @return void */ public function set_generated( \IPS\DateTime $generated ) { $this->_data['generated'] = $generated->getTimestamp(); } /** * Set generated time * * @return \IPS\DateTime */ public function get_generated() { return \IPS\DateTime::ts( $this->_data['generated'] ); } /** * Save Changed Columns * * @return void */ public function save() { if ( !$this->key ) { do { $this->key = $this->generate(); } while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) ); } return parent::save(); } }
March 3, 20196 yr 1 минуту назад, Lafko сказал: Не совсем понял вопрос про пользователя который имеет доступ но я думаю что нет? Мне надо создать новое подключение. Выполнить запрос SHOW DATABASES в админцентр форума > Support > SQL Toolbox Или посмотреть в phpmyadmin 4 минуты назад, Lafko сказал: Вот весь код файла LicenseKey.php На какой хрен засорять тему, он у меня и так есть. Вставьте после while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) );
March 3, 20196 yr Author 3 минуты назад, siv1987 сказал: Выполнить запрос SHOW DATABASES в админцентр форума > Support > SQL Toolbox Или посмотреть в phpmyadmin Есть ли доступ у форума к базе данных в которую мне надо внести ключ? Нет нету. Соединение надо создать заново Вот так работать будет? public function save() { \IPS\Db::i( 'remote_database_name', array( 'sql_host' => 'host', 'sql_user' => 'user', 'sql_pass' => 'pass', 'sql_database' => 'database', ) ); if ( !$this->key ) { do { $this->key = $this->generate(); } while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) ); while ( \count( \IPS\Db::i('remote_database_name')->insert('you_table', array('license_key' => $this->key) ) ) ); } return parent::save(); }
March 3, 20196 yr SHOW TABLES FROM your_databases Пишите сами не копируйте запросы, чтото форум ломает при копирование текст SHOW DATABASES
March 3, 20196 yr Author 2 минуты назад, siv1987 сказал: SHOW TABLES FROM your_databases Пишите сами не копируйте запросы, чтото форум ломает при копирование текст SHOW DATABASES Нету
March 3, 20196 yr 4 минуты назад, Lafko сказал: Вот так работать будет? Нет. if ( !$this->key ) { do { $this->key = $this->generate(); } while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) ); /* create external connect */ \IPS\Db::i( 'remote_database_name', array( 'sql_host' => 'host', 'sql_user' => 'user', 'sql_pass' => 'pass', 'sql_database' => 'database', ) ); \IPS\Db::i('remote_database_name')->insert('your_table', array('license_key' => $this->key)); }
March 3, 20196 yr Author 3 минуты назад, siv1987 сказал: Нет. if ( !$this->key ) { do { $this->key = $this->generate(); } while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) ); /* create external connect */ \IPS\Db::i( 'remote_database_name', array( 'sql_host' => 'host', 'sql_user' => 'user', 'sql_pass' => 'pass', 'sql_database' => 'database', ) ); \IPS\Db::i('remote_database_name')->insert('your_table', array('license_key' => $this->key)); } Великолепно, работает. Огромное спасибо!
March 3, 20196 yr Author siv1987 И ещё 2 вопроса. При переносе ключа мне в это-же поле ещё надо добавить данные подскажи пожалуйста как это сделать. Я думал вот так \IPS\Db::i('remote_database_name')->insert('your_table', array('license_key' => $this->key, 'ban' => 1));
March 3, 20196 yr В таблицу? \IPS\Db::i('remote_database_name')->insert('your_table', array( 'license_key' => $this->key, 'field2' => 'value2', 'field3' => 'value2', ));
March 3, 20196 yr Author 15 минут назад, siv1987 сказал: В таблицу? \IPS\Db::i('remote_database_name')->insert('your_table', array( 'license_key' => $this->key, 'field2' => 'value2', 'field3' => 'value2', )); И второй вопрос, как мне получить из другой таблицы форума количество оставшихся дней подписки? SELECT * FROM `_nexus_purchases`.`ps_expire` WHERE `ps_member` LIKE '$purchase->member->member_id' Только вот $purchase->member->member_id - не получает id пользователя
March 3, 20196 yr Не цитируйте пожалуйста длинные сообщения или сообщения с кодом, читать такие партянки очень не удобно. В $purchase что? Смотрели?
March 3, 20196 yr Author 4 минуты назад, siv1987 сказал: В $purchase что? Смотрели? public function set_purchase( \IPS\nexus\Purchase $purchase ) { $this->_data['purchase'] = $purchase->id; $this->_data['member'] = $purchase->member->member_id; }
March 3, 20196 yr Да не в коде, а в переменной. Где вы хотите получить, там и смотрите. $purchase->expire Если в том же месте где находится код для вставки в другую бд, то скорее всего так $purchase = $this->get_purchase(); $purchase->expire;
March 3, 20196 yr Author 10 часов назад, siv1987 сказал: Да не в коде, а в переменной. Где вы хотите получить, там и смотрите. $purchase->expire Если в том же месте где находится код для вставки в другую бд, то скорее всего так $purchase = $this->get_purchase(); $purchase->expire; 9 часов назад, WaNted сказал: Если так же в методе save(), то $this->purchase->expire Нет, не работает
March 3, 20196 yr Author Помогите пожалуйста переделать запрос так чтобы он брал 2 нужных мне значения из другой таблицы делал вычитание и присваивал результат в переменную \IPS\Db::i()->select( '*', 'nexus_purchases', $where, 'ps_start DESC', $limit ), 'IPS\nexus\Purchase' ) as $purchase ) Из таблицы _nexus_purchases взять значение ps_expire - ps_start где в таблице xxxxxxx_nexus_licensekeys.lkey_purchase как xxxxxxx_nexus_purchases.ps_id
March 4, 20196 yr Вы можете нормально описать что в итоге Вам нужно? Зачем Вы трогаете запрос который относится к \IPS\nexus\Purchase::tree()? Покажите весь Ваш код (именно Ваш, а не весь класс целиком). Если все Ваши изменения находятся в классе IPS\nexus\Purchase\LicenseKey, то не нужно посылать никакие запросы, информация о покупке текущего ключа находится в переменной $this->purchase. Нужное Вам значение (ps_expire - ps_start) можно получить так: $this->purchase->expire - $this->purchase->start.
March 4, 20196 yr Author 1 час назад, WaNted сказал: Вы можете нормально описать что в итоге Вам нужно? Зачем Вы трогаете запрос который относится к \IPS\nexus\Purchase::tree()? Покажите весь Ваш код (именно Ваш, а не весь класс целиком). Если все Ваши изменения находятся в классе IPS\nexus\Purchase\LicenseKey, то не нужно посылать никакие запросы, информация о покупке текущего ключа находится в переменной $this->purchase. Нужное Вам значение (ps_expire - ps_start) можно получить так: $this->purchase->expire - $this->purchase->start. Вот что мне надо "Из таблицы _nexus_purchases взять значение ps_expire - ps_start где в таблице xxxxxxx_nexus_licensekeys.lkey_purchase как xxxxxxx_nexus_purchases.ps_id" Выше я привел пример нужного мне запроса т.к. я не знаю как его составить.$this->purchase->expire - $this->purchase->start - не работают, а точнее в них пустые значения если я пытаюсь их использовать из метода save Я не понимаю какой именно код вы хотите увидеть. public function save() { if ( !$this->key ) { do { $this->key = $this->generate(); } while ( \count( \IPS\Db::i()->select( '*', 'nexus_licensekeys', array( 'lkey_key=?', $this->key ) ) ) ); /* create external connect */ \IPS\Db::i( 'xxxxxxx_nexus_purchases', array( 'sql_host' => '***', 'sql_user' => '***', 'sql_pass' => '***', 'sql_database' => '***', ) ); $purchase = $this->get_purchase(); \IPS\Db::i('_nexus_purchases')->insert('_nexus_purchases', array( 'ps_k' => $this->key, 'ps_a' => '1', 'Res' => $purchase->member->member_id, 'ps_time_k' => $this->purchase->expire, /* вот сюда не передаеться нужное мне значение */ )); } return parent::save(); }
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.