[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Гостевая книга. Шаг 8. Постраничная навигация
Spamol
Привет, начал обучение PHP, остановился на 8 шаге постраничной навигации, никак не могу понять как она работает:

Вот как у вас написано функция вывода, зачем тут $num, если чуть ниже она вообще считывает кол-во постов в файле($num = count($posts)wink.gif, их может быть в первом файл скажем 4, потом эти 4 обрабатываются и вставляются в ссылку($menu .= '<a href="?page='. $num .'">'. $num .'</a> | '; ), но ведь имея 4 записи в первом файле мы не получаем 4 страницы, можете поподробнее объяснить что происходит, есть подозрение что я цикл foreach в данном коде не могу понять, что он именно делает, ведь foreach работает с массивами, а тут его нет я так понимаю!

function pageMenu($page)
{
$files = dirScan('data');
$menu = ' | ';
foreach($files as $num)
if($page == $num)
$menu .= '<strong>'. $num .'</strong> | ';
else
$menu .= '<a href="?page='. $num .'">'. $num .'</a> | ';

return $menu;
}




Спустя 21 минута, 16 секунд (4.05.2010 - 17:31) twin написал(а):
Вот это ключевой момент:
      $files = dirScan('data');

Эта функция возвращает номера файлов, которые имеются в директории. В каждом из которых (кроме последнего) уже есть определенное количество постов. И в ссылку подставляется номер файла.
По этому на странице будет только содержимое одного из них.

Спустя 19 минут, 55 секунд (4.05.2010 - 17:51) Spamol написал(а):
С этим я уже разобрался, что делает переменная $num не понятно, ведь она кол-во постов из файла читает?
$num = count($posts);

А конкретно из последнего файла
$file = max(dirScan('data')); 
$posts = unserialize(file_get_contents('data/'.$file));

Спустя 6 минут, 36 секунд (4.05.2010 - 17:58) twin написал(а):
Да, считает количество постов в последнем файле. Функция max() выдаст максимальный элемент массива, а значит номер последнего файла.

Спустя 10 минут, 59 секунд (4.05.2010 - 18:09) twin написал(а):
Я кажется понял, в чем вопрос. Переменная $num в функции, это совсем не та, что ниже. В функции она живет самостоятельной жизнью и образуется именно в цикле foreach. В неё при каждой интерации (витке цикла) записывается по очереди элемент массива. А в массиве $files номера файлов.

Просто они одинаково называются, а служат для разных целей.

Спустя 16 минут, 45 секунд (4.05.2010 - 18:25) Spamol написал(а):
Воо блин, теперь вроде ясно, жесть, а я всю говову сломал, могли бы в комментах в коде поменить, что это две разные фукции или хотя бы назвать по разному)

Т.е. если у меня 3 файла, в цикле в $num почередно попадет 1,2,3, пока не кончаться файлы?

Спустя 5 минут, 55 секунд (4.05.2010 - 18:31) twin написал(а):
Функции называются по разному. Они не могут одинаково называться, а то будет конфликт имен.
А к тому, что переменные называются одинаково - привыкай. Это обычная практика.
Во первых при большом листинге не хватит фантазии придумать всем разные. smile.gif
А если и придумаешь, это усложнит читабельность.
Да и перезапись экономит память, если не уничтожать ненужные.

Цитата
Т.е. если у меня 3 файла, в цикле в $num почередно попадет 1,2,3, пока не кончаться файлы?
именно так.

Спустя 4 часа, 11 минут, 18 секунд (4.05.2010 - 22:43) Spamol написал(а):
Так-с, вот еще вопрос, но уже про админку, расскажите как работает этот цикл
for($i = 0; $i < count($delete); ++$i)
{
$posts[$delete[$i]]['name'] = '';
$posts[$delete[$i]]['mess'] = 'Удалено модератором';
}

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

Спустя 56 минут, 43 секунды (4.05.2010 - 23:39) twin написал(а):
Сделай чуть выше так

    echo '<pre>';
print_r($_POST);
print_r($posts);
echo '</pre>';

for($i = 0; $i < count($delete); ++$i)
{
$posts[$delete[$i]]['name'] = '';
$posts[$delete[$i]]['mess'] = 'Удалено модератором';
}
и изучай что где.

Спустя 12 часов, 39 минут, 31 секунда (5.05.2010 - 12:19) Spamol написал(а):
Я понимал и без этого, что в этих массивах, сейчас на свежую голову посмотрел, понял что через POST приходит массив delete с ключом коммента, который изменить, потом в цикле идет перебор до нужного коммента и он его редактирует, все ясно, но вот как до этого самому додуматься, это вообще жесть, надеюсь это придет и ко мне со временем=)

