Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > как закинуть html cnраницу в ob_start


Автор: kelario 23.11.2009, 12:17
Доброе утро понедельника.

У меня есть html страница.Мне нужно записать в неё х значения и сохранить.
Код

<?
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   $name= trim($_POST['name']);
   $category = trim($_POST['category']);
   $location = trim($_POST['location']);
   $webpage = trim($_POST['webpage']);
   $keyword = trim($_POST['keyword']);
   }


ob_start();  

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
</head>

<body>
<table width="943" height="128" border="1" bordercolor="#9933CC"cellpadding="0" cellspacing="0" >
  <tr>
    <td width="221" rowspan="4">&nbsp;</td>
    <td width="89">Name</td>
    <td width="148"> echo $name; </td>
    <td width="226"><div align="center">DESCRIPTION</div></td>
    <td width="122">&nbsp;</td>
    <td width="111">&nbsp;</td>
  </tr>
  <tr>
    <td>PRODUCT CATEGORY</td>
    <td>echo $category; </td>
    <td rowspan="3"> echo $keyword; </td>
    <td>&nbsp;</td>
    <td>12</td>
  </tr>
  <tr>
    <td>LOCATION</td>
    <td> echo $location; </td>
    <td>&nbsp;</td>
    <td>32</td>
  </tr>
  <tr>
    <td>WEB PAGE</td>
    <td> echo $webpage; </td>
    <td>&nbsp;</td>
    <td>43</td>
  </tr>
</table>
</body>
</html>
$content = ob_get_contents();
ob_end_clean();
file_put_contents();
?>


естественно php встретив html теги начинает ругаться.Как это обойти и сохранить файл ? Может есть альтернатива ob-start ?

Спасибо.

Автор: MoLeX 23.11.2009, 12:30
Код

<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   $name= trim($_POST['name']);
   $category = trim($_POST['category']);
   $location = trim($_POST['location']);
   $webpage = trim($_POST['webpage']);
   $keyword = trim($_POST['keyword']);
   }
ob_start(); 

echo '
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Документ без названия</title>
</head>
<body>
<table width="943" height="128" border="1" bordercolor="#9933CC"cellpadding="0" cellspacing="0" >
  <tr>
    <td width="221" rowspan="4">&nbsp;</td>
    <td width="89">Name</td>
    <td width="148">'.$name.'</td>
    <td width="226"><div align="center">DESCRIPTION</div></td>
    <td width="122">&nbsp;</td>
    <td width="111">&nbsp;</td>
  </tr>
  <tr>
    <td>PRODUCT CATEGORY</td>
    <td>'.$category.'</td>
    <td rowspan="3"> echo $keyword; </td>
    <td>&nbsp;</td>
    <td>12</td>
  </tr>
  <tr>
    <td>LOCATION</td>
    <td>'.$location.'</td>
    <td>&nbsp;</td>
    <td>32</td>
  </tr>
  <tr>
    <td>WEB PAGE</td>
    <td>'.$webpage.'</td>
    <td>&nbsp;</td>
    <td>43</td>
  </tr>
</table>
</body>
</html>';
$content = ob_get_contents();
ob_end_clean();
file_put_contents();
?>


Добавлено через 53 секунды
kelario, 
1. необходимо изучить основы PHP и HTML
2. в скрипты вставляй
Код

//    Отображение ошибок
error_reporting(E_ALL);


Автор: Ипатьев 23.11.2009, 12:52
Чтобы РНР не ругался, надо просто сказать ему, что дальше идут теги

Код

<?
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   $name= trim($_POST['name']);
   $category = trim($_POST['category']);
   $location = trim($_POST['location']);
   $webpage = trim($_POST['webpage']);
   $keyword = trim($_POST['keyword']);
   }
ob_start();  
<head>
?>



очень просто

а еще лучше - вообще не использовать неочевидный механизм, смысл которого вам непонятен.
Для чего понадобилось "закидывать" страницу в ob_start()?

Автор: MoLeX 23.11.2009, 13:53
Цитата(Ипатьев @  23.11.2009,  12:52 Найти цитируемый пост)
Код

ob_start();  
<head>
?>

не пройдет  smile 

Автор: kelario 23.11.2009, 16:54
Код

echo '<html>'


Спасибо! Это так очевидно было,но за неимением опыта я об этом даже не подумал.Основы PHP конечно знать надо,но обучаться по ходу дела все же легче и интереснее.

    
Цитата

