Совет новичкам по поводу оформления своего говнокода

  • Автор темы Автор темы ps2007
  • Дата начала Дата начала

ps2007

Новичок
Совет новичкам по поводу оформления своего говнокода

Прошу администрацию не удалять мое сообщение.
Хочу показать, как из говнокода, который обычно пишут новички сделать более-менее читаемый код.
Исходный код:

PHP:
<?php 
$result=query( 
"SELECT*FROM`".PREFIX."posts`WHERE`id`='".intval($id)."'ORDER BY`id`DESC",__FILE__,__LINE__ 
); 
$count=mysql_num_rows($result); 
while($row=mysql_fetch_assoc($result)) 
{$body_material.='<div class="material"> 
<div class="material_wrapper"> 
<img src="'.htmlspecialchars($row['wrapper']).'" alt=""/> 
</div> 
<div class="material_right"> 
<div class="material_info"> 
<h1>'.htmlspecialchars($row['name']).'</h1> 
<div class="material_date_and_name"><a href="#">'.htmlspecialchars($row['login']). '</a> | '.format_date($row['date']).'</div> 
</div> 
<div class="the_full_area"></div> 
<div class="material_about"> 
'.htmlspecialchars($row['about']).' 
</div> 
</div> 
<br/><br/><br/> 
</div> 
<div class="the_full_area"></div> 
<div class="material_author"> 
<div class="material_author_avatar"> 
<img src="http://youexpert.ru/skins/default/design/img/no_avatar.jpg" alt=""/> 
</div> 
<div class="material_author_about"> 
<h1>Автор: <a href="#">'.htmlspecialchars($row['login']).'</a></h1> 
<p>Об авторе</p> 
</div> 
<div class="the_full_area"></div> 
</div> 
<div class="material_content"> 
// ЗДЕСЬ НУЖНО НАПИСАТЬ УСЛОВИЕ ЕСЛИ ПЕРЕМЕННАЯ FINAL существуето то.. 
<h1>Предварительный просмотр финального итога</h1> 
<p class="material_image"><a href="'.nl2br(bb_tag(htmlspecialchars($row['final']))).'"><img width="600" height="400" src="'.nl2br(bb_tag(htmlspecialchars($row['final']))).'" alt=""/></a></p> 
// ДО СЮДА 
<p>'.nl2br(bb_tag(htmlspecialchars($row['content']))).'<br/><br/><a href="'.htmlspecialchars($row['download']).'">Скачать</a> <a href="'.htmlspecialchars($row['demo']).'">Демо</a></p> 
</div>';}

Все перепутано, не видно ни структуры HTML, ни логики скрипта. Нужно сначала подготовить данные для вывода, т.е. выполнить запросы, произвести вычисления, прочее. Затем нужно только вывести результаты.
Вот что получилось после небольшой реорганизации:

PHP:
<?php

// получаем данные, никакого вывода
$result = query(
	"SELECT * FROM `".PREFIX."posts` WHERE `id` = '".intval($id)."'ORDER BY`id`DESC",__FILE__,__LINE__
	);
$count = mysql_num_rows($result);

$data = array();
while($row = mysql_fetch_assoc($result))
{
	$data[] = $row;
}


// выводим HTML, здесь не должно быть никаких запросов
foreach ($data as $row)
{
?>
<div class="material">
	<div class="material_wrapper">
		<img src="<?=htmlspecialchars($row['wrapper'])?>" alt=""/>
	</div>
	<div class="material_right">
		<div class="material_info">
			<h1><?=htmlspecialchars($row['name'])?></h1>
			<div class="material_date_and_name"><a href="#"><?=htmlspecialchars($row['login'])?></a> | <?=format_date($row['date'])?></div>
		</div> 
		<div class="the_full_area"></div> 
		<div class="material_about">
			<?=htmlspecialchars($row['about'])?>
		</div>
	</div>
	<br/><br/><br/>
</div>

<div class="the_full_area"></div> 
<div class="material_author"> 
	<div class="material_author_avatar"> 
		<img src="http://youexpert.ru/skins/default/design/img/no_avatar.jpg" alt=""/> 
	</div>
	<div class="material_author_about"> 
		<h1>Автор: <a href="#"><?=htmlspecialchars($row['login'])?></a></h1>
		<p>Об авторе</p>
	</div>
	<div class="the_full_area"></div> 
</div> 
<div class="material_content">
	// ЗДЕСЬ НУЖНО НАПИСАТЬ УСЛОВИЕ ЕСЛИ ПЕРЕМЕННАЯ FINAL существуето то..
<? if (isset($FINAL)) {?>
	<h1>Предварительный просмотр финального итога</h1> 
	<p class="material_image">
		<a href="<?=nl2br(bb_tag(htmlspecialchars($row['final'])))?>"><img width="600" height="400" src="<?=nl2br(bb_tag(htmlspecialchars($row['final'])))?>" alt=""/></a>
	</p>
	// ДО СЮДА
<?}?>
	<p><?=nl2br(bb_tag(htmlspecialchars($row['content'])))?>
		<br/><br/>
		<a href="<?=htmlspecialchars($row['download'])?>">Скачать</a>
		<a href="<?=htmlspecialchars($row['demo'])?>">Демо</a>
	</p>
</div>
<?}?>

Я не претендую на абсолютную правильность сделанного, я хотел показать суть.
 
прекрасное начинание!
хочу заметить тока, имхо, такой синтаксис лучше смотрится
PHP:
<? foreach ($blabla): ?>
<omg></omg>
<? if ($omg): ?>
<omg></omg>
<? endif; ?>
<? endforeach;?>
 
>> такой синтаксис лучше смотрится
это дело вкуса и стандартов на оформление кода :-)
 
Согласен с dr-sm, так лучше. Не надо будет искать к чему относится закрывающая скобка.
 
проблема в том, что новички это все равно не читают.
а конкретно тому, которому это преднозначалось - и вовсе... не в прок.
 
dr-sm
это заблуждение, не знаю кому пришла идея, что это синтаксис для шаблонов. когда много кода попробуй определить где конец блока, а при { } навёл и нормальный редактор тебе подсветил пару. не проверял, но с фолдингом тоже возможны проблемы. в примере только явно не хватает mysql_escape_string, что у новичков и не только является частой ошибка. в офтопе кто-то crm рекомендовал, наполненную дырами для инъекций, да ещё с выводом ошибок.
 
хочу заметить тока, имхо, такой синтаксис лучше смотрится
+1

намного лучше

-~{}~ 30.01.10 19:26:

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

PHP:
<?}?>
 
давайте предыдущее сообщение будет последним на эту исключительно важную тему, как писать скобочки.
 
PHP:
// получаем данные, никакого вывода
$result = query(
    "SELECT * FROM `".PREFIX."posts` WHERE `id` = '".intval($id)."'ORDER BY`id`DESC",__FILE__,__LINE__
    );
есть мнение что тут не хватает демонстративной проверки результата функции mysql_query вместо использования самописных библиотек.
 
Как минимум __FILE__ и __LINE__ там лишние, тем более при использовании самописных библиотек - [m]debug_backtrace[/m] работает ещё с 4.3, т.е. лет 7 как.
 
Нет, не лишние. Это просто устаревший подход, да.
debug_backtrace тут тоже, в сущности, не нужен - trigger_error сам проставит штампик
 
Сверху