|
|
|
|
-TRickSTeR- [16]
14 Марта 2016 20:08 | Нужна помощь "тыжпрограммистов".Допустим у меня есть сайт. На одной из страниц у меня подключен скрипт. jQuery.ajax({ url: "http://api.unit-online.ru/items?type=%D0%BE%D1%80%D1%83%D0%B6%D0%B8%D0%B5", dataType: "jsonp" }).done(function (result) { jQuery("#nonlinecount1").html(result.count); бла бла бла a = jQuery("#nonlinePPS").html(); jQuery("#nonlinePPS").html(a+ "" + result.items.name+" ["+result.items[i].level+"]"+"<a href=\"http://unit-online.ru/item?id="+result.items[i].id+"\"target=\"_blank\"> <img src=http://блаблабла/ico_info.gif></a><br>"); В левой части страницы мы видим вот это http://petromi.com/get/eah4F6960de220ea0011 Как видно из кода, при нажатии на значок информации мы попадаем на http://unit-online.ru/item?id= +id ствола, например http://unit-online.ru/item?id=79 Теперь допустим что в правой части страницы у меня есть фрейм, в котором лежит: <!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Инфомация о предмете</title> <style> #content { бла } .item-info { бла } .common-params { бла } .common-params div, .spec-params div { бла } .item-name { бла } .item-img { бла } </style> </head> <body> <script src="http://www.бла/js/jquery.js"></script> <table> бла бла </table> <script> $.ajax({ url: "http://api.unit-online.ru/item", dataType: "jsonp", data: { id: 771 } }).done(function (data) { if (data.status == "ok") { var item = data.item; var info = $("#content .item-info"); info.find(".item-name").text(item.name); info.find(".item-img").html('<img alt="" src="' + item.image + '">'); var params = $('<div>'); for (var i = 0; i < item.params.length; ++i) { if (item.params[i].name.lastIndexOf("Клетки", 0) === 0) { info.find(".spec-params").append( $('<div>').text(item.params[i].name + ": " + item.params[i].value) ).toggle(); } else { params.append($('<table>').append( $('<tr>').append( $('<td>').text(item.params[i].name)).append( $('<td class="value">').text(item.params[i].value)) ) ); } } info.find(".common-params").append(params); $("#content .progress").toggle(); info.toggle(); } else if (data.status == "fail") { $("#content").text("Отсутсвует информация о предмете с id = 771."); } }); </script> </body> </html> В этом фрейме мы видим что-то похожее на http://petromi.com/get/eah4kC71eeb920ea0311 , только в других цветах/шрифтах. Собственно, в чём мне нужна помощь? Хотелось бы чтобы ([i]при нажатии на значок информации мы попадаем на http://unit-online.ru/item?id= +id ствола, например http://unit-online.ru/item?id=79), а нужно чтобы при нажатии id предмета передавался в скрипт во фрейме $.ajax({ url: "http://api.unit-online.ru/item", dataType: "jsonp", data: { id: 771 } }).done(function (data) {. Если это вообще возможно, у меня не хватает знаний чтобы понять как это сделать. Если вы знаете как это сделать/ как сделать иначе, но с похожим эффектом, то пожалуйста напишите код/ дайте ссылку на литературу по данному вопросу/ на видео-урок. P.S. Не нужно писать типо "читай про фреймы и скрипты", я это и так пытаюсь делать, но либо я тупой, либо не там ищу. |
| |
|
|
-TRickSTeR- [16]
16 Марта 2016 14:41 | Re: Нужна помощь "тыжпрограммистов".http://petromi.com/get/eaf9nW66a9f2f0eb6b11 Убрал всё лишнее, $res = str_replace(array("'",'"','{','}',':',','),'',$res); перед форечом. В таким виде оно пригодно для записывания в таблицу или в каком должно быть?
учись теперь разбирать массив на PHP и для начала просто выводить нужные пары на экран в произвольной последовательности, Ну сейчас мы например знаем что элемент[0] и элемент [1] это пара, этого не хватит? |
| |
|
|
Da Boogie Woogie [14]
16 Марта 2016 15:10 | Re: Нужна помощь "тыжпрограммистов".1. это не моё и креху откуда такое знать тоже не понятно.не твоё? значит кто-то очень внимательно читает этот топик и копипастит, ибо откуда там вылез ID с именем dtext, который я придумал когда писал пост и подразумевал dynamic text? крех просто сложил 2+2 - разные ники, но одна копипаста в чатике... а ты документацию по foreach прочитал или только пролистал чужие примеры? кстати, ты всё ещё заливаешь файлы на сервер после каждой правки? чего бы не поставить себе тот же Denver или XAMPP? видимо чем проще код, тем лучше работаетя тебе чуть ли не на первой странице об этом писал всегда старайся сократить код Убрал всё лишнее, $res = str_replace(array("'",'"','{','}',':',','),'',$res); перед форечом. да прочти ты уже документацию по используемым тобой методам!! тебе не придётся убирать "лишнее", если ты при разборе массива укажешь, что все эти знаки являются разделителями между массивами, элементами массива и парами |
| |
|
|
-TRickSTeR- [16]
16 Марта 2016 18:20 | Re: Нужна помощь "тыжпрограммистов".для Da Boogie Woogie: я имел ввиду что спрашивать подобные вещи у всех на 201ом, также глупо как на овощном рынке у продавцов спрашивать про астрофизику. да прочти ты уже документацию по используемым тобой методам!!
тебе не придётся убирать "лишнее", если ты при разборе массива укажешь, что все эти знаки являются разделителями между массивами, элементами массива и парамиОколо 3 часов гугления и никакого результата=) по форечу всё самое полное что нашел Спойлер В PHP4 появился еще один специальный тип цикла - foreach. Данный цикл предназначен специально для перебора массивов.
Синтаксис цикла foreach выглядит следующим образом:
foreach (массив as $ключ=>$значение) команды; Здесь команды циклически выполняются для каждого элемента массива, при этом очередная пара ключ=>значение оказывается в переменных $ключ и $значение. Приведем пример работы цикла foreach:
<?php $names["Иванов"] = "Андрей"; $names["Петров"] = "Борис"; $names["Волков"] = "Сергей"; $names["Макаров"] = "Федор"; foreach ($names as $key => $value) { echo "<b>$value $key</b><br>"; } ?> Рассмотренный сценарий выводит:
Андрей Иванов Борис Петров Сергей Волков Федор Макаров У цикла foreach имеется и другая форма записи, которую следует применять, когда нас не интересует значение ключа очередного элемента. Выглядит она так:
foreach (массив as $значение) команды; В этом случае доступно лишь значение очередного элемента массива, но не его ключ. Это может быть полезно, например, для работы с массивами-списками:
<?php $names[] = "Андрей"; $names[] = "Борис"; $names[] = "Сергей"; $names[] = "Федор"; foreach ($names as $value) { echo "<b>$value</b><br>"; } ?> Внимание: Цикл foreach оперирует не исходным массивом, а его копией. Это означает, что любые изменения, которые вносятся в массив, не могут быть "видны" из тела цикла. Что позволяет, например, в качестве массива использовать не только переменную, но и результат работы какой-нибудь функции, возвращающей массив (в этом случае функция будет вызвана всего один раз - до начала цикла, а затем работа будет производиться с копией возвращенного значения). В книгах ему максимум 1 страница отводоится и информации там не больше. кстати, ты всё ещё заливаешь файлы на сервер после каждой правки?да там 3 кнопки всего нажать, сохранить -> загрузить -> обновить страницу. |
| |
|
|
Da Boogie Woogie [14]
16 Марта 2016 19:07 | Re: Нужна помощь "тыжпрограммистов".если честно, то я вообще не понимаю чем ты занимаешься!
а ещё у тебя какое-то расстройство внимания. ну ладно я не читаю твой код и особо не углубляюсь в проблему, отвечая только на прямые вопросы и стараюсь не комментировать твой код, но ты то! что ты вообще делаешь сейчас? на каком ты этапе?
ладно, сначала мы вроде бы как пытались получить список оружия, в котором сейчас 500 пар, потом ты как-то резко съехал на получение массивов по ID оружек, при этом нифига не закончив с первым списком.
ты почему-то проигнорировал моё замечание о том, что кроме curl есть и другие методы получить ответ от сервера юнита.
а ты вообще рассматривал внимательно то, что тебе возвращает сервер? вот если спросить у него список - что ты получаешь?
я заметил, что: 1. мы получаем не просто файл, а всего одну строку - очень длинную, но это одна строка. из чего состоит эта строка? из массива? не совсем так - там вложенные массивы ;) а на ID в парах ты обратил внимание? они ведь нифига не под ряд идут! и после этого ты удивляешься, что у тебя цикл не работает, в котором ты перебираешь цифры от 1 до 500? самого то тебя этот факт ни чуть не смущает?
ты проверял что отдаёт сервер, когда ты запрашиваешь ID, которой не существует? он всё равно отдаёт массив, в котором сообщает об ошибке, так что твоя конструкция с curl`ом не совсем корректная - нужна ещё и проверка на !!! тадаам !!! содержание ответа, т.е. мы практически всегда получаем от сервера статус 200, но если сервер вообще отвечает, мы никогда не получим от него 404, если ошиблись с ID вот в чём беда - при ошибке в твоём цикле, он не останавливается, а пытается обработать корректный ответ с массивом, который на самом деле является сообщением об ошибке.
удаляй всё, опять! вернёмся в самое начало.
нужно всё упростить! а потому имеет смысл запихнуть забирание с сервера массивов в функцию, которая будет получать от нас ЮРЛ на входе (у нас же два юрла - первый, это общий список с перечислением ID, второй, это юрл в котором меняется только цифра в конце) а на выходе эта функция будет возвращать строку, которую мы уже будем разбирать как массив, но это потом.
допустим, мы хотим работать с массивом, который будет в виде строки содержаться в переменной $string а функцию обзовём get_file()
тогда получать строку в переменную при помощи функции будем конструкцией: $string = get_file("http://api.unit-online.ru/items?type=оружие") // берём весь список оружия или $string = get_file("http://api.unit-online.ru/item?id=".$id) // берём одну оружку с номером из переменной $id, значение переменной будет браться из общего списка и подставляться в цикле, но это потом
дальше нужно изобразить какую нибудь очень простую и понятную конструкцию для получения строки по юрлу, при этом должна быть возможность впоследствии её "усилить" проверками, но это тоже из другой сказки, ближе к делу:
function get_file($url) { // на вход в функцию передаётся строка с ЮРЛом и тут же мы её значение присваиваем переменной $url $rf = fopen($url, "r"); // это дескриптор файла, чтобы с ним потом работать (читать и закрывать), тут fopen открывает $url только на чтение (ключик r) $fstring = fgets($rf); // читаем содержимое в строку при помощи fgets, по документации или читает до конца строки, или до числа байт, если это число указано втором параметром (нам это не нужно, потом параметр пропущен) fclose($rf); // заканчиваем работу с файлом по этому дескриптору - соединение с сервером юнита, открытое ранее будет закрыто и забыто. return $fstring; // возвращаем прочитанную строку тому, кто вызвал функцию }
пожалуйста, попробуй внимательно прочитать документацию по используемым тут фишкам, вникнуть и попробовать другие примеры, чтобы к вопросу чтения файлов с другого сервера больше не возвращаться.
ну а потом попробуем разбирать полученные строки и решать что с ними делать дальше |
| |
|
|
Da Boogie Woogie [14]
16 Марта 2016 19:16 | Re: Нужна помощь "тыжпрограммистов".про http:// не забудь! ну и для проверки: Спойлер <?php error_reporting(E_ALL);
function get_file($url) { $rf = fopen($url, "r"); $fstring = fgets($rf); fclose($rf); return $fstring; }
$id = "79"; echo get_file("http://api.unit-online.ru/item?id=".$id); //echo get_file("http://api.unit-online.ru/items?type=оружие"); ?> |
| |
|
|
-TRickSTeR- [16]
16 Марта 2016 22:28 | Re: Нужна помощь "тыжпрограммистов".а ещё у тебя какое-то расстройство внимания.Каждый человек, который со мной общался, хотя бы раз в жизни мне это говорил. ты почему-то проигнорировал моё замечание о том, что кроме curl есть и другие методы получить ответ от сервера юнита.Подумал типо позже гляну и записал себе на будущее. 1. мы получаем не просто файл, а всего одну строку - очень длинную, но это одна строка.Это я докумекал, а еще заметил что если обновлять http://api.unit-online.ru/item?id=79 , то возвращает в разном порядке, 3 варианта насчитал. а на ID в парах ты обратил внимание? они ведь нифига не под ряд идут! и после этого ты удивляешься, что у тебя цикл не работает, в котором ты перебираешь цифры от 1 до 500? самого то тебя этот факт ни чуть не смущает?Ты про тот, самый первый на jquery? тогда получать строку в переменную при помощи функции будем конструкцией: $string = get_file("api.unit-online.ru/items?type=оружие") // берём весь список оружия или $string = get_file("api.unit-online.ru/item?id=".$id) // берём одну оружку с номером из переменной $id, значение переменной будет браться из общего списка и подставляться в цикле, но это потомКруто придумано! Это с опытом приходит или такими рождаются?=) пожалуйста, попробуй внимательно прочитать документацию по используемым тут фишкам, вникнуть и попробовать другие примеры, чтобы к вопросу чтения файлов с другого сервера больше не возвращаться.Понял. Но это займёт время. Спойлер error_reporting(E_ALL);
function get_file($url) { $rf = fopen($url, "r"); $fstring = fgets($rf); fclose($rf); return $fstring; }
$id = "79"; echo get_file("http://api.unit-online.ru/item?id=".$id); //echo get_file("http://api.unit-online.ru/items?type=оружие"); ?> Всё отлично работает, второй вывод тоже. Чтож, займусь тем, что попробую внимательно прочитать документацию по используемым тут фишкам, вникнуть и попробовать другие примеры. Еще раз спасибо за все напутствия и помощь! |
| |
|
|
-TRickSTeR- [16]
17 Марта 2016 15:27 | Re: Нужна помощь "тыжпрограммистов".Вобщем, я прочитал разобрал и вникнул во всё что здесь написано http://i-vd.org.ru/books/php/files.shtml В качестве примера попробовал $rf = fopen($url, "r"); открыть на чтение и запись/только на запись. Итог - пустая страница. Моё понимание такое: http://api.unit-online.ru/... все файлы которые там есть разрешено только читать -> fopen ничего не откроет -> в $fstring ничего не запишется -> return $fstring; вернёт пустую строку -> видим чистую страницу. |
| |
|
|
-TRickSTeR- [16]
17 Марта 2016 15:47 | Re: Нужна помощь "тыжпрограммистов".тебе не придётся убирать "лишнее", если ты при разборе массива укажешь, что все эти знаки являются разделителями между массивами, элементами массива и парами Как это сделать? Бегло просмотрел все функции отсюда http://i-vd.org.ru/books/php/strings.shtml , особое внимание обращая на всё что связано с разбором строки, ничего не прояснилось. Пока что вопрос такой - в ту сторону ли я копаю? |
| |
|
|
Da Boogie Woogie [14]
17 Марта 2016 18:25 | Re: Нужна помощь "тыжпрограммистов".для -TRickSTeR-: Это я докумекал, а еще заметил что если обновлять api.unit-online.ru/item?id=79 , то возвращает в разном порядке, 3 варианта насчитал.
а это нас не коснётся никак, в каком порядке и в каком виде нам отдают данные вообще не интересно, ибо в справке по апи юнита явно написано, что это данные подготовленные в виде JSON, т.е. уже структурированные в массив...
Ты про тот, самый первый на jquery? про список всех пушек. например если спросить у сервера id=272, то получишь в ответ "+Shogun PR", а если id=273, то вылезет Headhunter-броня а можно и "status": "fail" получить, но это по прежнему будет корректный ответ JSON
Круто придумано! Это с опытом приходит или такими рождаются?=) понятия не имею. мне кажется, что я в детстве игрушки по такому же принципу в коробку складывал. вообще, это называется "рационализм", а если применительно к шахматам, то "думать на 3 хода вперёд" или просто "тактика" ;)
вникнул во всё что здесь написано попробуй читать ещё и официальную документацию: http://php.net/manual/ru/ref.filesystem.php тогда не станешь удивляться почему на запись нельзя чужой файл открыть. ну и про права в UNIX-системах тоже полезно знать
вернёт пустую строку -> видим чистую страницу. ага, а если просто добавить: $rf = fopen($url, "r") or die("упс! что-то пошло не так"); то о том, что файл не открылся ты узнаешь сразу, а скрипт не будет работать дальше и показывать тебе чистую строку, кстати, а с чего строка то чистая? где твой error_reporting(E_ALL);??? ведь должен при таком раскладе выругаться матом про "failed to open stream: HTTP wrapper does not support writeable connections in"
Пока что вопрос такой - в ту сторону ли я копаю? нет, не в ту. должен был копать в сторону массивов, а регулярки тебе рано ещё =)
ну вообще-то у тебя и так массив готовый в строке, так что вообще ничего с ним делать не нужно - начнёшь удалять разделители, сразу же получишь головняк из-за того, что не сможешь больше обращаться к элементам массива и придётся заново собирать из получившейся строки массив, а потом только в цикле обрабатывать его элементы.
у тебя же по fopen() приходит JSON, значит и курить нужно было про методы встроенного в PHP обработчика JSON то, что тебе нужно сейчас называется json_decode()
добавь в самый конец функции этот метод, вот так: return json_decode($fstring); теперь функция возвращает не текстовую строку, а совсем другой тип данных - многомерный массив с типом "stdClass Object"
echo теперь не работает, ибо не знает как выводить такие данные, теперь для отладки (чтобы видеть что там тебе возвращает функция) тебе нужен метод print_r() замени строку echo get_file("api.unit-online.ru/item?id=".$id); на print_r(get_file("http://api.unit-online.ru/item?id=".$id));
всё, у тебя есть массив, с ним можно работать. кроме изменения типа данных, json_decode() ещё и заменил для тебя коды символов на сами символы, при этом оставил текущую кодировку (UTF-8) - ай маладэц!!!
кури про массивы и обращение к их элементам и придумай как сделать проверку
кроме того полезно наверное посмотреть как что тебе возвращает gettype() в первом варианте функции и что после работы json_decode() ну и прочитать про "типы данных": http://php.net/manual/ru/language.types.php |
| |
|
|
Da Boogie Woogie [14]
17 Марта 2016 18:28 | Re: Нужна помощь "тыжпрограммистов".++ я писал: кури про массивы и обращение к их элементам и придумай как сделать проверку а выше писал, что нам могут вернуть и броню или массив с сообщением об ошибке.
так вот придумай как для начала проверить "не ошибка ли это?" а потом проверить какой тип амуниции нам вернули и если это "оружие", то продолжить работу скрипта, если нет, то пропустить этот ID или ещё что-то хитрое сделать |
| |
|
|
-TRickSTeR- [16]
17 Марта 2016 19:34 | Re: Нужна помощь "тыжпрограммистов".для Da Boogie Woogie: Такс, касательно этого ага, а если просто добавить: $rf = fopen($url, "r") or die("упс! что-то пошло не так"); то о том, что файл не открылся ты узнаешь сразу, а скрипт не будет работать дальше и показывать тебе чистую строку, кстати, а с чего строка то чистая? где твой error_reporting(E_ALL);??? ведь должен при таком раскладе выругаться матом про "failed to open stream: HTTP wrapper does not support writeable connections in"код Спойлер <?php
error_reporting(E_ALL);
function get_file($url) { $rf = fopen($url, "r+")or die("упс! что-то пошло не так"); $fstring = fgets($rf); fclose($rf); return $fstring; }
$id = "79"; echo get_file("http://api.unit-online.ru/item?id=".$id); //echo get_file("http://api.unit-online.ru/items?type=оружие"); ?> http://black-hearts.ru/aa1-4/ Это страница вп Подумал - может вп гад такой, что-то от меня прячет, но нет, без него тоже самое. http://black-hearts.ru/test/new4.php это не вп (добавил AddDefaultCharset utf-8 в .htaccess) И кстати!=) На первой написано "Соединение успешно установлено"
гавно твой гуглохром! опера сама сообразила, что с кодировкой что-то не так и исправила.Пока не отредактировал .htaccess опера показывала тоже самое что и говногуглохром;) |
| |
|
|
Da Boogie Woogie [14]
17 Марта 2016 19:46 | Re: Нужна помощь "тыжпрограммистов".по обеим ссылкам вижу одинаковую надпись про "упс!"
я тебе уже ответил ведь на это: это на сервере хостинга глобальна задана настройка, что документы нужно отдавать в cp2151 если ты сам не определяешь кодировку в теле HTML мета-тэгом или не указываешь инструкцию серверу через .htaccess для случаев когда в документе нет мета-тэга, то сервер выдаёт тебе cp2151 - смирись. когда дойдёшь до кодировок в mysql, то поймёшь, что это только цветочки |
| |
|
|
-TRickSTeR- [16]
17 Марта 2016 19:50 | Re: Нужна помощь "тыжпрограммистов".для Da Boogie Woogie: я про то что этого нету должен при таком раскладе выругаться матом про "failed to open stream: HTTP wrapper does not support writeable connections in" |
| |
|
|
Da Boogie Woogie [14]
17 Марта 2016 20:08 | Re: Нужна помощь "тыжпрограммистов".для -TRickSTeR-: а почему нету то? строка error_reporting(E_ALL); есть в начале скрипта сразу после <?php ?
значит это глобальная настройка сервера хостинга не даёт показывать ошибки, что может быть связано с безопасность - в таких ошибках показываются пути к файлам, чем могут воспользоваться хацкеры.
потому и нужно вести разработку и отладку на своём локальном сервере, а не в продакшене |
| |
|
|
NightAssasin [16]
17 Марта 2016 21:49 | Re: Нужна помощь "тыжпрограммистов".Спойлер Значит пишем курсовую, ну, платить ясно - никто не хочет, все хотят сами написать... Игорь, у меня вот тут не работает, а здесь почему ошибка, а это вообще что такое и так много много раз... Результат: полное отвращение к чтению чужого кода и штук 15 написанных курсовых собственноручно, вместо одной ))
Не пытайтесь найти ошибки и исправить/подсказать в чужом коде - это неблагодарное дело) |
| |
|
|
Da Boogie Woogie [14]
17 Марта 2016 22:18 | Re: Нужна помощь "тыжпрограммистов".для NightAssasin: а вот, если заметил из обсуждения, я и не читаю его код, только наискосок если и через раз есть у меня подозрение, что он тут не единственный студент и кто-то тихо и внимательно штудирует этот топик, так что по концовке у нас будет больше одного нового каталога оружия |
| |
|
|
Карабас [4]
17 Марта 2016 23:13 | Re: Нужна помощь "тыжпрограммистов".Разве Бурзумом и Пареньком не все уже придумано касательно Юнита? Или студенты препарируют его в исследовательских целях? |
| |
|
|
Da Boogie Woogie [14]
17 Марта 2016 23:15 | Re: Нужна помощь "тыжпрограммистов".для Карабас: всегда можно придумать что-то новое ну или просто сделать значительно удобнее ;)
кроме того, если изучаешь язык, то проще всего учиться на конкретной задаче, а не разбирать чужие примеры |
| |
|
|
NightAssasin [16]
17 Марта 2016 23:44 | Re: Нужна помощь "тыжпрограммистов".для Карабас: А как же я Ведь мой скрипт на распределение хар-ик, перков копировали все кому не попадя на свои сайты, а некоторые умельцы, даже брали деньги за его копирование А если серьёзно, огромный респект br0, он единственный, кто спросил разрешения скопировать скрипт |
| |
|
|
Da Boogie Woogie [14]
17 Марта 2016 23:58 | Re: Нужна помощь "тыжпрограммистов".для NightAssasin: а не надо было всё оставлять в JS ;) все формулы надо прятать на сервер и доставать оттуда только с проверкой "откуда запрос" |
| |
|
|
|