Posted 3 марта, 20195 yr comment_155828 Добрый день. Подскажите как мне сделать так чтобы IPS после покупки определенного продукта выполнил php скрипт? Или как сделать так чтобы после покупки IPS внёс лицензионный ключ в другую таблицу? По умолчанию он вносит ключ в таблицу _nexus_licensekeys
3 марта, 20195 yr Author comment_155829 Или помогите написать скрипт для внесения данных в другую БД вот в этот метод 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(); }
3 марта, 20195 yr comment_155830 В какую таблицу нужно внести данные? Создать новую запись в таблице или обновить существующую?
3 марта, 20195 yr comment_155831 Если нужно добавить новую запись в определённую таблицу, то добавьте это после условия: 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.
3 марта, 20195 yr comment_155833 А чем таблица форума не устраивает? Можно создать 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
3 марта, 20195 yr Author comment_155834 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"
3 марта, 20195 yr comment_155835 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));
3 марта, 20195 yr Author comment_155836 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(); } }
3 марта, 20195 yr comment_155837 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 ) ) ) );
3 марта, 20195 yr Author comment_155838 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(); }
3 марта, 20195 yr comment_155839 SHOW TABLES FROM your_databases Пишите сами не копируйте запросы, чтото форум ломает при копирование текст SHOW DATABASES
3 марта, 20195 yr Author comment_155840 2 минуты назад, siv1987 сказал: SHOW TABLES FROM your_databases Пишите сами не копируйте запросы, чтото форум ломает при копирование текст SHOW DATABASES Нету
3 марта, 20195 yr comment_155841 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)); }
3 марта, 20195 yr Author comment_155842 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)); } Великолепно, работает. Огромное спасибо!
3 марта, 20195 yr Author comment_155843 siv1987 И ещё 2 вопроса. При переносе ключа мне в это-же поле ещё надо добавить данные подскажи пожалуйста как это сделать. Я думал вот так \IPS\Db::i('remote_database_name')->insert('your_table', array('license_key' => $this->key, 'ban' => 1));
3 марта, 20195 yr comment_155844 В таблицу? \IPS\Db::i('remote_database_name')->insert('your_table', array( 'license_key' => $this->key, 'field2' => 'value2', 'field3' => 'value2', ));
3 марта, 20195 yr Author comment_155845 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 пользователя
3 марта, 20195 yr comment_155846 Не цитируйте пожалуйста длинные сообщения или сообщения с кодом, читать такие партянки очень не удобно. В $purchase что? Смотрели?
3 марта, 20195 yr Author comment_155847 4 минуты назад, siv1987 сказал: В $purchase что? Смотрели? public function set_purchase( \IPS\nexus\Purchase $purchase ) { $this->_data['purchase'] = $purchase->id; $this->_data['member'] = $purchase->member->member_id; }
3 марта, 20195 yr comment_155848 Да не в коде, а в переменной. Где вы хотите получить, там и смотрите. $purchase->expire Если в том же месте где находится код для вставки в другую бд, то скорее всего так $purchase = $this->get_purchase(); $purchase->expire;
3 марта, 20195 yr Author comment_155859 10 часов назад, siv1987 сказал: Да не в коде, а в переменной. Где вы хотите получить, там и смотрите. $purchase->expire Если в том же месте где находится код для вставки в другую бд, то скорее всего так $purchase = $this->get_purchase(); $purchase->expire; 9 часов назад, WaNted сказал: Если так же в методе save(), то $this->purchase->expire Нет, не работает
3 марта, 20195 yr Author comment_155860 Помогите пожалуйста переделать запрос так чтобы он брал 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
4 марта, 20195 yr comment_155864 Вы можете нормально описать что в итоге Вам нужно? Зачем Вы трогаете запрос который относится к \IPS\nexus\Purchase::tree()? Покажите весь Ваш код (именно Ваш, а не весь класс целиком). Если все Ваши изменения находятся в классе IPS\nexus\Purchase\LicenseKey, то не нужно посылать никакие запросы, информация о покупке текущего ключа находится в переменной $this->purchase. Нужное Вам значение (ps_expire - ps_start) можно получить так: $this->purchase->expire - $this->purchase->start.
4 марта, 20195 yr Author comment_155866 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.