<?
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
   $name= trim($_POST['name']);
   $category = trim($_POST['category']);
   $location = trim($_POST['location']);
   $webpage = trim($_POST['webpage']);
   $keyword = trim($_POST['keyword']);
   }
ob_start();  
<head>
?>

очень просто
а еще лучше - вообще не использовать неочевидный механизм, смысл которого вам непонятен.
Для чего понадобилось "закидывать" страницу в ob_start()?


разве встретив ?> пхп не прекратит обрабатывать дальнейший код ?

на счет того,зачем мне ob_start

у меня Х одинаковых страниц с разным содержимым.И это скрипт их создающий.Более чем вероятно,что есть более рациональный и менее ресурсоемкий способ,но я о нем не знаю поскольку  
Цитата

1. необходимо изучить основы PHP


если подскажите как сделать это правильнее,буду только рад smile 

Спасибо.

Автор: Ипатьев 23.11.2009, 17:12
Цитата(kelario @  23.11.2009,  16:54 Найти цитируемый пост)
разве встретив ?> пхп не прекратит обрабатывать дальнейший код ?

прекратит. пока не встретит следующий <?

Обычно страницы создаются скриптом безо всякого буферинга.
Скрипту передаются параметры, на основании которых он и строит страницу

Автор: kelario 23.11.2009, 17:22
Цитата

прекратит. пока не встретит следующий <?


следовательно то,что между двумя ? в ob_start не попадет,ведь так?




Автор: Ипатьев 23.11.2009, 17:27
А куда оно должно пропасть? И зачем?
PHP изначально задумывался так, чтобы в противовес перлу у него ошибки могли выводиться на экран и его можно было встраивать прямо в HTML
И только потом выяснилось, что и то и другое - неправильно smile 

Автор: kelario 23.11.2009, 17:33
Цитата

А куда оно должно попасть? И зачем?


В файл Х-нный  с  новыми значениями переменных.Понятно, что 
Цитата
Обычно страницы создаются скриптом безо всякого буферинга.

 но тем не менее smile

Автор: Ипатьев 23.11.2009, 17:53
Не понял этого "но тем не менее".
вы уже сделали хоть один сайт по обычной схеме?
или вас что-то не устраивает из теоретических соображений?

Автор: kelario 23.11.2009, 18:15
Не цепляйтесь так к словам. smile 

меня все утсраивает,просто хочется закончить то,что начал.

Автор: bars80080 23.11.2009, 18:28
Цитата(kelario @  23.11.2009,  17:15 Найти цитируемый пост)
Не цепляйтесь так к словам

да никто не цепляется, просто хочется знать - зачем?

вот я никогда не пользовался всякими ob_, а потому интересно, какая цель может сподвигнуть на это действие

Автор: kelario 23.11.2009, 18:57
Зачем - я писал выше.Использую ob_ попросту потому,что это первое,что попалось мне под руку.Я осознаю,что можно как то сделать проще и быстрее,но просто я не знаю как smile 
Если кто ни будь поделится ссылочкой на скрипт дающий нужный результат,буду признателен.

Автор: Ипатьев 23.11.2009, 19:26
Вам предложили
Вы просто не читаете.

Главный принцип программирования - это разделение. Разделение кода и данных. Разделение данных и оформления.
В вашем случае данные и оформление надо хранить отдельно.
к примеру, введенные в форму данные записывать в текстовый файл. по строке на форму. А лучше - в базу данных.

плюс написать скрипт с шаблоном HTML
плюс написать скрипт с программой. который берет данные из текстового файла, забивает в шаблон и отдает пользователю.

Автор: nerezus 23.11.2009, 19:54
MoLeX, ?> html html <?
Неужели твоя IDE - это блокнот?) Ты же рушишь всякую подсветку и автокомплиты своими echo "дохрена строк";


Цитата

если подскажите как сделать это правильнее,буду только рад 
 на букс.ру книга гутманса стоит 150 рублей. Акция. Покупай, пока остались.
Если шаришь в английском, что читай книгу от зенда.

Автор: kelario 24.11.2009, 01:32
Спасибо всем за советы.
Цитата

к примеру, введенные в форму данные записывать в текстовый файл. по строке на форму. А лучше - в базу данных.

плюс написать скрипт с шаблоном HTML
плюс написать скрипт с программой. который берет данные из текстового файла, забивает в шаблон и отдает пользователю. 


наверное так и попробую сделать.

у меня возник еще один вопрос.Он не по теме,но открывать новую наверное нет нужды.

Мне нужно,что бы пользователь на сервер залил файл,картинку.Вроде бы всё должно быть просто,но у меня проблемы с 
Код

