Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Смарти. foreach
 
 автор: Лена   (20.05.2008 в 12:32)   письмо автору
 
 

Код обработчика:

$result = mysql_query("SELECT * FROM `news`");
if(!$result) exit(mysql_error()); 
        while ($rows = mysql_fetch_array($result)) {
        print"<pre>";
        print_r ($rows);
        print"</pre>";
        $smarty_news->assign('list', $rows_news); 
        $smarty_news->display("news1.tpl");
        }


Код шаблона:

{foreach from=$list item=row) 
<div class="news-page_title>{$row.page_title}</div>
<div class="news-date">{$row.date}</div>
<div class="news-body_chunk">{$row.announce}</div>
<div class="news-body"><a href="index.php?id={$row.main_file}">Читать далее (Весь текст)</a></div>
{foreachelse}
Нет значений в $list
{/foreach} 


Вроде бы, все правильно, но выводит ошибку:
Fatal error: Smarty: [in news1.tpl line 1]: syntax error: invalid attribute name: 's:\home\myproject.ua\www..\smarty\Smarty_Compiler.class.php on line 2062
Что за синтаксическая ошибка?

   
 
 автор: sim5   (20.05.2008 в 12:57)   письмо автору
 
   для: Лена   (20.05.2008 в 12:32)
 

Ошибки в шаблоне:
В первой его строке, вместо фигурной закрывающей скобки, указана круглая скобка (об этом указано в ошибке).
Имя класса первого DIV не закрыто кавычками (хотя для смарти это не будет ошибкой).
Нет значений в $list - так лучше не писать, ибо так и будет выведено (если только это не для проверки).

   
 
 автор: Лена   (20.05.2008 в 14:46)   письмо автору
 
   для: sim5   (20.05.2008 в 12:57)
 

Ошибки исправила. Там еще одна была, вот здесь:
$smarty_news->assign('list', $rows_news);
а надо:
$smarty_news->assign('list', $rows);

Теперь блок foreah выводится как минимум раз тридцать, но мне же столько не нужно :-))
И вместо значений подставляется что-то непонятное:
2
2
2
Читать далее (Весь текст)
2
2
2
Читать далее (Весь текст)
0
0
0
Читать далее (Весь текст)
0
0
0
Читать далее (Весь текст)
1
1
1
Почему так?

   
 
 автор: sim5   (20.05.2008 в 14:54)   письмо автору
 
   для: Лена   (20.05.2008 в 14:46)
 

Потому, что в цикле переназначается while ($rows = mysql_fetch_array($result)) {.... }
Вот это ни как не должно быть в цикле:
это проверить просто
print"<pre>";
print_r ($rows);
print"</pre>";
//а это присвоить результат запроса
$smarty_news->assign('list', $rows);
$smarty_news->display("news1.tpl");

   
 
 автор: Лена   (20.05.2008 в 15:09)   письмо автору
 
   для: sim5   (20.05.2008 в 14:54)
 

Вот это у меня не выводится, это я просто проверяла, выводятся ли значения из базы: print"<pre>";
print_r ($rows);
print"</pre>";
Убрала цикл while. Вот что теперь:
$result = mysql_query("SELECT * FROM `news`");
if(!$result) exit(mysql_error()); 
$rows = mysql_fetch_array($result);
$smarty_news->assign('list', $rows); 
$smarty_news->display("news1.tpl");


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

   
 
 автор: sim5   (20.05.2008 в 15:12)   письмо автору
 
   для: Лена   (20.05.2008 в 15:09)
 

Определить массив до цикла, заполнить его в цикле, а уже потом его значение присвоить переменной Смарти:

<?
$result 
mysql_query("SELECT * FROM `news`"); 
if(!
$result) exit(mysql_error());  
$list = array();
while (
$rows mysql_fetch_assoc($result)) { //зачем получать еще и индексные значения, 
//если их не ипользовать
  
$list[] = $rows
}
$smarty_news->assign('list'$list);  
$smarty_news->display("news1.tpl");

   
 
 автор: Лена   (20.05.2008 в 15:25)   письмо автору
 
   для: sim5   (20.05.2008 в 15:12)
 

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

   
 
 автор: sim5   (20.05.2008 в 15:29)   письмо автору
 
   для: Лена   (20.05.2008 в 15:25)
 

Именно так. А если:
$rows = mysql_fetch_array($result);
то получим значения только первой записи.

   
 
 автор: Лена   (20.05.2008 в 16:03)   письмо автору
 
   для: sim5   (20.05.2008 в 15:29)
 

Понимаю, что яйца курицу не учат, но...
в обоих случаях выводятся все записи. Проверила.
Различие между mysql_fetch_array() и mysql_fetch_assoc() в том, что первый возвращает и числовые индексы, и ассоциативные. На этом различие заканчивается.
В нашем примере индексные значения не используются, и у нас все значения в цикле используются. Есть записи - цикл работает, нет - цикл прекращается. Тогда какая разница какую функцию нам использовать?
Не знаю, понятно я объяснила или нет. Взяла из вашего же учебника.

   
 
 автор: sim5   (20.05.2008 в 16:20)   письмо автору
 
   для: Лена   (20.05.2008 в 16:03)
 

Зачем получать массив, который вдвое больше по размеру и половина которого не используется? Работая с числовыми индексами, получайте как mysql_fetch_row() (кстати, это самый быстрый доступ), нужен ассоциативный массив, есть mysql_fetch_assoc(), ну а если нужны будут и те, и другие данные, то для этого и служит mysql_fetch_array(). Либо можно, применяя mysql_fetch_array(), указать параметр MYSQL_ASSOC, чтобы отсечь бесполезное для вашего случая.

   
 
 автор: Лена   (20.05.2008 в 16:49)   письмо автору
 
   для: sim5   (20.05.2008 в 16:20)
 

Большое дружное спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования