sergozuben
Гость
|
|
« : 11-08-2023 20:41 » |
|
Доброго времени суток парни! Хотел спросить у знающих совета, как написать рабочий код на Perl для добавления соответственно узлов с данными в готовый xml файл. Просмотрел много примеров, но проблема остается... Ни РНР не хочет работать, ни то что я написал на Perl... Язык серьезный и очень много непонятного, особенно то, почему он не запускается на хостинге, на локальном сервере при нажатии на кнопку формы SUBMIT, только запускается в приложении Perl Express 2.4.5 и генерирует пустой или наполненный не теми данными, которые я ему пытаюсь передать... суть примера простая как три копейки переменные текстовых полей: $login $password $user $e-mail <?xml version="1.0" encoding= "UTF-8" ?> <users> <user id1="Иванов" password= "148xxxxxx" e-mail=" xxx@xxx.com"></user id1> <user id2="Петров" password= "447yyyyyy" e-mail=" yyy@yyy.com"></user id2> <user id3="Сидоров" password= "671zzzzzz" e-mail=" zzz@zzz.com"></user id3> </users> # В виде такой структуры, где последующие данные (строка <userid+1=....) должны из формы добавляться в этот XML файл... Я не могу создать 100 %-но работающий код, чтобы с уверенностью начать его тестировать как на локальном сервере,, так и на хостинге. Мне до сих пор пока не понятно, делать скрипту расширение .рl или .cgi, чтобы он запускался и создавал или редактировал этот xml на хостинге в нужной мне папке... Если кто откликнется помочь - очень жду... Заранее благодарю за подсказку... (я выбрал для этой задачи Perl, хотя не важно какой язык, лишь бы он работал на любом хостинге)
|
|
|
Записан
|
|
|
|
sergozuben
Гость
|
|
« Ответ #1 : 11-08-2023 20:46 » |
|
Например у меня есть такой простой скриптик, котрый как не изменяй, никак не хочет считывать внешние переменые которые я ему отправляю методом пост, но он охотно создает файлик с тем, что в нем уже есть...
#!c:/Server/perl/bin/perl my $file= "joke.xml"; my $login= '$login'; my $password= '$password'; my $user= 'user'; open(FILE,">$file"); print FILE ("login\n","user\n","password\n"); close(FILE); print "xml File Created successfully\n";
есть также на РНР скриптик, который красиво написан и ничего на хостинге создавать не собирается...
<?php $dom = new domDocument("1.0", "utf-8"); // Создаём XML-документ версии 1.0 с кодировкой utf-8 $root = $dom->createElement("users"); // Создаём корневой элемент $dom->appendChild($root); $users = $_POST['user']; // Имена пользователей $logins = $_POST['login']; // Логины пользователей $passwords = $_POST['pass']; // Пароли пользователей for($i = 0; $i < count($logins); $i++) { $id = $i + 1; // id-пользователя $user = $dom->createElement("user"); // Создаём узел "user" $user->setAttribute("id", $id); // Устанавливаем атрибут "id" у узла "user" $login = $dom->createElement("login", $logins[$i]); // Создаём узел "login" с текстом внутри $password = $dom->createElement("password", $passwords[$i]); // Создаём узел "password" с текстом внутри $user->appendChild($login); // Добавляем в узел "user" узел "login" $user->appendChild($password);// Добавляем в узел "user" узел "password" $root->appendChild($user); // Добавляем в корневой узел "users" узел "user" } $dom->save("users.xml"); // Сохраняем полученный XML-документ в файл ?>
|
|
|
Записан
|
|
|
|
sergozuben
Гость
|
|
« Ответ #2 : 11-08-2023 21:05 » |
|
Необязательно парсить документ как XML, и чудно с ним чудить, достаточно чтобы скрипт вставлял в предпоследнюю строку, перед закрывающим тегом, именно тот узел, какой будет в переменной поля ввода. Идея такая. У меня флеш-форма, текстовые поля со своими именами/переменными, создана предварительно строка для вставки в файл, например: "<user id3=" + "$имя_переменной_1.text" + "$имя_переменной_2.text" + "$имя_переменной_3.text" + "</user id1>" Методом POST передаю скрипту на хостинге, (страница формы также находится на том же хостинге), скрипт вносит строку в файл и сохраняет его. Тут необязательно логин и пароль, тут может быть любые данные в строковом виде, потому что флеш очень хорошо читает из XML... Есть у кого-то оригинальные идеи на этот счет? Заранее спасибо. P.S. Хотел делать на питоне, оказалось не все хостинги поддерживают питоню но CGI скрипты такие как Perl должны...
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #3 : 12-08-2023 08:05 » |
|
есть также на РНР скриптик, который красиво написан и ничего на хостинге создавать не собирается...
потому что с ошибкой
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
sergozuben
Гость
|
|
« Ответ #4 : 12-08-2023 18:37 » |
|
в каком месте если не секрет?...
|
|
|
Записан
|
|
|
|
sergozuben
Гость
|
|
« Ответ #5 : 12-08-2023 18:40 » |
|
Он мог бы и пустой файл создать, но не хочет... Скрипт этот я взял на каком-то известном сайте, где все все знают и всех учат за деньги...
|
|
« Последнее редактирование: 12-08-2023 18:42 от sergozuben »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #6 : 13-08-2023 00:14 » |
|
my $login= '$login'; Неужели это "подставление методом POST"? Это просто присвоение переменной строки '$login'. Нужно следовать интерфейсу, который предоставляет сервер. Perl Express — не сервер, а просто IDE. В самом примитивном случае будет использован интерфейс CGI: основные данные передаются через переменные окружения (напр., $ENV{QUERY_STRING}), "данные POST" еще не интерпретированы и их надо считать из STDIN, а ответ, предваряемый заголовком, отправить в STDOUT. Чтобы не разбирать руками используют готовые модули с metacpan.org. Более распространенный интерфейс — PSGI. А вообще, если пытаться писать на "серьезном языке", то стоит начинать с обучающей литературы. Например, Learning Perl и Perl Programming. Обе книги доступны в сети в переводе.
|
|
« Последнее редактирование: 13-08-2023 00:32 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sergozuben
Гость
|
|
« Ответ #7 : 13-08-2023 13:47 » |
|
Очень признателен за ответ, начав изучать Perl в рамках CGI ровно 6 дней назад, как только я решил с ним работать в определенных задачах, в первую очередь я купил разные книги, разных авторов в формате PDF и читаю...изучаю... однако очень сложно опираться на то, что в них изложено, так как многие файлы сделаны при помощи OCR, как я понимаю и в кодах присутствуют опечатки. Perl очень требовательный язык и не прощает таких ошибок. Меня интересует практическая сторона дела и в данном случае я намерен найти решение, оперевшись, также и на ваш совет... Подскажите, какая IDE лучше всего подходит для разработки? Я установил Strawberry 5.32.1.1 и ActivePerl 5.24 плюс Perl_Express 2.4.5 (У меня Win_7x64), Апач 24
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #8 : 13-08-2023 17:47 » |
|
Не стоит изучать по устаревшим книгам. Видел я этот Perl CGI еще в начале нулевых, бесполезная книга. Кроме перечисленных мной двух, есть еще Modern Perl. Все, только эти три книги актуальны, все остальное безнадежно устарело. Опытные разработчики пользуются документацией к модулям, читают код, ну и гуглят. Есть чат "Modern::Perl" в телеге, но с таким уровнем не советую соваться туда, заклюют. Есть еще чаты людей, изгнанных из "Modern::Perl", никогда там не участвовал.
Active Perl — мертв, не поддерживается. Используй Strawberry Perl. Это все, что есть под винду. Сами разработчики Perl в 99.99% случаев пишут под Linux.
Если хочется попроще и побыстрее поиграться в web, то смотри Mojo::Lite и все, на что его доки будут ссылаться. И про XML забудь, этим только джависты пользуются. В ходу чаще JSON. Кто-то любит YAML. Но сперва надо учить язык. И для web надо изучать сам протокол HTTP. См. rfc2616.
|
|
« Последнее редактирование: 13-08-2023 17:50 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sergozuben
Гость
|
|
« Ответ #9 : 14-08-2023 20:02 » |
|
Благодарю за наводку... В веб я начинал играться еще в 2000 году, в 2010 забросил. Теперь начинаю снова... Многое что изменилось за то время... Раньше любые скрипты на РНР работали на хостингах, теперь много ограничений... В данный момент мне нужен рабочий скрипт ("движок") для процесса записи в файл и создания директорий. поэтому я выбрал Perl... Поищу этот Modern Perl...
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #10 : 15-08-2023 09:21 » |
|
теперь много ограничений...
Бред
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
|
|
« Ответ #11 : 15-08-2023 09:43 » |
|
PHP всегда настраивали так, чтобы нельзя было навредить другим клиентам shared hosting. В нынешних реалиях проще арендовать небольшой выделенный сервер (он виртуальный) и делать там, что хочешь. Правда, это уже требует знаний и опыта администрирования.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sergozuben
Гость
|
|
« Ответ #12 : 16-08-2023 23:07 » |
|
У меня есть хостинг на котором у меня CMS работает, но только ее скрипты функционируют. дополнительные скрипты на нем не хотят работать. Перейду на другой. там хоть что-то можно свое поставить типа джанго итд. Однако задача у меня другая, создать скрипт-движок для изменения конфига в xml файле. Допустим есть форма, которая имеет редактируемые поля ввода, где установлены значения/названия для определенных элементов. Эти первичные данные находятся в XML формате. Я редактирую данные (например название продукта или цену) и нажимаю кнопку сохранить. После этого (возьмем случай на 50 строк) весь текст в формате XML либо в URL кодировке отправляется скрипту, тот его принимает и сохраняет в файл с расширением XML и кодировке UTF-8.
Примерно по такому сценарию.
Ниже я сделал "железку" тестировщик скрипта, где могу отправлять из двух полей ввода две строки произвольных данных серверному скрипту на РНР и Perl. В верхнем окне я получаю ответ от сервера.
На картинке показано что скрипт кривой и никак не обработан сервером, тот вернул ответ в виде текста из РНР файла (тестировалось соединение с базой на локальном сервере )
|
|
« Последнее редактирование: 16-08-2023 23:19 от sergozuben »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #13 : 16-08-2023 23:57 » |
|
Отправлять все строки из страницы в скрипт при только одной отредактированной — не лучшее решение. Если строку можно как-то идентифицировать (уникальное поле, уникальная комбинация полей, номер строки), лучше послать только ее. Скрипту надо прочесть весь файл, заменить одну строку и записать назад. Надо бы подходящий модуль для этого найти: https://metacpan.org/search?size=20&q=xmlГолова кругом. И все такое старое. Но, сдается мне, проще вот этот: https://metacpan.org/pod/Mojo::DOM
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sergozuben
Гость
|
|
« Ответ #14 : 17-08-2023 00:05 » |
|
При попытке создать XML на РНР выдает ошибку по функции count()
(....На скрине во вложении видно....)
Наверное автор скрипта не так решил массив или цикл задать для переменных (в РНР я не очень)
|
|
« Последнее редактирование: 17-08-2023 00:08 от sergozuben »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #15 : 17-08-2023 01:53 » |
|
$logins = $_POST['login']; // Логины пользователей
for($i = 0; $i < count($logins); $i++) {
Наверно, если читать текст ошибки, он хочет сказать, что $logins — не массив. Чтобы PHP сделал тут массив, нужно передавать login в урле так: login[]=...
|
|
« Последнее редактирование: 17-08-2023 01:55 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #16 : 17-08-2023 08:27 » |
|
чистый бред начните работать с простыми формами.
Зачем там массив не понятно
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
RXL
|
|
« Ответ #17 : 17-08-2023 10:57 » |
|
Слав, ну, основательно изучать желание не видно, в итоге получается как всегда. Если человек ценит свое время, он просто наймет кого-то для написания программы, что займет много меньше времени. Если хочется помучиться, то никто не запрещает.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
sergozuben
Гость
|
|
« Ответ #18 : 17-08-2023 21:58 » |
|
Данный скрипт принимает URL кодированную строку Похожая схема скрипта у известного программиста Гурского, автора многих практических обучающих книг.(пример передачи данных из флеш-формы скрипту для последующей отправки на мыло, до 2010 года это точно работало... сейчас не работает...) Пример скрипта от еще одного предпринимателя, автора вышеуказанного кода: <?php /* вставьте ваш е-мейл адрес сюда */ $mymail = " edapskov@yandex.ru"; /* проверяем-отправляем */ if(isset($_POST['sender']) && isset($_POST['email']) && isset($_POST['theme']) && isset($_POST['letter'])){ $sender = $_POST['sender']; $email = $_POST['email']; $theme = $_POST['theme']; $letter = $_POST['letter']; $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: ".$sender." <".$email.">\r\n"; $success = mail($mymail, $theme, $letter, $headers); if($success) { echo "status=ok&mes=Сообщение успешно отправлено."; } else { echo "status=no&mes=Не удалось отправить сообщение."; } }else{ echo "status=no&mes=Отсутствуют необходимые данные."; } ?> Так что ошибка не в том, что переменная $login которая принимает значение из глобального массива $_POST, (где хранится значение Логин полученное из флеш-формы), ошибка в другом месте, и я догадываюсь где, если немножко порезать тот код, переписать, то все получится... А вам советую зарабатывать в тех местах, где реально пахнет деньгами, а не такими задачками частного порядка как у меня...
|
|
« Последнее редактирование: 17-08-2023 22:15 от sergozuben »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #19 : 18-08-2023 07:36 » |
|
Данный скрипт принимает URL кодированную строку Похожая схема скрипта у известного программиста Гурского, автора многих практических обучающих книг.(пример передачи данных из флеш-формы скрипту для последующей отправки на мыло, до 2010 года это точно работало... сейчас не работает...) Пример скрипта от еще одного предпринимателя, автора вышеуказанного кода: <?php /* вставьте ваш е-мейл адрес сюда */ $mymail = " edapskov@yandex.ru"; /* проверяем-отправляем */ if(isset($_POST['sender']) && isset($_POST['email']) && isset($_POST['theme']) && isset($_POST['letter'])){ $sender = $_POST['sender']; $email = $_POST['email']; $theme = $_POST['theme']; $letter = $_POST['letter']; $headers = "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: ".$sender." <".$email.">\r\n"; $success = mail($mymail, $theme, $letter, $headers); if($success) { echo "status=ok&mes=Сообщение успешно отправлено."; } else { echo "status=no&mes=Не удалось отправить сообщение."; } }else{ echo "status=no&mes=Отсутствуют необходимые данные."; } ?> Так что ошибка не в том, что переменная $login которая принимает значение из глобального массива $_POST, (где хранится значение Логин полученное из флеш-формы), ошибка в другом месте, и я догадываюсь где, если немножко порезать тот код, переписать, то все получится... А вам советую зарабатывать в тех местах, где реально пахнет деньгами, а не такими задачками частного порядка как у меня... не поверите if (isset($_POST['sender'],$_POST['email'],$_POST['theme'],$_POST['letter']){ так что тут не про зарабатывать.. И от вас денег не просили, а просто ткнули мордойлица куда смотреть и куда бежать
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Люсь
|
|
« Ответ #20 : 18-08-2023 21:12 » |
|
Просто чувак не вкурил, куда попал
|
|
|
Записан
|
Посторонним просьба не беспокоить! ------------------------------------------------- O (I) Rh +
|
|
|
sergozuben
Гость
|
|
« Ответ #21 : 19-08-2023 02:11 » |
|
Вот, господа программисты, чайник по РНР (то бишь я) взял ножницы, напильник, и почикал требуемый код, внесс свои идеи...
Скрипт на локальном хосте выдает XML в виде некрасивой, неформатированной строки, но первая задача решена...
Дальше любой может посредством изменения и добавления переменных регулировать состав XML, названия узлов и атрибутов... и пользовать...
<?php $dom = new domDocument("1.0", "UTF-8"); // Создаём XML-документ версии 1.0 с кодировкой utf-8 $root = $dom->createElement("users"); // Создаём корневой элемент $dom->appendChild($root);
$names = $_POST['user']; // Имена пользователей $logins = $_POST['login']; // Логины пользователей $passwords = $_POST['password']; // Пароли пользователей $date = date("d/m/Y_H:i", time() + 3 * 60 * 60);
$user = $dom->createElement("user"); // Создаём узел "user" $user->setAttribute("date", $date); // Устанавливаем атрибут "id" у узла "user" $user->setAttribute("name", $names); // Устанавливаем атрибут "name" у узла "user" $login = $dom->createElement("login", $logins); // Создаём узел "login" с текстом внутри $password = $dom->createElement("password", $passwords); // Создаём узел "password" с текстом внутри $user->appendChild($login); // Добавляем в узел "user" узел "login" $user->appendChild($password);// Добавляем в узел "user" узел "password" $root->appendChild($user); // Добавляем в корневой узел "users" узел "user"
$dom->save("../users.xml"); // Сохраняем полученный XML-документ в файл ?>
выходной файл получается такой:
?xml version="1.0" encoding="UTF-8"?> <users><user date="19/08/2023_05:01" name="Иванов"><login>Ваня</login><password>47егпоу3</password></user></users>
Если господа знающие программисты кинут подсказку, как мне отформатировать по красоте готовый файл XML и как можно добавлять блоки в файл не перезаписывая его, буду скромно вам признателен...
?xml version="1.0" encoding="UTF-8"?> <users> <user date="19/08/2023_05:01" name="Иванов"> <login>Ваня</login> <password>47егпоу3</password> </user> </users>
То же самое я хотел на Perl сделать, но практической информации маловато...
(знание actionscript 2.0 помогает... А вообще-то чувак думал, что он попал на форум творческих личностей... Ошибся?)
|
|
« Последнее редактирование: 19-08-2023 02:21 от sergozuben »
|
Записан
|
|
|
|
RXL
|
|
« Ответ #22 : 19-08-2023 02:22 » |
|
sergozuben, ты не обижайся, но нам твои творения разбирать никакого интереса нет. Никакого творчества в этом нет. Что могли, подсказали. Теперь давай сам.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Sla
|
|
« Ответ #23 : 19-08-2023 11:35 » |
|
как мне отформатировать по красоте готовый файл XML
Что? нет методов или нам надо назвать их? и как можно добавлять блоки в файл не перезаписывая его
Как можно в файл что-то добавить внутрь не перезаписывая его?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|