Спустя 12 минут, 17 секунд (5.05.2010 - 12:31) twin написал(а):
Придет со временем))) Это просто опыт нужен. Дело наживное.

Спустя 11 минут, 34 секунды (5.05.2010 - 12:43) Spamol написал(а):
Надеюсь, просто в некоторые моменты хочеться бросить, потому что смотришь скрипт, прослеживаешь его работу и охреневаешь как это вообще можно придумать, особенно это было с этой гостевой, сначала все понятно и логично, потом начиная с Шага 7 Архивирование файлов началась жесть)))

Кстати у меня поэтому поводу 3 раза изучения пхп заканчивались ничем, но вот в 4 раз попытаюсь довести все до конца!

Спустя 21 день, 8 часов, 33 минуты, 17 секунд (26.05.2010 - 21:16) admrp написал(а):
Здравствуйте! Пишу в этой теме дабы не плодить их большое кол-во.
Проблема скорее относится к настройкам веб-сервера, думаю так.
Занимаюсь разбором гостевой книги, под "виндой" всё хорошо, но вот в "опенсьюз" возникла проблема с отработкой скрипта. Значит так: готовый скрипт, писал ли его я, либо копировал уже для теста Ваш
<?php
header("Content-Type: text/html; charset = UTF-8");
error_reporting(E_ALL);
//////////////////////////////////////////////////////////////////////////////////////////
//VARIABLES
//////////////////////////////////////////////////////////////////////////////////////////
$text1 = !empty($_POST['text1']) ? $_POST['text1'] : null;
$text2 = !empty($_POST['text2']) ? $_POST['text2'] : null;
$info = array();
///////////////////////////////////////////////////////////////////////////////////////////
//SCRIPTS
///////////////////////////////////////////////////////////////////////////////////////////
if(!empty($_POST['ok']))
{
if(!$text1)
$info[] = 'Вы не заполнили все поля!';
if(!$text2)
$info[] = 'Вы не написали комментарий!';
if(count($info) == 0);
{
file_put_contents('text.txt', $text2, FILE_APPEND);
header('location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
exit();
}
}

else
$info[] = 'Пишите, не стесняйтесь!';
?>

<form action="" method="POST">
Имя:<br />
<
input name="text1" type="text" value="<?php htmlspecialchars($text1) ?>"><br />
Ващ комментарий:<br />
<
textarea name="text2" cols="40" rows="10"><?php htmlspecialchars($text2) ?></textarea><br />
<
input name="ok" type="submit"><br />
</
form>

<?php
echo implode('<br />', $info) . '<br />';

if(file_exists('text.txt'))
echo nl2br(htmlspecialchars(file_get_contents('text.txt')));

- при первоначальном его открытии отлично отображается внешний вид, отображается сообщение если не нажата кнопка, но если нажать просто кнопку без ввода текста либо набрать в оба поля текст, то не происходит ровным счётом ничего, обновляется страница и всё, повторюсь, что под "виндой" - работает, а на "лине" даже копипаст Вашего варианта не даёт результата.
Пожалуйста, помогите разобраться!
p.s.: в логах ошибок нет ничего. ну и не создаётся сам текстовый файл, думаю, что что-то с правами, но не понимаю почему ошибки не отображаются, тем более, что должы выводится все.

Спустя 7 минут, 37 секунд (26.05.2010 - 21:24) admrp написал(а):
прошу прощения.., кое что изменилось, сейчас проверю - дополню///
не понимаю blink.gif - поменял !empty на isset в проверке нажатия кнопки, обновил страницу, сообщения появились в браузере, поменял обратно, пообновлял страничку, сообщения остались и добавляются в файл(файл тоже же появился), но новые сообщения просто добавляются без пробелов к предыдущим(если набрать в поле без переноса строки, если набрать с переносами, то переносыы нормально обрабатываются).
Информационные сообщения кроме как о не нажатии кнопки(которое не исчезает совсем с экрана) не появляются.

Спустя 1 час, 5 минут, 51 секунда (26.05.2010 - 22:29) twin написал(а):
Мистика... Дело все в системе... По скрипту даже и посоветовать ничего не могу...

Спустя 9 часов, 46 минут, 43 секунды (27.05.2010 - 08:16) admrp написал(а):
угу, мистика.
версия php 5.2.3, apache 2 какой-то, не помню сейчас точно.
вот и я сижу вчера вечером и ума не дам в чём дело-то.

Спустя 7 дней, 4 часа, 41 минута, 53 секунды (4.06.2010 - 12:58) admrp написал(а):
Вопрос, пишу код самостоятельно - без копипаста, под ос windows, после полного написания пробую открыть его в браузере, но он мне предлагает его сохранить... ??? в то время как, например другой код php работает на этом же "сервере"
привожу код:
<?php
header("Content-Type: text/html: charset = utf-8");
error_reporting(E_ALL);
///////////////////////////////
//FUNCTION
///////////////////////////////
function dScan($dir)
{
static $files;
if(empty($files))
{
$files = scandir($dir);
$files = array_diff($files, array('.', '..'));
}
$files = count($files) ? $files : array('1');
return $files;
}
///////////////////////////////
//VARIAbLES
///////////////////////////////
$text1 = !empty($_POST['text1']) ? $_POST['text1'] : null;
$text2 = !empty($_POST['text2']) ? $_POST['text2'] : null;
$info = array();
$posts = array();
///////////////////////////////
//SCRIPTS
///////////////////////////////
if(!empty($_POST['ok']))
{
if(!$text1)
$info[] = 'Вы не указали имя!';
if(!$text2)
$info[] = 'Вы не написали комментарий!';
if(count($info) == 0)
{
$file = max(dScan('data'));
if(file_exists('data/'.$file))
{
$posts = unserialize(file_get_contents('data/'.$file));
$keys = array_keys($posts);
$id = max($keys) + 1;
$num = count($posts);
}
else
$num = $id = 1;
if($num > 5)
{
++$file;
unset($posts);
}
$posts[$id]['date'] = date('d/m/Y, H:i:s');
$posts[$id]['name'] = $text1;
$posts[$id]['mess'] = $text2;
file_put_contents('data/'.$file, serialize($posts));
header("location: http://". $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
exit();
}
}

else
$info[] = 'Пишите не стесняйтесь!';
?>
<form action="" method="POST">
Имя:<br />
<
input name="text1" type="text" value="<?php echo htmlspecialchars($text1) ?>"/><br />
Комментарий:<br />
<
textarea name="text2" cols="40" rows="10"><?php echo htmlspecialchars($text2) ?></textarea><br />
<
input name="ok" type="submit" />
</
form>
<?php
echo implode('<br />', $info) . '<br />';

$file = max(dScan('data'));
if(file_exists('data/'.$file))
{
$posts = unserialize(file_get_contents('data/'.$file));
foreach($posts as $id => $post)
{
$date = $post['date'];
$name = htmlspecialchars($post['name']);
$mess = nl2br(htmlspecialchars($post['mess']));
?>
<div style="border:1px solid;
width:70%;
min-height:100px;
margin:5px;
padding:5px;
background-color:#cccfff;"
>
<?php echo $date ?> | <b><?php echo $name ?></b>
<
hr width="100%">
<?php echo $mess ?>
</div>
<?php
}
}

я что-то упускаю ?

Спустя 11 минут, 30 секунд (4.06.2010 - 13:10) twin написал(а):
header("Content-Type: text/html; charset=utf-8");
header("Content-Type: text/html: charset=utf-8");

Спустя 2 минуты, 17 секунд (4.06.2010 - 13:12) admrp написал(а):
))благодарю twin

