Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dane z formularza
Forum PHP.pl > Forum > PHP
Chrusta
Witam.

Mam taki problem.
Mam formularz, w którym wypełnia się odpowiednie pola, tj. np. hasło, nick, email. Skrypt ten tworzy plik z danymi na moim komputerze. Robię to w ten sposób, że na zewnętrznym hostingu, na stronie umieszczam ramkę i w tej ramce skrypt, który znajduje się na moim komputerze na serwerze www. Jest to niewygodne, ponieważ gdy ktoś dojrzy ramkę, to może łatwo odnaleźć np. ip mojego komputera. Widziałem na niektórych stronach, że taki formularz normalnie jest na stronie, bez żadnych ramek, a pliki tworzy na jakimś prywatnym komputerze. Jak to zrobić?

Skrypt, który umieszczam w ramce na zew. stronie www:
  1. <html>
  2. <head>
  3. <style type="text/css">
  4. <!--
  5. TD {FONT-SIZE: 13px; COLOR: #000000; FONT-FAMILY: tahoma}
  6. //-->
  7. </style>
  8. </head>
  9. <body>
  10.  
  11. <?
  12.  
  13. /*-------------Edit this----------------*/
  14. $dir = 'D:\\abc\\sciezka_do_folderu_z_plikami';
  15. /*--------------------------------------*/
  16. if(!$_POST){
  17. echo '<form action='.$_SERVER['PHP_SELF'].' method=post>
  18.  
  19. <div>
  20. <table width="400" border="0">
  21.  
  22. <tr>
  23. <td>Nazwa konta:</td>
  24. <td><input name=account type=text maxlength=10></td>
  25. </tr>
  26. <tr>
  27. <td>Hasło:</td>
  28. <td><input name=password type=password maxlength=10></td>
  29. </tr>
  30. <tr>
  31. <td>Powtórz hasło:</td>
  32. <td><input name=confirm type=password maxlength=10></td>
  33. </tr>
  34. <tr>
  35. <td>E-Mail:</td>
  36. <td><input name=email type=text></td>
  37. </tr>
  38. <tr>
  39. <td>Pytanie (gdyby? zapomniał hasła):</td>
  40. <td><input name=question type=text></td>
  41. </tr>
  42. <tr>
  43. <td>OdpowiedĽ:</td>
  44. <td><input name=answer type=text></td>
  45. </tr>
  46. <tr>
  47. <td><input name=submit type=submit value="Utwórz konto"></td>
  48. </tr>
  49. </table>
  50.  
  51. </div>
  52.  
  53. ';
  54. }
  55. else{
  56. $account = $_POST['account'];
  57. $confirm = $_POST['confirm'];
  58. //$date = date('F d, Y g:i A');
  59. $date = date('Y/m/d/g/i');
  60. $password = $_POST['password'];
  61. $email = $_POST['email'];
  62. $question = $_POST['question'];
  63. $answer = $_POST['answer'];
  64. $ip = $_SERVER['REMOTE_ADDR'];
  65. $firstletter = substr($account, 0, 1);
  66. $ascii = ord($firstletter);
  67. $filename = $dir . '\\ASCII'.$ascii.'\\'.$account.'.txt';
  68. if($account == '') { echo 'Konto nie zostało stworzone. Proszę podać nazwę konta.<br><a href="newacc.php">Powrót</a><br>'; }
  69. if($password == '') { echo 'Konto nie zostało stworzone. Proszę podać hasło.<br><a href="newacc.php">Powrót</a><br>'; }
  70. if($question == '') { echo 'Konto nie zostało stworzone. Proszę podać pytanie.<br><a href="newacc.php">Powrót</a><br>'; }
  71. if($answer == '') { echo 'Konto nie zostało stworzone. Proszę podać odpowiedĽ.<br><a href="newacc.php">Powrót</a><br>'; }
  72. elseif(file_exists($filename)) { echo 'Konto nie zostało stworzone. Podana nazwa już istnieje.<br><a href="newacc.php">Powrót</a><br>';}
  73. elseif($email == '') { echo 'Konto nie zostało stworzone. Proszę podać adres email.<br><a href="newacc.php">Powrót</a><br>';}
  74. elseif(!ereg("^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$", $email)){ echo 'Konto nie zostało stworzone. Proszę podać prawidłowy adres e-mail.<br><a href="newacc.php">Powrót</a><br>'; }
  75. elseif($password != $confirm) { echo 'Konto nie zostało stworzone. Hasło nie zgadza się z powtórzonym hasłem.<br><a href="newacc.php">Powrót</a><br>';}
  76. else{
  77. $fp = fopen($filename, 'w+');
  78. $string = 'Account-generated: Time('.$date.') IP('.$ip.')
  79.  
  80. [NAME]
  81. account-name = '.$account.'
  82.  
  83. [PASSWORD]
  84. account-password = '.$password.'
  85.  
  86. [ACCOUNT-STATUS]
  87. account-valid-time = 0
  88. account-valid-date = 2003 4 5
  89. account-change-password = 2003 3 29
  90.  
  91. [ETC]
  92. account-Gender = Male
  93. account-Age =
  94. account-Birth-Year = xxxx
  95. account-Birth-Month = xx
  96. account-Birth-Day = xx
  97. account-RealName = a
  98. account-SSN = aaaaa
  99. account-Email = '.$email.'
  100. account-Quiz = '.$question.'
  101. account-Answer = '.$answer.'
  102. account-created-by =
  103.  
  104. [CHARACTERS]
  105.  
  106. ';
  107. $write = fputs($fp, $string);
  108. fclose($fp);
  109. echo 'Konto zostało założone. Możesz się teraz zalogować.<br><a href="newacc.php">Powrót</a>';
  110. }
  111. }
  112. ?>
  113. <body>
  114. </html>


Pozdrawiam.

EDIT
Ok, wiem już jak przesłać dane z formularza do innego pliku. Zrobiłem jeden plik z wszystkim co jest powyżej, pomiędzy <form></form>, a drugi plik z tym co jest powyżej ale bez tego co jest w pierwszym pliku. Tyyylko że... po kliknięciu na przycisk przenosi mnie do drugiej strony... Plik się normalnie tworzy, ale przenosi mnie...
Tak zrobiłem: http://wklej.to/ETyI
I jeszcze jeden problem. Te wszystkie komunikaty, które są w drugim pliku ("Konto nie zostało... blabla") najlepiej jak by były w pierwszym pliku.
Ew. coś na takiej zasadzie: cały skrypt na stronie www, tylko że zamiast tworzyć plik to wysyła go na mój komputer (FTP raczej odpada, na pewno da się to jakoś inaczej rozwiązać).

No no, widzę tłumy znawców chętnych do pomocy...

Naprawdę nikt nie wie jak zastąpić tą linijkę:
  1. $write = fputs($fp, $string);

kodem, który komunikował by się z innym skryptem znajdującym się na moim komputerze, który to z kolei utworzy ten plik?
lukaskolista
prosze bardzo, wystarczy odpowiednio uzyc w skrypcie http://www.php.net/manual/en/function.file...tents.php#96217
Chrusta
Dzięki. smile.gif

Czyli bez FTP się nie obejdzie?
lukaskolista
nie, jakos przeciez trzeba uwierzytelnic skrypt, bo inaczej kazdy moglby tworzyc dowolne pliki. Najlepszym rozwiazaniem byloby przechowywanie wyslanych formularzy w bazie danych.
Chrusta
Ok, mam teraz inny problem. Mam zapisany plik na zew. serwerze w jakims folderze, i muszę go przenieść przez ftp na swój komputer.
Problem w tym, że w skrypcie mam sprawdzanie, czy taki plik już istnieje na moim komputerze.
Na razie mam tak: http://wklej.to/vMbY
ACCOUNTS_DIRECTORY oraz UNCONFIRMED_ACCOUNTS_DIRECTORY to ścieżki do folderów na moim komputerze.

Myślałem, żeby zrobić coś takiego jak tu: http://wklej.to/ETyI tylko że ten drugi plik na moim komputerze, a w form action zrobić tak, żeby nie przekierowywało do tego drugiego pliku (który byłby na moim komputerze), tylko otwierało go np. w małej niewidocznej ramce... Tylko wtedy znowu problem z komunikatami, że np. taki plik już istnieje...

Ok, na razie zrobiłem tak:
  1. $user = "user";
  2. $pass = "pass";
  3. $host = "localhost";
  4. $file = ACCOUNTS_DIRECTORY . "/" . $account_directory . "/" . $account_file;
  5. $unc_file = file_get_contents(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);;
  6. $hostname = "ftp://".$user . ":" . $pass . "@" . $host . "/" . $file;
  7.  
  8. $options = array('ftp' => array('overwrite' => true));
  9. $stream = stream_context_create($options);
  10.  
  11. $test = file_exists($hostname);
  12. if (!$test)
  13. {
  14. echo "plik z kontem jeszcze nie istnieje" .$plik;
  15. if(!file_put_contents($hostname, $unc_file, 0, $stream)) {
  16. $error_message .= "nie wyslano pliku<br>";
  17. } else {
  18. unlink(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);
  19. }
  20. } else {
  21. echo "Plik " .$hostname. " juz istnieje";
  22. unlink(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);
  23. $error_message .= "plik juz istnieje<br>";
  24. }

Tylko jeśli można, to proszę mi wytłumaczyć te dwie linijki:
  1. $options = array('ftp' => array('overwrite' => true));
  2. $stream = stream_context_create($options);

i jeszcze mam problem z tym:
  1. if(!file_put_contents($hostname, $unc_file, 0, $stream)) {

jeśli nie da się wysłać pliku, to nie pokazuje komunikatu, tylko czeka dłuuugo...
lukaskolista
  1. $options = array('ftp' => array('overwrite' => true));
  2. $stream = stream_context_create($options);

pierwsza linijka mowi o tym, ze jezeli plik istnieje to nalezy go nadpisac
druga linijka to przeksztalcenie pierwszej na strumien danych (w manualu wszystko jest napisane)

  1. if(!file_put_contents($hostname, $unc_file, 0, $stream)) {

z czym dokladnie masz tu problem? jezeli plik nie zostanie zapisany/nadpisany to zostanie wykonana zawartosc instrukcji if
Chrusta
Chodziło mi o czas oczekiwania, kiedy zostanie wykonany ten if, tzn że jest za długi i czy nie da się go zmniejszyć, np. do 2-5 sekund.

Umieściłem skrypt na zewnętrznym hostingu i znów jest problem.
Fragment skryptu:
  1. $user = "user";
  2. $pass = "pass";
  3. $host = "moj_ip";
  4. $file = ACCOUNTS_DIRECTORY . "/" . $account_directory . "/" . $account_file;
  5. $unc_file = file_get_contents(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);;
  6. $hostname = "ftp://".$user . ":" . $pass . "@" . $host . "/" . $file;
  7.  
  8. $options = array('ftp' => array('overwrite' => true));
  9. $stream = stream_context_create($options);
  10.  
  11. $test = file_exists($hostname);
  12. if (!$test)
  13. {
  14. echo "plik z kontem jeszcze nie istnieje" .$plik;
  15. if(!file_put_contents($hostname, $unc_file, 0, $stream)) {
  16. $error_message .= "nie wyslano pliku<br>";
  17. } else {
  18. unlink(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);
  19. }
  20. } else {
  21. echo "Plik " .$hostname. " juz istnieje";
  22. unlink(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);
  23. $error_message .= "plik juz istnieje<br>";
  24. }

i tworzy plik na moim komputerze ale nie kopiuje do niego tego, co jest w tym pliku:
  1. $unc_file = file_get_contents(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);
lukaskolista
co do czasu oczekiwania: instrukcja zostanie wykonana wtedy, kiery file_put_contents() zwroci false. file_put_contents() zwroci false, gdy polaczy sie z ftp i sprobuje zapisac podana zawartosc do pliku. Prawdopodobnie 2-5 sec trwa laczenie sie z ftp i proba zapisu. Co do bledu:
  1. $user = "user";
  2. $pass = "pass";
  3. $host = "moj_ip";
  4. $file = ACCOUNTS_DIRECTORY . "/" . $account_directory . "/" . $account_file;
  5. $unc_file = file_get_contents(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);;
  6. $hostname = "ftp://".$user . ":" . $pass . "@" . $host . "/" . $file;
  7.  
  8. var_dump($unc_file);
  9.  
  10. exit();
  11.  
  12. $options = array('ftp' => array('overwrite' => true));
  13. $stream = stream_context_create($options);
  14.  
  15. $test = file_exists($hostname);
  16. if (!$test)
  17. {
  18. echo "plik z kontem jeszcze nie istnieje" .$plik;
  19. if(!file_put_contents($hostname, $unc_file, 0, $stream)) {
  20. $error_message .= "nie wyslano pliku<br>";
  21. } else {
  22. unlink(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);
  23. }
  24. } else {
  25. echo "Plik " .$hostname. " juz istnieje";
  26. unlink(UNCONFIRMED_ACCOUNTS_DIRECTORY . "/" . $unconfirmed_account_file);
  27. $error_message .= "plik juz istnieje<br>";
  28. }

sprobuj wykonac to i zobacz, co zostanie wyswietlone (var_dump($unc_file)winksmiley.jpg. Jezeli nic to znaczy, ze pobierany plik jest pusty. Swoja droga jezeli pobierasz skrypt php ktory nic nie zwraca to odpowiedz bedzie pusta. Jezeli wyswietli jakas tresc pliku to bedziemy dalej myslec
Chrusta
Wyświetla
Cytat
string(509) " tu tresc pliku "

czyli nie jest pusty.

W programie FTP pokazuje mi, że dany ip się połączył, stworzono plik. A na stronie skrypt się jakby zawiesza, tzn. cały czas ładuje, tak jak by się strona nie chciała wczytać...
lukaskolista
wyswietla Ci jakies ktorys z komunikatow "plik z kontem jeszcze nie istnieje" i "nie wyslano pliku" albo jakikolwiek inny?
Chrusta
Nic. Tak jakby "zamuliło" go na tej linijce:
  1. if(!file_put_contents($hostname, $unc_file, 0, $stream)) {
lukaskolista
sprobuj
  1. if(!file_put_contents($hostname, $unc_file)) {
Chrusta
To samo. A testowałem u siebie na WebServie i śmiga ładnie.
lukaskolista
na samym poczatky skryptu dodaj linijke
i zobacz czy wyswietla bledy
Chrusta
Nie wyświetla nic, bo w firefoxie cały czas kręci się takie kółko i jest napis "Wczytywanie...", tzn strona się nie chce załadować w ogóle. Po dłuższym czasie dopiero dopiero czysta strona wyskakuje.

Wyedytowałem poprzedniego posta.
Cytat
A testowałem u siebie na WebServie i śmiga ładnie.


Na prawdę nikt nie ma pomysłu?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.