Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: heredoc не работает, как аргумент функции

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
arimanecro
Отправлено: 07 Мая, 2015 - 16:10:50
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. function test($heredoc) {
  3. $q_r = mysqli_query($conn, "SELECT * FROM test");
  4. while($row = mysqli_fetch_assoc($q_r)) {
  5. echo $heredoc;
  6. }
  7. }
  8.  
  9. $heredoc = <<<EOD
  10. <div style='width: 600px; height: 600px; margin: 0 auto; border:rgba(0,0,0,1.00) thin solid;'>
  11. <p>Name: {$row['t_name']}</p>
  12. <p>Description: {$row['description']}</p>
  13. </div>
  14. EOD;
  15.  
  16. test($heredoc);
  17.  


указанные элементы массива не выведутся, но если вывести хередок не как аргумент ф-ии, а сразу, то все сработает:

PHP:
скопировать код в буфер обмена
  1. function test() {
  2. $q_r = mysqli_query($conn, "SELECT * FROM test");
  3. while($row = mysqli_fetch_assoc($q_r)) {
  4. echo $heredoc = <<<EOD
  5. <div style='width: 600px; height: 600px; margin: 0 auto; border:rgba(0,0,0,1.00) thin solid;'>
  6. <p>Name: {$row['t_name']}</p>
  7. <p>Description: {$row['description']}</p>
  8. </div>
  9. EOD;
  10. }
  11. }


почему так?
 
 Top
Sail
Отправлено: 07 Мая, 2015 - 16:17:52
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




arimanecro пишет:
почему так?

Однако, момент инициализации...
Строка в двойных кавычках - это ведь не шаблон.
 
 Top
arimanecro
Отправлено: 07 Мая, 2015 - 16:25:22
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




Sail
эээ...не совсем понял, о какой строчке в двойных кавычках вы говорите?
И момент инициализации чего?
 
 Top
Sail
Отправлено: 07 Мая, 2015 - 16:30:12
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




arimanecro пишет:
Sail
эээ...не совсем понял, о какой строчке в двойных кавычках вы говорите?
И момент инициализации чего?

Ознакомьтесь: PHP: Строки
Спойлер (Отобразить)

Момент инициализации значения переменной.
(Добавление)
Это ведь не шаблон и не макроопределение...
 
 Top
Ts.Saltan
Отправлено: 07 Мая, 2015 - 19:40:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


Помог: 22 раз(а)




Определение переменной $heredoc необходимо перенести в цикл while.
Ибо в первом случае, на момент определения $heredoc не определена переменная $row
 
 Top
arimanecro
Отправлено: 08 Мая, 2015 - 09:53:58
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




спс, инициализация помогла Круто
 
 Top
arhon88
Отправлено: 04 Июня, 2015 - 16:31:10
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Июнь 2015  


Помог: 0 раз(а)




тоже столкнулся с данной проблемой...
Ts.Saltan пишет:
Определение переменной $heredoc необходимо перенести в цикл while.


а как инициализировать?
если написать $heredoc = '';
то он и будет выводить в цикле пустоту.

покажите, пожалуйста на примере с первого поста...
 
 Top
Ts.Saltan
Отправлено: 04 Июня, 2015 - 18:27:38
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


Помог: 22 раз(а)




PHP:
скопировать код в буфер обмена
  1. $heredoc = <<<EOD
  2. <div style='width: 600px; height: 600px; margin: 0 auto; border:rgba(0,0,0,1.00) thin solid;'>
  3. <p>Name: {$row['t_name']}</p>
  4. <p>Description: {$row['description']}</p>
  5. </div>
  6. EOD;
  7.  
  8. test($heredoc);


на момент определения переменной $heredoc, откуда берётся переменная $row? какое у неё значение? Должен вылезти notice, а вместо переменной берётся null


arhon88 пишет:
а как инициализировать?
если написать $heredoc = '';
то он и будет выводить в цикле пустоту.

Вариант 1. Переменную определять внутри функции. Тогда надо использовать global или пусть сама функция передаёт значение переменной. Ну или передавать ссылку на переменную.
Вариант 2. Пусть функция возвращает массив значений, а уже вне функции мы определим переменную.

