Почему переменную R::store($user_change); не передаются значения при попытке обновить их в бд?

Подскажите пожалуйста почему не получается обновить в бд данные?

Пример инпута и пример запроса

<label class="form-label" for="account-username">Логин</label>
<input type="text" class="form-control" id="account-username" 
name="new_login" placeholder="<?php echo $logged_user_login; ?>" value=" 
<?php echo @$data['new_login'];?>"/>


 <?php 
 require 'db.php';
 session_start(); 


 $data = $_POST;
 if( isset($data['do_data']) ) {
 $errors = array();
 $showError = True;

 if ( $data['user_name'] == "" ) {
    $errors[] = 'Введите имя и фамилию';
 }

 if ( $data['user_phone'] == "" ) {
    $errors[] = 'Введите телефон';
 }

 if ( $data['user_country'] == "" ) {
    $errors[] = 'Введите название компании';
 }

 if( R::count('users', "login = ?", array($data['new_login'])) > 0)  {
  $errors[] = 'Пользователь с таким логином существует';

 }


 if( empty($errors)) {
    //$user_ids = $_SESSION['logged_user']->id;
    $user_change = R::findOne('users', "id = ?", array($_SESSION['logged_user']->id));
    //$user_change = R::exec("UPDATE `users` WHERE `id` = ?", ["$ids"]);
    //$user_change = R::load('user', $_SESSION['logged_user']->id);
    $user_change->login = $data['new_login'];
    $user_change->name = $data['user_name'];
    $user_change->phone = $data['user_phone'];
    $user_change->country = $data['user_country'];
    R::store($user_change);
    
    exit;
   }
   }

   ?>

Ответы (1 шт):

Автор решения: Егор Банин

Скорее всего, вы ничего не находите в findOne и дальше ничего не обновляете. Это происходит, вероятно, потому, что вы стартуете сессию после начала вывода. В документации к session_start сказано:

Для использования сессий на основе cookie, функция session_start() должна быть вызвана перед выводом чего бы то ни было в браузер.

Опытные программисты никогда не сталкиваются с такими проблемами, потому что они разрабатывают в окружении, которое не подавляет никакие ошибки. То есть у них есть локальная копия сайта, для которой error_reporting установлен в E_ALL и display_errors = 1.

Вы можете временно включить отображение ошибок для своего кусочка кода через функцию error_reporting и отображение ошибок через ini_set;

Опытные разработчики так же всегда кодируют обработку ошибок и особых случаев. Если метод может вернуть строку из базы данных или null, то для варианта с null обязательно надо написать код.

$logged_user = $_SESSION['logged_user']?? null;
if ($logged_user === null) {
    throw new \Exception('Пользователь не залогинен.');
}

$user_change = R::findOne('users', 'id = ?', [$logged_user->id]);
if ($user_change === null) {
    throw new \Exception(sprintf('Не найден пользователь %d', $logged_user->id));
}
→ Ссылка