enctype="multipart/form-data"


Дело в том,что мне нужно сохранить картинку в определенном месте и в то же время передать в переменную название этой картинки.Если в форме не ставить enctype,то никакая картинка никуда не сохраняется.Но если его поставить,то имя файла не удается занести в переменную.
Как убить двух зайцев ? или может быть файлу при сохранение можно задать имя ?

Автор: bars80080 24.11.2009, 01:36
Цитата(kelario @  24.11.2009,  00:32 Найти цитируемый пост)
или может быть файлу при сохранение можно задать имя ? 

можно. при сохранении с помощью move_upload_file() просто указываешь новое имя и всё

Автор: Ипатьев 24.11.2009, 01:41
проблема не в имени файла.
закачать можно только  с multipart/form-data
если какие-то проблемы при этом - они не от enctype
а от кучи других причин. 
в документации смотрим пример, выводим еррор, исправляем позор

сдается мне, вы, как и многие новички, наивно полагаете, будто файло можно легко скопировать с жетского диска пользователя.
а от формы вам нужно только имя файла.

Автор: MoLeX 24.11.2009, 06:14
Цитата(nerezus @  23.11.2009,  19:54 Найти цитируемый пост)
Неужели твоя IDE - это блокнот?

notepad++ и phpDesigner 7, это к делу не относится

в данном случае суть не меняется, и автору нагляднее - если надо вывести то использовать echo ...

Автор: K0T9I 24.11.2009, 07:26
Цитата(kelario @ 24.11.2009,  01:32)
Дело в том,что мне нужно сохранить картинку в определенном месте и в то же время передать в переменную название этой картинки.

суперглобальный массив $_FILES:
Код

$_FILES['picture']['name'] - имя файла до его отправки на сервер;
$_FILES['picture']['size'] - размер принятого файла в байтах;
$_FILES['picture']['type'] - MIME-тип принятого файла (если браузер смог его определить);
$_FILES['picture']['tmp_name'] - содержит имя файла во временном каталоге на сервере;
$_FILES['picture']['error'] - код ошибки, которая может возникнуть при загрузке файла.

Код

<form action="index.php" method="post" enctype="multipart/form-data">
  <input name="picture" type="file" />
  <input type="submit" name="save" value="Save" />
</form> 

Код

$filename = basename($_FILES['picture']['name']);
if (!$_FILES['picture']['error'] && 
     copy($_FILES['picture']['tmp_name'],$some_path.$filename)){
  echo "uploaded";
}


в $filename будет имя файла, а сам файл скопируется в каталог $some_path.

я правильно тебя понял?

Автор: bars80080 24.11.2009, 10:40
K0T9I, вот я, насколько понимаю, copy() - запись дубликата файла, а move_upload_file() - просто изменение адреса.
зачем учить более затратным механизмам?

Автор: kelario 24.11.2009, 11:54
Цитата

я правильно тебя понял?


Да! Абсолютно правильно!Спасибо! Я просто пытался получить имя файла по аналогии со скажем текстовым полем.То есть $filename=$_POST['filename'] .Без enctype кстати прокатывало smile Но теперь и файл заливается куда нужно и имя его присутствует.Правда move_upload_file() вроде и вправду предпочтительнее.
Спасибо еще раз!

Автор: K0T9I 24.11.2009, 11:54
я понимаю, что есть правило, насвинячил - приберись. но файл загружается во временную папку и сборщик мусора php его удалит, поэтому столь важным этот принцип здесь не является.
а вообще функция move_uploaded_file конечно гораздо лучше, copy использую по привычке. smile 
в одном вы не правы, move_uploaded_file копирует файл, если источник и назначение в разных дисковых разделах, и переносит если в одном.  smile 

Автор: bars80080 24.11.2009, 12:56
Цитата(K0T9I @  24.11.2009,  10:54 Найти цитируемый пост)
в одном вы не правы, move_uploaded_file копирует файл, если источник и назначение в разных дисковых разделах, и переносит если в одном

ну, мы же не знаем, на одном диске или на разных. 

Автор: K0T9I 24.11.2009, 13:49
я хотел сказать просто, что почти всегда move_uploaded_file и copy идентичны по действию. в зависимости от расположения файла эта функция может вести себя и как copy, и как rename, только с доп. проверкой того что файл является загруженным. а большинстве случаев временная папка расположена в другом разделе, поэтому почти всегда move_uploaded_file аналогична copy, за исключением проверки. 
как-то так, а в остальном я с вами согласен, что неправильный метод дал smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)