Запретить обновление столбца, если пустая или пустая переменная в PDO - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь получить поле обновления, чтобы администратор мог обновлять информацию о пользователе. Я застрял в пароле. Если я обновлю сейчас и оставлю пароль пустым, то он хеширует пустое значение и вставит его в БД. Я хочу сохранить предыдущее значение, если оно не изменено в форме.

Я посмотрел на это, так как оно было ближе всего к тому, что я ищу PHP MYSQL -> UPDATE столбец с переменной, если эта переменная не пуста или не пуста Это не ответь на мой вопрос. если у меня есть несколько запросов, я думаю, с помощью операторов. На самом деле я только хочу обновить отредактированные поля.

if(isset($_POST['register'])){

    error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR);

    $username = !empty($_REQUEST['username']) ? trim($_REQUEST['username']) : null;
    $pass     = !empty($_REQUEST['password']) ? trim($_REQUEST['password']) : null;
    $fname    = !empty($_REQUEST['fName']) ? trim($_REQUEST['fName']) : null;
    $lname    = !empty($_REQUEST['lName']) ? trim($_REQUEST['lName']) : null;
    $role     = !empty($_REQUEST['role']) ? trim($_REQUEST['role']) : null;
    $region   = !empty($_REQUEST['region']) ? trim($_REQUEST['region']) : null;
    $district = !empty($_REQUEST['district']) ? trim($_REQUEST['district']) : null;
    $id       = !empty($_REQUEST['ID']) ? trim($_REQUEST['ID']) : null;
    $location = !empty($_REQUEST['store']) ? trim($_REQUEST['store']) : null;
    $outlet   = !empty($_REQUEST['outletid']) ? trim($_REQUEST['outletid']) : null;

    $passwordHash = password_hash($pass, PASSWORD_BCRYPT, array("cost" => 12));

    $sql=$pdo->prepare("UPDATE users
                          SET username = :username,
                          password     = :password,
                          fName        = :fName,
                          lName        = :lName,
                          role         = :role,
                          region       = :region,
                          district     = :district,
                          outlet_id    = :outlet_id,
                          store_name   = :store_name
                        WHERE id = :id
                        ");
    $sql->bindParam(':username',$username);
    $sql->bindParam(':password',$passwordHash);
    $sql->bindParam(':fName',$fname);
    $sql->bindParam(':lName',$lname);
    $sql->bindParam(':role',$role);
    $sql->bindParam(':region',$region);
    $sql->bindParam(':district',$district);
    $sql->bindParam(':id',$id);
    $sql->bindParam(':outlet_id',$outlet);
    $sql->bindParam(':store_name',$location);

    if($sql->execute()){
    $_SESSION['success'] = "Successfully Updated Record";
    }// End of if profile is ok
    else{
    print_r($sql->errorInfo()); // if any error is there it will be posted
    $msg=" Database problem, please contact site admin ";
    }


}

Я пытался использовать CASE внутри оператора, но это выдает ошибку. Как я могу обновить данные пользователя, не удаляя данные в столбце?

IE: Если имя пользователя изменилось, просто отредактируйте это поле в БД. Если имя пользователя и пароль изменены, обновите оба.

Спасибо, ребята

РЕДАКТИРОВАТЬ:

Я пробовал это

    if(!empty(trim($_REQUEST['password']))){
      $passwordHash = password_hash($pass, PASSWORD_BCRYPT, array("cost" => 12));
    }

Это все еще обновляет пароль

Редактировать2:

"UPDATE users
                          SET username=:username,
                          password = CASE
                                      WHEN :password = '' THEN password
                                      ELSE :password
                                   END,
                          fName=:fName,
                          lName=:lName,
                          role=:role,
                          region=:region,
                          district=:district,
                          outlet_id=:outlet_id,
                          store_name=:store_name
                        WHERE id=:id");

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Это правильный подход. Но вы должны также использовать метод else, чтобы сохранить пароль тем же, если поле пароля пустое.

Если вы хотите обновить свой профиль:

$userSql = $pdo->prepare("SELECT * FROM users where id = :id");
$userSql->bindParam(':id',$id);
$userSql->execute();
$user = $userSql->fetch();

   if(!empty(trim($_REQUEST['password']))){
      $passwordHash = password_hash($pass, PASSWORD_BCRYPT, array("cost" => 12));
   }
   else {
      $passwordHash = $user['password']; //user password from db
   }
0 голосов
/ 25 марта 2020

Вы можете решить проблему по PHP. Вы удаляете обновление пароля из запроса, если пароль пуст.

$new_password = !empty(trim($_REQUEST['password']);
$sql=$pdo->prepare(
    "UPDATE users
         SET username = :username,"
        .($new_password ? "password = :password," :"")
           ."fName        = :fName,
             lName        = :lName,
             role         = :role,
             region       = :region,
             district     = :district,
             outlet_id    = :outlet_id,
             store_name   = :store_name
         WHERE id = :id");

$sql->bindParam(':username',$username);

if ($new_password) {
    $sql->bindParam(':password',$passwordHash);
}
$sql->bindParam(':fName',$fname);
$sql->bindParam(':lName',$lname);
$sql->bindParam(':role',$role);
$sql->bindParam(':region',$region);
$sql->bindParam(':district',$district);
$sql->bindParam(':id',$id);
$sql->bindParam(':outlet_id',$outlet);
$sql->bindParam(':store_name',$location);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...