Здравствуйте, подскажите, правильно ли я делаю. Мне нужно так: - пользователь через textarea1 вводит группу чисел, разделяя Ентером и после клика на кнопку они копируются в массив и начинается обработка данных, или же - пользователь через окно выбора загружает на сервер локальный файл, числа копируются в textarea1 и в массив и после клика на кнопку начинается обработка. - обработка данных происходит в цикле, до конца массива, с выводом результатов в textarea2. По отдельности все это работает, но я не могу скомпоновать эти куски вместе, чтобы они работали. Я мыслю так: - на основной странице есть две textarea (для ввода чисел и для результатов) - 1ое событие, для которого нужен обработчик, это нажатие кнопки Upload в окне выбoра файла. Должен запуститься скрипт, копирующий файл построчно в textarea и в массив. - 2ое событие, это нажатие кнопки Старт, запускающей скрипт. обрабатывающий массив до конца. - 3е событие, это окончание обработки очередного числа и обновление лога в textarea2 (дописывание строк). Я так понимаю, что на одной странице это лучше не делать, но когда я разношу скрипты и формы по отдельным файлам, то они либо не видят друг-друга, либо не обновляют textarea. file_upload.php PHP: <?php session_start(); $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); // - файл у меня загружается успешно во временную папку на сервере! if (is_uploaded_file($_FILES['userfile']['tmp_name'])) { echo "Файл ". $_FILES['userfile']['name'] ." успешно загружен.\n"; $INNs = readfile($_FILES['userfile']['tmp_name']); } else { echo "Ошибка загрузки"; } // echo $INNs.'<br>'; // И данные выводятся правильно из файла. $_SESSION['INNs'] = $INNs; echo '<script>window.location.href = "forms.html";</script>'; // возврат на основную страницу ?> Обработчик данных (пока просто копирование) PHP: <?php session_start(); $INNs = $_SESSION["INNs"];// НЕ ПОНИМАЮ, но здесь теперь хранится размер файла, а не данные!!! echo $INNs; //---------- обработчик нажатия кнопки Старт ---- if (isset($_POST['INN_list'])) { // Заполнение массива числами построчно из textarea1 $INN_arr = explode("\n", $_POST[INN_list]); // Копируем Textarea1 в массив // Обработка данных построчно foreach($INN_arr as $val){ //-- Обработка данных $result .= "$val\n"; // Добавляем результат в Textarea2 } } // А как результат посылать периодически в окно Textarea2 ? echo '<script>window.location.href = "forms.html";</script>'; // возврат на основную страницу ?> Основная страница: HTML: <?php session_start(); $result = $_SESSION['result'] ; ?> <html> <body> <!-- FILE --> <form enctype="multipart/form-data" action="file_upload.php" method="POST"> <!-- Название элемента input определяет имя в массиве $_FILES --> <input name="userfile" type="file" /> <input type="submit" value="Upload" /> </form> <!-- TEXTAREA1 -- DATA --> <form action="obrab.php" method="post" name="forma_spisok" onsubmit="return forma_spisok"> <textarea name="INN_list" cols="10" rows="25"> <? echo $result; // ничего не выводит :-( ?> </textarea> <input type="submit" value="START"/> </form> <!-- TEXTAREA2 - LOG --> <textarea name="LOG" cols="120" rows="30"> <? echo $result; // ничего не выводит :-( ?> </textarea> </body> </html>
Вообще, данная задача может быть реализована и без сервера, чисто на JS. Не принципиально. Кавычки забываешь. Нотисы лететь должны по-хорошему. А где эта переменная объявляется? Я про $result. Тоже нотисы должны быть. Под ваш случай, вообще, подошел бы AJAX хорошо. Гораздо проще было бы, чем геморроиться с перезагрузкой страницы, которая должна себя между перезагрузками еще и вести по-разному.
Вообще простейший вариант выглядит примерно так PHP: <?php $error = false; if($_POST['send_file']){ $file = $_FILES['file']; if($file['name'] == ''){ $error = "Выберите файл"; return; } $size = 2000000; $types = array('image/jpeg','image/png','image/gif'); $src = 'img/'; if($file['size'] > $size){ $error = 'Слишком большой файл'; return; } if(!in_array($file['type'], $types)){ $error = 'Недопустимое расширение файла'; return; } if(copy($file['tmp_name'],$src.$file['name'])){ echo "Файл успешно загружен"; }else{ $error = 'Ошибка загрузки файла'; } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <?php if($error){ echo "Ошибка загрузки файла"; }?> <form method="post" enctype="multipart/form-data"> <input type="file" name="file" placeholder="Выберите файл"> <input type="submit" value="Загрузить файл" name="send_file"> </form> </body> </html> В идеале можно сделать через ajax
cпасибо, почти все заработало!!! --- Добавлено --- А как сделать, чтобы в текстареа2 писало (обновлялось) не после всего цикла, а после обработки каждой строки? HTML: <?php session_start(); $INNs = $_SESSION['INNs']; unset($_SESSION['INNs']); $result = $_SESSION['result']; unset($_SESSION['result']); function Obrab($val){ $val += 1;// тестовая обработка sleep(1);// имитация долгой обработки return $val; } // Обработчик нажатия кнопки START if (isset($_POST['INN_list'])) { $INN_arr = explode("\n", $_POST['INN_list']); // Копируем Textarea1 в массив // основной цикл обработки массива данных построчно foreach($INN_arr as $val){ $result .= Obrab($val); // Добавляем результат в Textarea2. Это работает, но только когда цикл закончится и вернется на страницу // echo "<script>document.getElementById('my').value+= $result; </script>";// вообще не пишет } } ?> <html> <BODY> <!-- FILE --> <form enctype="multipart/form-data" action="file_upload.php" method="POST"> <!-- Название элемента input определяет имя в массиве $_FILES --> <input name="userfile" type="file" /> <input type="submit" value="Загрузить файл" name="send_file"> </form> <!-- TEXTAREA1 -- DATA --> <form action="" method="post" name="forma_spisok" onsubmit="return forma_spisok"> <textarea name="INN_list" cols="10" rows="10"> <?php if ($INNs!='') foreach($INNs as $val) echo $val; // Копирование массива в textarea ?> </textarea> <input type="submit" value="START"/> </form> <!-- TEXTAREA2 -- LOG --> <textarea id="my" cols="100" rows="10"> <? echo $result; ?> </textarea> <script>document.getElementById('my').value+=' А отсюда пишет в текстареа'; </script> </body> </html>