За последние 24 часа нас посетили 48516 программистов и 1729 роботов. Сейчас ищут 662 программиста ...

Ошибка в скрипте. Как сделать её вывод в браузер?

Тема в разделе "PHP для новичков", создана пользователем SpikePHP, 15 июн 2016.

  1. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Почему сервер возвращает пустую страницу с заголовком 500, если по идее должен вернуть ошибку парсинга с указанием номера строки?

    Допустим вот скрипт, где есть ошибка :

    PHP:
    1. <?php
    2. ini_set('display_startup_errors', 'E_ALL');
    3. ini_set('display_errors', 'E_ALL');
    4.  
    5. asdgasgdasgdga;// Сама ошибка
    6. ?>
    .htaccess у меня пустой

    Вот что говорит php_info() : http://rust.hostenko.com/phpinfo().html
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    E_ALL это константа, у неё есть значение, но ты похоже просто передал текст E_ALL, понимаешь например разницу между echo "$test"; и echo '$test'; и echo $test; ?

    Вот зарезервированные константы https://secure.php.net/manual/ru/reserved.constants.php
    Константы https://secure.php.net/manual/ru/language.constants.php

    Теперь по настройкам во время выполнения:
    https://secure.php.net/manual/ru/errorfunc.configuration.php
    display_startup_errors и display_errors принимают 0 или 1, а не E_ALL текст или 332767 которое возвращает константа E_ALL.

    Запусти и посмотри где там 0 или 1, нету
    PHP:
    1. var_export(E_ALL);
     
    SpikePHP нравится это.
  3. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Да. Получилось. Спасибо. Но еще вдогонку маленький вопрос : Почему при вызове функции, где есть ошибка в параметрах, сервер не возвращает никакой ошибки?
    Вот пример :
    PHP:
    1. <?php
    2. ini_set('display_startup_errors', E_ALL);
    3. ini_set('display_errors', E_ALL);
    4.  
    5. function abc($a = 1, $b = 2, $c = 3 ) {
    6. echo <<<HERE
    7. <pre>
    8. a=$a;
    9. b=$b;
    10. c=$c;
    11. HERE;
    12. }
    13.  
    14. abc(5,6,);//ошибка. забыл вставить число
    15. ?>
    И в ответ никакой ошибки. Хотя sandbox сервис возвращает ошибку :
    HTML:
    1. <br />
    2. <b>Parse error</b>:  syntax error, unexpected ')' in <b>[...][...]</b> on line <b>15</b><br />
    3.  
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  5. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Убрал значения по умолчанию из функции
    PHP:
    1. abc($a, $b, $c )
    . Результат такой же - ошибка не выводится, пустой экран.

    Ну да ладно. Фиг с этой скрытной ошибкой.

    Мне вот интересно как вызвать функцию abc($a=1, $b=2, $c=3 ); при этом указать только третий параметр, а первые два чтобы остались значения по умолчанию?
    PHP:
    1. <?php
    2. function abc($a = 1, $b = 2, $c = 3 ) {
    3. echo <<<HERE
    4. <pre>
    5. a=$a;
    6. b=$b;
    7. c=$c;
    8. HERE;
    9. }
    10.  
    11. abc(7);/*7 хочу поместить в $c. $a и $b должны быть по умолчанию*/
    12. ?>
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    может я что-то путаю, если ошибка 500, это проблемы в настройках апача (у апача ошибка), а не скрипта php.
     
  7. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Ни виртуальный мой сервер, ни хостинг не выводят в таком случае ошибок ¯\_(ツ)_/¯

    Но это ладно. Научите вызывать функцию указывая только третий параметр, а первые два, не трогать. Так вообще можно?
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    а откуда ты взял этот HERE?
    попробуй
    PHP:
    1. echo '<pre>';
    2. echo $a;
    3. echo $b;
    4. echo $c;
    5. echo '</pre>';
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    делай один аргумент, будешь туда отправлять массив, один массив по умолчанию соединяй с тем что пришёл и чтобы тот что пришёл переписывал тот что по умолчанию.
    В массиве порядок ключей не имеет значения.
     
    SpikePHP нравится это.
  10. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Изучал тут функции, и там было :
    "Вы можете не указывать параметры и это не вызовет ошибок, если у параметров есть значения по умолчанию". И мне стало интересно, а что если мне нужно изменить любой параметр, как тогда, ведь в том материале про функции этот вопрос не рассматривался.

    Значит в PHP нельзя указать abc(,,7); или что-то в этом роде.

    PHP:
    1. <?php
    2. function abc($a = 1, $b = 2, $c = 3 ) {
    3. echo "a=$a;";
    4. echo "b=$b;";
    5. echo "c=$c;";
    6. }
    7.  
    8. abc(5);//a=5;b=2;c=3;
    9. abc(5,6);//a=5;b=6;c=3;
    10. abc(5,6,7);//a=5;b=6;c=7;
    11. abc(,,7);//Хочу изменить только $c, $a и $b значения оставить по умолчанию. Но, увы, ошибка
    12. ?>
    Ну, нельзя значит. Ясненько. Спасибо, что помогли разобраться
    --- Добавлено ---
    Это способ вывода echo с помощью синтаксиса "here document". Удобная штука
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    PHP:
    1. abc(,,7);//Хочу изменить только $c, $a и $b значения оставить по умолчанию. Но, увы, ошибка
    нет, такое нельзя.
    а что есть какие то известные ЯП где можно?
     
  12. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Не уверен. Может и нельзя. Я следовал логике, что если можно указать для первого параметра, то можно и для последнего
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    нет, такого нет, мало того вот так НЕЛЬЗЯ сделать:
    PHP:
    1. function func($a = 10, $b) {}
     
  14. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Можно в Python, если я ничего не путаю.
    Код (Text):
    1. def foo(a=1, b=2, c=3):
    2.    print a+b+c
    3.  
    4. foo(c=6)
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Воу воу, полегче. Можно так делать!

    а вот так сто пудов нельзя. Зато можно так
    abc(7)
    и не важно, что там дальше еще аргументы, если у них предопределены значения.

    Нужно помнить так же, что парсер работает до выполнения скрипта, т.к. PHP является прекомпилируемым языком. Это означает что парсер работает до выполнения скрипта. После парсинга скрипт компилируется в бинарый код и после этого выполняется. Следовательно, инструкции
    не могут оказать на него влияния. Ошибки парсера будут валиться в браузер, если PHP подключен по SAPI/ISAPI и всегда пишутся в логи, если они включены.
     
  16. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    и как потом это использовать?
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Так же, как необязательные аргументы в функциях вроде substr() и многих других
     
  18. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    show me please.
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    PHP:
    1. function myStrpos($a, $b, $c) {
    2.    return strpos($a, $b, $c);
    3. }
    4. echo myStrpos('example',  'm'); // Warning: Missing argument 3 for myStrpos(), Notice:  Undefined variable: c, 3
    5.  
    6. function myStrpos2($a, $b, $c = 0) {
    7.    return strpos($a, $b, $c);
    8. }
    9. echo myStrpos2('example',  'm'); // 3
     
  20. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    @[vs] может мы друг друга не поняли, я речь вел что нельзя писать сначала не обязательные параметры, а потом обязательные, т.е. ($a = 10, $b)
    а то, что можно не обязательные параметры, это я в курсе :)
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @VLK ну а я тебя не понял, потому что формально так писать можно - язык не запрещает. Просто смысла в этом нет. Хотя, если очень заморочиться, то можно использовать с помощью Reflection (метод __named() взят из комментариев к мануалу https://php.ru/manual/reflectionmethod.invokeargs.html)
    PHP:
    1. $object = new BlackMagic;
    2. $object->__named('fn', array('arg2' => 'VLK'));
    3. $object->__named('fn', array('arg1' => 'Bye', 'arg2' => 'VLK'));
    4.  
    5. class BlackMagic {
    6.  
    7.     public function fn($arg1 = "Hello", $arg2) {
    8.         echo "$arg1, $arg2 ";
    9.     }
    10.  
    11.  
    12.       /**
    13.        * Pass method arguments by name
    14.        *
    15.        * @param string $method
    16.        * @param array $args
    17.        * @return mixed
    18.        */
    19.       public function __named($method, array $args = array())
    20.       {
    21.         $reflection = new ReflectionMethod($this, $method);
    22.  
    23.         $pass = array();
    24.         foreach($reflection->getParameters() as $param)
    25.         {
    26.           /* @var $param ReflectionParameter */
    27.           if(isset($args[$param->getName()]))
    28.           {
    29.             $pass[] = $args[$param->getName()];
    30.           }
    31.           else
    32.           {
    33.             $pass[] = $param->getDefaultValue();
    34.           }
    35.         }
    36.  
    37.         return $reflection->invokeArgs($this, $pass);
    38.       }
    39. }
     
    askanim и VLK нравится это.
  22. SpikePHP

    SpikePHP Активный пользователь

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Я разобрался. У меня в настройках апача AllowOverride None стояло :
    Код (Text):
    1. <Directory /var/www/>
    2. Options Indexes FollowSymLinks
    3. AllowOverride None
    4. Require all granted
    5. </Directory>
    После изменения на
    Код (Text):
    1. <Directory /var/www/>
    2. Options Indexes FollowSymLinks
    3. AllowOverride All
    4. Require all granted
    5. </Directory>
    появилось сообщение об ошибке прямо в браузере, как я и хотел :
    [​IMG]
     
    #22 SpikePHP, 12 июл 2016
    Последнее редактирование: 12 июл 2016