PHP:
скопировать код в буфер обмена
  1. //1.
  2. function test() {
  3. global $heredoc;
  4. $q_r = mysqli_query($conn, "SELECT * FROM test");
  5. while($row = mysqli_fetch_assoc($q_r)) {
  6. echo $heredoc = <<<EOD
  7. <div style='width: 600px; height: 600px; margin: 0 auto; border:rgba(0,0,0,1.00) thin solid;'>
  8. <p>Name: {$row['t_name']}</p>
  9. <p>Description: {$row['description']}</p>
  10. </div>
  11. EOD;
  12. }
  13. }
  14.  
  15. $heredoc = NULL;
  16. test();
  17.  
  18. //2
  19. function test2($heredoc) {
  20. $q_r = mysqli_query($conn, "SELECT * FROM test");
  21. return mysqli_fetch_assoc($q_r);
  22. }
  23.  
  24. $row= test2();
  25. $heredoc = <<<EOD
  26. <div style='width: 600px; height: 600px; margin: 0 auto; border:rgba(0,0,0,1.00) thin solid;'>
  27. <p>Name: {$row['t_name']}</p>
  28. <p>Description: {$row['description']}</p>
  29. </div>
  30. EOD;
  31.  
 
 Top
arhon88
Отправлено: 05 Июня, 2015 - 10:58:30
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Июнь 2015  


Помог: 0 раз(а)




Ts.Saltan

спасибон! теперь все стало на свои места Здорово
 
 Top
arimanecro
Отправлено: 05 Июня, 2015 - 11:20:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




Ts.Saltan

а разве второй способ будет работать?

$row= test2(); // здесь пропущен аргумент $heredoc, сразу показывает ошибку Warning: Missing argument 1 for test2()

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

(Отредактировано автором: 05 Июня, 2015 - 11:23:32)

 
 Top
Ts.Saltan
Отправлено: 06 Июня, 2015 - 10:51:38
Post Id



Посетитель


Покинул форум
Сообщений всего: 384
Дата рег-ции: Дек. 2013  
Откуда: Belarus


Помог: 22 раз(а)




arimanecro пишет:
разве второй способ будет работать?

Точно, у функции тест2 надо убрать аргумент

arimanecro пишет:
и где while?

Если результат содержит одну строку, цикл не нужен. А судя по коду первого сообщения, даже если результатов несколько, переменная heredoc всё равно переопределится.
Если надо вернуть несколько строк без цикла - mysqli_fetch_all


arimanecro пишет:
и первый способ бессмысленный

Такой подход с heredoc и с мешаниной php и html кода в принципе не верный. Надо в таком случае использовать шаблонизаторы.

arimanecro пишет:
он не позволяет использовать функцию, как она задумывалась

Откуда ж мне знать, для чего она там кем-то задумывалась? Каков был вопрос, на такой и ответил.
 
 Top
likvidator
Отправлено: 06 Июня, 2015 - 15:57:25
Post Id


Посетитель


Покинул форум
Сообщений всего: 416
Дата рег-ции: Март 2012  


Помог: 4 раз(а)

[+]


PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function test($heredoc) {
  4. $base=$heredoc;
  5. $q_r = mysqli_query($conn, "SELECT * FROM test");
  6.  
  7. while($row = mysqli_fetch_assoc($q_r)) {
  8. $heredoc=str_replace("[[t_name]]", $row['t_name'], $base);
  9. $heredoc=str_replace("[[t_description]]", $row['t_description'], $heredoc);
  10. echo $heredoc;
  11.  
  12. }
  13.  
  14. }
  15.  
  16.  
  17.  
  18. $heredoc = "<div style='width: 600px; height: 600px; margin: 0 auto; border:rgba(0,0,0,1.00) thin solid;'>
  19. <p>Name: [[t_name]]</p>
  20. <p>Description: [[description]]</p>
  21. </div>";
  22.  
  23. test($heredoc);
  24. ?>
  25.  
 
 Top
arimanecro
Отправлено: 06 Июня, 2015 - 17:57:46
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




likvidator
умно, плюсую Здорово
 
 Top
LIME
Отправлено: 06 Июня, 2015 - 18:00:20
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




 
 Top
arimanecro
Отправлено: 06 Июня, 2015 - 18:19:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




LIME
спс, жаль не могу плюсануть, так как не прошло 24 часа.

Благодаря sprintf удалось сократить три строчки и $base=$heredoc; уже не требуется Хорошо
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB