Вся причина в том, что ты не понимаешь, что делаешь. Не понимаешь как работает их пример и в чем отличие в том, что у них и в том, что хочешь сделать ты. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="http://sms.ru/sms/send" method="get"> <input name="api_id" type="hidden" value="FFFFFFFF-00000-4004-FC98-F12BDA445E67"> <input name="to" type="hidden" value="7951200313"> <input name="text" type="text"> <input type="submit"> </form> </body> </html>
Меня одного смущает, что вместо кнопки в форме простая ссылка? Форма отправляется по нажатию кнопки, не ссылки, т.е. данные в массиве $_POST появятся только после отправки формы, чего тут не происходит, поэтому логичный результат пустое поле.
<?php $host = '127.0.0.1'; $port = 29300; function socketsend($data, $ip,$port) { if(!@$sock=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) { throw new Exception("Не удалось связать сокет"); exit(); } socket_connect($sock,$ip,$port); socket_set_block($sock); socket_send($sock, $data, 8192, 0); socket_recv($sock, $buf, 8192, 0); socket_set_nonblock($sock); socket_close($sock); return $buf; } function cuint($data) { if($data < 128) return pack('C', $data); else if($data < 16384) return pack('n', ($data | 0x8000)); else if($data < 536870912) return pack('N', ($data | 0xC0000000)); return pack('C', 224) . pack('N', $data); } function PackString($data) { $data = iconv("UTF-8", "UTF-16LE", $data); return cuint(strlen($data)).$data; } function PackOctet($data) { $data = pack('H*', $data); return cuint(strlen($data)).$data; } function PackLong($data) { $left = 0xffffffff00000000; $right = 0x00000000ffffffff; $l = ($data & $left) >> 32; $r = $data & $right; $res = pack('N*', $l, $r); return $res; } function send($roleid, $title, $context, $id, $count, $max_count, $octet, $proctype, $host = '127.0.0.1', $port = 29100) { $data = pack('N*', rand(9999, 99999), 32, 3); $data .= PackLong($roleid); $data .= PackString($title); $data .= PackString($context); $data .= pack('N2n4', $id, 0, 0, $count, 0, $max_count); $data .= PackOctet($octet); $data .= pack('N*', $proctype, 0, 0, 0, 0, 0) $data = cuint(4214).cuint(strlen($Packet)).$Packet; socketsend($data, $host, $port); } send(4106, 'Отправка сообщения.', 'Сообщение отправленно из PHP.', 33660, 50, 50, '', 0); Не проверял этот вариант, а в таком работает. <html> <head> <title>Выдача награды.</title> <meta charset="utf-8"> </head> <body> <form action="" method="post" class="code" name="data"> <ul> <li>ID:</li> <li><input name="roleid" type="text"/></li> <li>ID предмета</li> <li><input name="id" type="text"/></li> <li>Октет</li> <li><input name="data" type="text"/></li> <li>Привязка</li> <li><input name="proctype" type="text"/></li> <li><input type="submit" name="send" value="Получить"></li> </ul> </form> </body> </html> <?php error_reporting(E_ALL); ini_set("display_errors", 1); use Engine\Components\Protocol; use Engine\Components\Socket; function __autoload($class) { $class = str_replace('\\', '/', $class) . '.php'; include_once $class; } if(isset($_POST['send'])) { $inventory = [ 'id' => 'int', 'post' => 'int', 'reserved1' => 'short', 'count' => 'short', 'reserved2' => 'short', 'max_count' => 'short', 'data' => 'octets', 'proctype' => 'int', 'client_size' => 'int', 'expire_date' => 'int', 'guid1' => 'int', 'guid2' => 'int', ]; $item = [ 'id' => $_POST['id'], 'post' => 0, 'reserved1' => 0, 'count' => 50, 'reserved2' => 0, 'max_count' => 50, 'data' => $_POST['data'], 'proctype' => $_POST['proctype'], 'client_size' => 0, 'expire_date' => 0, 'guid1' => 0, 'guid2' => 0, ]; $socket = new Socket(AF_INET, SOCK_STREAM, SOL_TCP); $socket->connect('127.0.0.1', 29100); $chat = new Protocol($socket); var_dump($chat->Write(4214, [ 'tid' => rand(9999, 99999), 'sysid' => 32, 'sys_type' => 3, 'receiver' => $_POST['roleid'], 'title' => 'Отправка сообщения.', 'context' => 'Сообщение отправленно из PHP.', 'attach_obj' => $item, 'attach_money' => 100000000, ], [ 'tid' => 'int', 'sysid' => 'int', 'sys_type' => 'byte', 'receiver' => 'long', 'title' => 'string', 'context' => 'string', 'attach_obj' => $inventory, 'attach_money' => 'int', ], true)->Read(['retcode' => 'int', 'tid' => 'int'])); }
Ради практики на js набросал код. Мб есть решения и получше, но цель была по попрактиковаться. [IMG] P.S. Сейчас просто генерируется случайное значение по которому показывает на какой цвет пал выбор. Думаю не будет проблемой переделать под себя.
http://stackoverflow.com/questions/19409574/converting-int-to-float-double оно? нет, не оно... <? $a = 1050253722; $b = $a/3600; $b = floatval($b); echo number_format($b, 2, '.', ''); ?> должно быть 0.3, но получается [IMG] Просто нет слов.... http://codepad.org/mtoFrntb --- добавлено: 14 июн 2015 в 14:09 --- что то перекурил все маны по пхп, но не смог найти решение. В общем нужно вот такое, но на пхп: [IMG] т.е. из int32 в флоат. в пхп кучу методов перепробовал с числами, но бестолку... будут у кого идеи? unpack('f', pack('V', 1050253722))); вообще ничего не выводит. Просто нет слов: http://codepad.org/mtoFrntb
что то перекурил все маны по пхп, но не смог найти решение. В общем нужно вот такое, но на пхп: [IMG] т.е. из int32 в флоат. в пхп кучу методов перепробовал с числами, но бестолку... будут у кого идеи? unpack('f', pack('V', 1050253722));
Против добавления в чс. ЛК myweb многие ставят и продают друг другу за деньги. Это удобно для обеих сторон. Так как когда ты качаешь лк с какого либо форума не факт что там не будет дыр и багов. А когда у кого-то перекупаешь чистое лк либо модифицированное(с пофикшенными багами), то можешь спросить за баги, дыры и прочее если они там будут. А так как лк слито в шару, то кто угодно по сути может делать с ним то что он захочет. А о такой чудесной вещи как Авторское право не слышали? Тот факт, что ЛК было слито в шару не дает вам права его использовать, а тем более продавать. Почему Карим написал в ЧС конкретно на него? Да потому что к нему обратили за установкой сказав, что его ЛК уже купили у другого человека.
за BL. ну поглядим что к чему, я лично в вебмани знаком с арбитрами, когда получал аттестат продавца лично ездил в Москву, сидели пивко пили. Получилось знакомство, если что могу им отписать, что меня добавили в арбитры того спора. ок, попрошу ссылочку у ТС на иск На каком основании ты станешь арбитром? [IMG] Источник: https://arbitrage.webmoney.ru/doc2.htm
Интересует совокупное время нахождения перса онлайн. Есть ли такой параметр? Если есть, то в какой структуре? В GRoleBase есть время создания и время последнего входа. Не то. GRoleStatus->time_used
__set используется только в activeRecord (и то при создании сущности) и в Io (для успрощения работы с некоторыми методами). Я про строку 102 в Io где ты позволяешь установить любое свойство, даже те, которых нет. И про строку 75, где ты позволяешь, так же, получить любое свойство. Чтобы этот класс только наследовался. Какой в этом смысл? Вызвать метод из вне ты все равно позволяешь используя __get, но напрямую вызвать нет. Я к тому, что магия __get дает дополнительную нагрузку при вызове, но в данном случаи не несет никакой пользы. Уменьшить зависимость между компонентами. Чтобы можно было "безболезненно" вырезать компонент, или же использовать его отдельно от велосипеда без изменений (или с их минимальным количеством). Бесполезная затея. Тот же модуль работы с базой зависит от модуля Caching. Данная идея только принесет тебе проблемы в дальнейшем. Например, у тебя конфиги вшиты в сами модули и для того, чтобы сделать два проекта на твоем framework'е необходимо его скопировать. Т.е. дважды использовать его не получится т.к. у тебя настройки всего приложения зависят от настроек framework'а и отдельно от него не меняются. Там все так и задумано, чтобы можно было менять только некоторые параметры запроса, все остальное будет взято с конфига. Ниже по коду есть Extended HTTP request - Http::eRequest , который устанавливает опции через curl_setopt_array() public function request( $url_of_target = '', $return_page = null, $request_type = null, $post_data = null, $connect_time_otut = null, $resp_time_out = null, $cookie_file = null, $follow_location = null, $referer = null ) { if (! function_exists('curl_init')) { throw new \Exception('Error! On your hosting is not set extension <strong>cUrl</strong>'); } $this->loadConfig(); if (trim($url_of_target) == '') { throw new \Exception('Incorrect <strong>$url_of_target</strong>'); } if (! isset($connect_time_otut)) { $connect_time_otut = (int)$this->config['curl_options']['connect_timeout']; } if (! isset($resp_time_out)) { $resp_time_out = (int)$this->config['curl_options']['response_timeout']; } if (! isset($return_page)) { $return_page = $this->config['curl_options']['return_page']; } if (! isset($request_type)) { $request_type = strtoupper($this->config['curl_options']['request_type']); } else { $request_type = strtoupper(trim($request_type)); } if (! isset($cookie_file) || trim($cookie_file) == '') { $cookie_file = __DIR__ . DS . 'tmp' . DS . 'cookies' . DS . $this->config['curl_options']['cookie_file']; } else { $cookie_file = __DIR__ . DS . 'tmp' . DS . 'cookies' . DS . $cookie_file; } if (! isset($follow_location)) { $follow_location = $this->config['curl_options']['follow_location']; } $ch = curl_init(); $options[CURLOPT_URL] = $url_of_target; $options[CURLOPT_CUSTOMREQUEST] = $request_type; if (strpos(strtolower(trim($url_of_target)), 'https') == 0) { $options[CURLOPT_SSL_VERIFYPEER] = 0; $options[CURLOPT_SSL_VERIFYHOST] = 0; } if ($return_page) { $options[CURLOPT_RETURNTRANSFER] = 1; } else { $options[CURLOPT_NOBODY] = 1; } $options[CURLOPT_CONNECTTIMEOUT] = (int)$connect_time_otut; if ($this->config['curl_options']['set_user_agent']) { $options[CURLOPT_USERAGENT] = $this->config['curl_options']['user_agent']; } $options[CURLOPT_ENCODING] = ''; $options[CURLOPT_HEADER] = 0; $options[CURLOPT_TIMEOUT] = $resp_time_out; if ($follow_location) { $options[CURLOPT_FOLLOWLOCATION] = 1; $options[CURLOPT_MAXREDIRS] = (int)$this->config['curl_options']['max_redirs']; if ($this->config['curl_options']['auto_referer']) { $options[CURLOPT_AUTOREFERER] = true; } } if (isset($post_data)) { $options[CURLOPT_POST] = 1; $options[CURLOPT_POSTFIELDS] = $post_data; } if ($this->config['curl_options']['save_cookies']) { $options[CURLOPT_COOKIE] = 1; $options[CURLOPT_COOKIEJAR] = $cookie_file . '_jar.txt'; $options[CURLOPT_COOKIEFILE] = $cookie_file . '_file.txt'; } if (isset($referer)) { $options[CURLOPT_REFERER] = trim($referer); } curl_setopt_array($ch, $options); $content = curl_exec($ch); $data = curl_getinfo($ch); $data['err_code'] = curl_errno($ch); $data['err_msg'] = curl_error($ch); $data['content'] = $content; curl_close($ch); return $data; } Ну и как я говорил еще много чего есть, если смотреть глубже.
Хрень очередная. Громоздкий велосипед, у которого руль к спицам прикреплен. Согласен для данной задачи использовать framework не самая лучшая идея. Причем не документированный framework в котором кроме автора никто не разбирается. Ну и то, что я увидел бегло глянув код. Переход по ссылке http://auto-donate.dev/index.php/main/index/ выкинет 404. В классе Foundation, все методы protected. Зачем? Там же в методе __get на строке 638, лучше было бы использовать method_exists. В __get стоит проверять существует ли свойство или нет, иначе php генерирует Notice, естественно о будет показан, если включено отображение ошибок. Так же позволять устанавливать любое свойство через __set, не есть хорошая идея. Конфиги в различных папках, причем их прилично. В Http::request, функция curl_setopt будет вызвана минимум 7 раз, если не ошибаюсь. Для таких случаев есть: curl_setopt_array. Во многих файлах используется пространство имен MvcBox, которого у тебя нет. Зато есть одноименный класс MvcBox. Сомневаюсь, что ты через use MvcBox подключаешь этот класса, т.к. его ты везде вызываешь из глобального пространства. Конструктор класс не может ничего возвращать. Структура проекта оставляет желать лучшего. Конфиги, как я уже говорил разбросаны. Часть файлов, которые я бы отнес к framework'у в папке bootstrap. PHPDoc не самым лучшим образом сделаны, у меня IDE ругалась не переставая. IDE много на что еще ругается, но не вижу смысла все тут описывать и не на все стоит обращать внимание. И напоследок анализ файла Database.php: [IMG] P.S. Это не упреки, а просто направления для работы.
Название раздела "вопросник PW" подразумевает, что здесь не задают вопросы, касающиеся языков программирования. Не знаете язык - гуглите "пхп для чайников" Смотрим 1й топик и не ругаемся. big endian Ну и вот! Чего и требовалось давно... Но почему-то у всех просто руки отваливались от такого простого вопроса. А какой смысл вам помогать? Вы не пользуетесь поиском, есть темы в которых расписано это все. Вы ничего не вынесли из прошлых тем, и в этой Алекс уже говорил про порядок байт. И самое главное вы взяли готовый код для получения персонажей онлайн и не смогли его использовать. Ну и какой в этом смысл?
Ответ содержится в вопросе - достаточно указать ключ в параметрах запроса. Также непонятно, чем является ключ. ID записи или ID номера клана, а может вообще другое? Если не ошибаюсь, то ключ для FactionInfo является id клана, для других таблиц другие ключи.
и там просто мастер и мембер указаны будто как векторы оба. И где я писал про то, что master vector? member - vector, т.е. roleid и role читаются в цикле.
P.S. Больше не могу на это смотреть. Если бы я разбирался хорошо в парсинге хекс данных, то и темы бы этой не было. Собственно данный форум и создан для того, чтоб люди могли получать конструктивную помощь на свои вопросы и желательно с примерами для ускорения процесса обучения. К сожалению самые продвинутые в этом плане люди тут, теперь используют данный форум не совсем по прямому назначению, осуществлять поддержку тех, кто только начинает постигать такие вещи, для них форум теперь что то вроде торговой площадки своих разработок и поделиться фрагментом кода, класса и т.п. для них одно и тоже, как и позволить залезть к себе в карман... жаль конечно, что DEV форум становится торговой площадкой. Насчет структуры я примерно понял, но пока плохо представляю практический пример такого такого рода, писать класс, это опять же нужно 100% понимать методы парсинга хекс данных, увы я пока в данном направлении вообще плохо продвинулся, единственное, что пока могу пытаться разобрать хекс методом тыка, как я это и делаю сейчас, хоть и понимаю, что с точки зрения тех, кто лучше понимает в этом деле, это по меньшей мере мазохизм, но... если нет конструктивных ответов, то и приходится, если мало информации на этот счет - страдать мазохизмом... Вы издеваетесь? Это уже не первый пакет, на котором вы обучаетесь. Данный пакет вам был назван месяца три назад, если не больше. В соседней теме вам был показана его структура и опкод, сказано, что не стоит тупо пропускать байты. Вам была названа структура для чтения данных о кланах. И извините конечно, но это уже не первая подобная тема где вы не желаете искать информацию и у меня складывается впечатление, что вы просто ждете что вам дадут готовое. К сожалению самые продвинутые в этом плане люди тут, теперь используют данный форум не совсем по прямому назначению, осуществлять поддержку тех, кто только начинает постигать такие вещи, для них форум теперь что то вроде торговой площадки своих разработок и поделиться фрагментом кода, класса и т.п. для них одно и тоже, как и позволить залезть к себе в карман... жаль конечно, что DEV форум становится торговой площадкой. А какой смысл мне показывать вам свой код? Почему я должен давать его вам бесплатно? Напомню, что вам тут никто ничем не обязан. И уж извините, но в этих двух темах разжевано уже дальше некуда.
вроде почти каждый байт декодировал (кроме 7 байтов до цикла), но на 144 все равно ломается парсинг данных. информация о кланах - vector vector<GNET::RawKeyValue, std::allocator<GNET::RawKeyValue> > values; После того как ты прочитал количество элементов в массиве: $clancount = unpack( "c", substr( $buf, $start, 1 ) ); Хоть конечно нужно понять, что длина всегда cuint, ну ладно. Дальше идет сам массив (vector), который представляет из себя key - octets, value - octets. Эти 7 байт получаются из 1 байт (cuint) - количество кланов, 1 байт - длина key (cuint), 4 байта сам key и 1 байт - длина value (cuint). Сам value из себя представляет: 'fid'=>'int', 'name'=>'string', 'level'=>'byte', 'master'=>[ 'roleid'=>'int', 'role'=>'byte' ], 'member'=>[ 'roleid'=>'int', 'role'=>'byte' ], 'announce'=>'string', 'sysinfo'=>'octets' member - vector, т.е. roleid и role читаются в цикле. Если не ошибаюсь, вроде так. P.S. Больше не могу на это смотреть.
Хочешь сказать, что в целом при обработке хекса с 1.5.1 у меня ошибок нет, просто в 1.4.4 придется немного изменить перемещение по байтам. Разная структура пакетов 144 и 151? Я не смотрел код, так как не шарю в php, но по результату парсинга видно, что первый клан читается нормально, а остальные - нет. Это означает, что длина описания одного клана разная, поэтому начиная со второго клана идёт сдвиг, который и ломает всё. Можно наугад менять кол-во "пропускаемых ненужных байт", скорее всего получится Но это только мои предположения но странно, что в 151 без проблем парсится, хоть и ожидалось, что структура пакетов в 151 может быть более мудренная,чем в 144. Все же интересно увидеть конструктивный ответ, который поможет понять как же решить проблему? Конструктивный ответ? Брось ты эту затею, не твое это. По теме. Структура не менялась, т.е. она идентична для всех версий. $start = $start+11; //точка отсчета и пропускаем 11 байтов (пока не понял для чего они) $start = $start+7; //точка отсчета и пропускаем 7 байтов (пока не понял для чего они) Не знаю что это? Ну и черт с ним пропущу. Посмотри структуру пакет FactionInfo и все вопросы должны пропасть. Я привел что из себя представляет пакет DBRawRead в прошлой теме, но ты как пропускал мифические цифры, которые меняться, так и пропускаешь.
$start = 13+7; Какие мифические цифры. Данный пакет представляет из себя: opcode - cuint длина - cuint max - int retcode - int handle - octets информация о кланах - vector Ладно 13 понятно откуда взялись, а вот 7? "\x00\x00\x00\x00"; А это что?
а почему table = 'rolename' ? Потому что это пример, которым я получаю id и name персонажей на сервере.
просто попробовал составить пакет, на основе данного хекс кода запроса $Data = cuint(3055)."\xff\xff\xff\xff\x80\x08\x72\x6f\x6c\x65\x6e\x61\x6d\x65\x00\x00"; в итоге ответ не получаю вообще никакой. А длина где? Да запроса на получение, без opcode и длины пакета.
Имена участников (разделяйте запятой).