За последние 24 часа нас посетили 22673 программиста и 1258 роботов. Сейчас ищут 667 программистов ...

превращение int в boolean при return из функции

Тема в разделе "PHP для новичков", создана пользователем Krivetko83, 6 окт 2020.

  1. Krivetko83

    Krivetko83 Новичок

    С нами с:
    6 окт 2020
    Сообщения:
    8
    Симпатии:
    0
    Здравствуйте: Всю голову себе сломал, подскажите куда копать:
    Есть такая строка в коде:
    PHP:
    1. $id =0;
    2. $id = $this->ion_auth->register($identity, $password, $email, $additional_data,$group);
    3. var_dump($id);
    var_dump пишет bool(false)

    Попадая внутрь функции в конце видим:
    PHP:
    1.  
    2.         if (isset($id)) {
    3.             var_dump($id);
    4.             return $id;
    5.         } else {
    6.             return FALSE;
    7.         }
    var_dump пишет int (199)

    PHP Version 7.4.10


    Так тоже делал:
    PHP:
    1. public function register($identity, $password, $email, $additional_data = array(), $groups = array(), $registered_by=''): int
    2.     {
    Подскажите, где может теряться переменная?
     
    #1 Krivetko83, 6 окт 2020
    Последнее редактирование: 6 окт 2020
  2. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Корень проблемы - нехватка знаний. Почитайте про "области видимости в функциях и классах", найти легко.
     
  3. Krivetko83

    Krivetko83 Новичок

    С нами с:
    6 окт 2020
    Сообщения:
    8
    Симпатии:
    0
    С удовольствием почитаю. Спасибо. Но если мне сейчас нужно это пофиксить, что я могу сделать со своим объёмом знаний.

    Этот код не я придумал. Это было в продаваемом скрипте.
     
  4. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    По-сути, вам из метода register отдаётся либо целое число, либо false. Зачем тогда заморачиваться?

    PHP:
    1. <?php
    2. if( $id = $this->ion_auth->register($identity, $password, $email, $additional_data,$group) ) {
    3. // пользователь зареган
    4. echo "User id: {$id}";
    5. } else {
    6. // пользователь не зареган
    7. }
     
  5. Krivetko83

    Krivetko83 Новичок

    С нами с:
    6 окт 2020
    Сообщения:
    8
    Симпатии:
    0
    Это да, но у меня всегда $id = false. Даже если в return у меня целое число. Этоя проверял. Я так понял, что переменная недоступна из того места где вызывается функция register? То есть после return она перестает существовать?
    --- Добавлено ---
    У меня $id это указатель на ID записи БД после операции инсерт.
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    а покажите полный код функции... а то чего то недоговариваете
     
  7. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Совершенно верно.
    Конкретно в вашем случае (в области функции) - да.

    Я бы проверил подключение к бд, наличие таблиц. Если всё ок, я бы глянул что вообще происходит в этой функции..
     
  8. Krivetko83

    Krivetko83 Новичок

    С нами с:
    6 окт 2020
    Сообщения:
    8
    Симпатии:
    0
    Я так понимаю если в
    PHP:
    1.    var_dump($id); //int (199) здесь число всегда
    2.             return $id;
    var_dump выводит на страницу int (199).
    Затем идет return
    а потом в функции из которой вызывали
    PHP:
    1. $id = $this->ion_auth->register
    после этой строки var_dump выдает bool(false)

    значит что-то происходит между двумя var_dump

    upload_2020-10-6_13-33-49.png
     
  9. Krivetko83

    Krivetko83 Новичок

    С нами с:
    6 окт 2020
    Сообщения:
    8
    Симпатии:
    0
    PHP:
    1. public function register($identity, $password, $email, $additional_data = array(), $groups = array(), $registered_by=''): int
    2. {
    3. $this->trigger_events('pre_register');
    4. $id=0;
    5. $manual_activation = $this->config->item('manual_activation', 'ion_auth');
    6.  
    7. if ($this->identity_check($identity))
    8. {
    9. $this->set_error('account_creation_duplicate_identity');
    10. return FALSE;
    11. }
    12. elseif ( !$this->config->item('default_group', 'ion_auth') && empty($groups) )
    13. {
    14. $this->set_error('account_creation_missing_default_group');
    15. return FALSE;
    16. }
    17.  
    18. // check if the default set in config exists in database
    19. $query = $this->db->get_where($this->tables['groups'],array('name' => $this->config->item('default_group', 'ion_auth')),1)->row();
    20. if( !isset($query->id) && empty($groups) )
    21. {
    22. $this->set_error('account_creation_invalid_default_group');
    23. return FALSE;
    24. }
    25.  
    26. // capture default group details
    27. $default_group = $query;
    28.  
    29. // IP Address
    30. $ip_address = $this->_prepare_ip($this->input->ip_address());
    31. $salt = $this->store_salt ? $this->salt() : FALSE;
    32. $password = $this->hash_password($password, $salt);
    33.  
    34. $actv=0;
    35. if($registered_by=="googleplus" || $registered_by=="facebook")
    36. $actv=1;
    37.  
    38. // Users table.
    39. $data = array(
    40. $this->identity_column => $identity,
    41. 'password' => $password,
    42. 'email' => $email,
    43. 'ip_address' => $ip_address,
    44. 'created_on' => time(),
    45. 'phone_code' => $additional_data['phone_code'],
    46. 'active' => $actv //(($manual_activation === false) ? 1 : 0)
    47. );
    48.  
    49. if ($this->store_salt)
    50. {
    51. $data['salt'] = $salt;
    52. }
    53.  
    54. // filter out any data passed that doesnt have a matching column in the users table
    55. // and merge the set user data and the additional data
    56. $user_data = array_merge($this->_filter_data($this->tables['users'], $additional_data), $data);
    57.  
    58. $this->trigger_events('extra_set');
    59.  
    60. $this->db->insert($this->tables['users'], $user_data);
    61. $id = $this->db->insert_id();
    62. // add in groups array if it doesn't exits and stop adding into default group if default group ids are set
    63. if( isset($default_group->id) && empty($groups) )
    64. {
    65. $groups[] = $default_group->id;
    66. }
    67.  
    68. if (!empty($groups))
    69. {
    70. // add to groups
    71. foreach ($groups as $group)
    72. {
    73. $this->add_to_group($group, $id);
    74. }
    75. }
    76.  
    77. $this->trigger_events('post_register');
    78. if (isset($id)) {
    79. var_dump($id); //int(199)
    80. return $id;
    81. } else {
    82. return FALSE;
    83. }
    84. }
     
    #9 Krivetko83, 6 окт 2020
    Последнее редактирование: 6 окт 2020
  10. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    1. У вас $id существует всегда, даже когда вставка в бд не происходит, так как объявлена и равняется нулю
    2. Непонятно, зачем если объявляете функцию типом int возвращать в ряде случаев false?
    --- Добавлено ---
    Ну и посмотрите каков синтаксис определения выходного типа... Может в этом дело?
    https://webformyself.com/php-7-obyavlenie-vozvrashhaemogo-tipa/
     
  11. Krivetko83

    Krivetko83 Новичок

    С нами с:
    6 окт 2020
    Сообщения:
    8
    Симпатии:
    0
    PHP:
    1. public function register($identity, $password, $email, $additional_data = array(), $groups = array(), $registered_by=''): int
    2.     {
    Писал просто return $id; не помогает, все равно оно превращается в bool
     
  12. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    738
    Адрес:
    Татарстан
    а нет ли функций с одинаковыми именами?

    PHP:
    1. $this->ion_auth->register(...)
    и
    PHP:
    1. $this->register(...)
    попробуйте вставить перед return - debug_print_backtrace();
     
  13. Krivetko83

    Krivetko83 Новичок

    С нами с:
    6 окт 2020
    Сообщения:
    8
    Симпатии:
    0
    Код (Text):
    1. #0  Ion_auth_model->register(filippomazzamuto@yahoo.cvv, ###########, filippomazzamuto@yahoo.cvv, Array ([username] => User Name,[slug] => --1,[first_name] => User,[last_name] => Name,[pin_code] => ,[phone_code] => 93,[phone] => +799999999,[age] => 25,[tutor_price] => 4,[photo] => ,[user_belongs_group] => 3), Array ([0] => 3), ) called at [/home/application/libraries/Ion_auth.php:355]
    2. #1  Ion_auth->register(filippomazzamuto@yahoo.cvv, PASS, filippomazzamuto@yahoo.cvv, Array ([username] => User Name,[slug] => --1,[first_name] => USER,[last_name] => NAME,[pin_code] => ,[phone_code] => 93,[phone] => +799999999,[age] => 25,[tutor_price] => 4,[photo] => ,[user_belongs_group] => 3), Array ([0] => 3)) called at [/web/htdocs/www.unconventionalteaching.it/home/application/modules/auth/controllers/Auth.php:943]
    3. #2  Auth->login() called at [/web/htdocs/www.unconventionalteaching.it/home/system/core/CodeIgniter.php:514]
    4. #3  require_once(/web/htdocs/www.unconventionalteaching.it/home/system/core/CodeIgniter.php) called at [/web/htdocs/www.unconventionalteaching.it/home/index.php:312]
    Но запись в БД нормально создается
     
  14. Krivetko83

    Krivetko83 Новичок

    С нами с:
    6 окт 2020
    Сообщения:
    8
    Симпатии:
    0
    Спасибо. да было 2 функции.