Спустя 1 день, 1 час, 36 минут, 58 секунд (5.06.2010 - 14:49) ruzarh написал(а):
Вот вопрос по "гостевой книге SQL"
Вот происходит вывод данных как по учебнику(http://irbis-team.com/15/6/1)

<!-- ./skins/tpl/guest/rows.tpl begin -->
<div style="border:1px solid; width:70%; background-color:#66FFFF; min-height:100px; margin:5px; margin-left:10%; padding:5px">
<?php echo $tpl_date; ?> / <?php echo $tpl_name; ?>
<hr width="30%" align="left" />
<?php echo $tpl_text; ?>
</div>
<!-- ./skins/tpl/guest/rows.tpl end -->

А вот формирование запроса

$res = mysqlQuery("SELECT * FROM `". IRB_DBPREFIX ."guest`
ORDER BY `id` ASC");

$rows = '';

if(mysql_num_rows($res) > 0)
{
$cont = getTpl('guest/rows');

while($row = htmlChars(mysql_fetch_assoc($res)))
{
$row['date'] = formatDate($row['date'], false);
$row['text'] = nl2br($row['text']);
$rows .= parseTpl($cont, $row);
}
}

Вопрос откуда берутся переменные
$tpl_date; $tpl_name и $tpl_text;

Спустя 8 часов, 52 секунды (5.06.2010 - 22:50) twin написал(а):
Ну нужно было все читать...
А вообще, отсюда.

Спустя 9 часов, 59 минут, 5 секунд (6.06.2010 - 08:49) ruzarh написал(а):
Спасибо большое twin просто я понимаю все с задержками, когда вычитываю больше приходит и понимание прошлого материала! Я еще Катерова и Костерова "PHP 5 в подленике" почитываю! А где можно про настройки APACHE почитать, про необходимые, рекомендуемые и безопасные настройки(Хорошо бы на Русском)? Спасибо большое еще раз!

Спустя 8 часов, 50 минут, 33 секунды (6.06.2010 - 17:39) ruzarh написал(а):
Предложение по 'гостевой книге SQL'

Функцию предлагаю сделать вот так!

function bbTags($text)
{
$bb = array(
'',
'
',
'',
'
',
'',
'
',
'',
'
',
'[smile.gif]',
'[sad.gif]',
'[wink.gif]',
'[biggrin.gif]'
);

$tag = array(
'<b>',
'</b>',
'<i>',
'</i>',
'<s>',
'</s>',
'<u>',
'</u>',
'<img src="' . IRB_HOST . 'skins/images/smiles/1.gif" />',
'<img src="' . IRB_HOST . 'skins/images/smiles/2.gif" />',
'<img src="' . IRB_HOST . 'skins/images/smiles/3.gif" />',
'<img src="' . IRB_HOST . 'skins/images/smiles/4.gif" />'
);

return str_ireplace($bb, $tag, $text);
}


А в show.tpl

<form action="" name="post"  method="post">
Имя:<br />
<input
name="form[value1]" type="text" value="<?php echo $POST['value1'];?>"/><br />
<img
style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/bold.gif" alt="Жирный" onclick="tag('','')">
<img
style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/italics.gif" alt="Курсив" onclick="tag('','')">
<img
style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/underline.gif" alt="Подчеркнутый" onclick="tag('','')">
<img
style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/strikethrough.gif" alt="Зачеркнутый" onclick="tag('','')">
<img
style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/1.gif" onclick="tag('[smile.gif]','')">
<img
style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/2.gif" onclick="tag('[sad.gif]','')">
<img
style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/3.gif" onclick="tag('[wink.gif]','')">
<img
style="cursor:pointer" src="<?php echo IRB_HOST ?>skins/images/smiles/4.gif" onclick="tag('[biggrin.gif]','')"><br />

Спустя 14 часов, 14 минут, 17 секунд (7.06.2010 - 07:54) ruzarh написал(а):
Понял свою ошибку! Пропадает основной принцип разделения!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.