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
Форумы портала PHP.SU :: Версия для печати :: heredoc не работает, как аргумент функции
Форумы портала PHP.SU » » Вопросы новичков » heredoc не работает, как аргумент функции

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

1. arimanecro - 07 Мая, 2015 - 16:10:50 - перейти к сообщению
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. }


почему так?
2. Sail - 07 Мая, 2015 - 16:17:52 - перейти к сообщению
arimanecro пишет:
почему так?

Однако, момент инициализации...
Строка в двойных кавычках - это ведь не шаблон.
3. arimanecro - 07 Мая, 2015 - 16:25:22 - перейти к сообщению
Sail
эээ...не совсем понял, о какой строчке в двойных кавычках вы говорите?
И момент инициализации чего?
4. Sail - 07 Мая, 2015 - 16:30:12 - перейти к сообщению
arimanecro пишет:
Sail
эээ...не совсем понял, о какой строчке в двойных кавычках вы говорите?
И момент инициализации чего?

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

Момент инициализации значения переменной.
(Добавление)
Это ведь не шаблон и не макроопределение...
5. Ts.Saltan - 07 Мая, 2015 - 19:40:34 - перейти к сообщению
Определение переменной $heredoc необходимо перенести в цикл while.
Ибо в первом случае, на момент определения $heredoc не определена переменная $row
6. arimanecro - 08 Мая, 2015 - 09:53:58 - перейти к сообщению
спс, инициализация помогла Круто
7. arhon88 - 04 Июня, 2015 - 16:31:10 - перейти к сообщению
тоже столкнулся с данной проблемой...
Ts.Saltan пишет:
Определение переменной $heredoc необходимо перенести в цикл while.


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

покажите, пожалуйста на примере с первого поста...
8. Ts.Saltan - 04 Июня, 2015 - 18:27:38 - перейти к сообщению
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.  
9. arhon88 - 05 Июня, 2015 - 10:58:30 - перейти к сообщению
Ts.Saltan

спасибон! теперь все стало на свои места Здорово
10. arimanecro - 05 Июня, 2015 - 11:20:28 - перейти к сообщению
Ts.Saltan

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

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

и где while? Растерялся
=========
и первый способ бессмысленный, так как он не позволяет использовать функцию, как она задумывалась, а именно, тупо подставлять разные хередоки. А в Вашем случае, хередок всегда будет один, и чтобы подставить другой хередок, нужно дублировать ф-ию, давать ей др.название и вставлять др.хередок
11. Ts.Saltan - 06 Июня, 2015 - 10:51:38 - перейти к сообщению
arimanecro пишет:
разве второй способ будет работать?

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

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

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


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

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

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

Откуда ж мне знать, для чего она там кем-то задумывалась? Каков был вопрос, на такой и ответил.
12. likvidator - 06 Июня, 2015 - 15:57:25 - перейти к сообщению
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.  
13. arimanecro - 06 Июня, 2015 - 17:57:46 - перейти к сообщению
likvidator
умно, плюсую Здорово
14. LIME - 06 Июня, 2015 - 18:00:20 - перейти к сообщению
можно и умнее
http://php.net/manual/ru/function.sprintf.php
15. arimanecro - 06 Июня, 2015 - 18:19:10 - перейти к сообщению
LIME
спс, жаль не могу плюсануть, так как не прошло 24 часа.

Благодаря sprintf удалось сократить три строчки и $base=$heredoc; уже не требуется Хорошо

 

Powered by ExBB FM 1.0 RC1