Запрос на обновление PHP выполняется, но учетные данные не обновляются - PullRequest
0 голосов
/ 19 апреля 2019

У меня на сайте есть тег формы, который ведет на страницу PHP с электронной почтой и / или / без описания. На основании того, что код генерирует запрос, запрос должен обновить эти кредиты. Эта часть кода работает и была протестирована. Проблема в том, что база данных не обновляет электронную почту, но если я добавлю ее, чтобы обновить описание, она сделает это. Код имеет 3 проверки, если пользователь помещает только свою электронную почту, если он помещает только свое описание или ставит обе. Исходя из этого, код работает так:

<?php
session_start();
include_once 'connection.php';
$id = $_SESSION['user_id'];
if(isset($_POST['emailChange']) || isset($_POST['descChange'])){
       $desc = $_POST['descChange'];
       $email = $_POST['emailChange'];
       if(empty($email)){
           $query = "UPDATE users SET description = :descr WHERE user_id= :id ;";
           $stmt = $conn->prepare($query);
           $stmt->bindParam(":descr", $desc);
       } else if(empty($desc)){
           $query = "UPDATE users SET user_email= :email WHERE user_id= :id ;";
           $stmt = $conn->prepare($query);
           $stmt->bindParam(":email", $email);
       } else{
           $query = "UPDATE users SET description = :descr AND user_email = :email WHERE user_id= :id;";
           $stmt = $conn->prepare($query);
           $stmt->bindParam(":email", $email);
           $stmt->bindParam(":descr", $desc);
       }
       if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
           header("Location: ../profile.php?error=invalidEmail");
           exit();
       }
           $stmt->bindParam(":id", $id);
           $stmt->execute();
   }

Сама форма выглядит так:

 <form action="assets/upload.php" method="POST">
     <input type="text" name="emailChange" class="inputs" id="changeEmail" placeholder = "Enter your new E-mail">
     <input type="text" name="descChange" class="inputs" id="changeDesc" placeholder="Enter your description">
     <button type="submit" id="btnconfirmCreds" name="changeCreds">Confirm Changes</button>
 </form>

Имена в базе данных выглядят так:

[user_id][user_username][user_email][user_password][role_id][user_image][description][num_of_posts]

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Несколько замечаний по логике:

if(isset($_POST['emailChange']) || isset($_POST['descChange']))
{
    $desc = $_POST['descChange'];
    $email = $_POST['emailChange'];
    ...

Сначала вы проверяете, существует ли один параметр в аренде, но затем вы получаете доступ к обоим. Вы можете утверждать, что форма всегда отправляет оба, но никогда не верьте пользовательскому вводу: манипулирование данными так просто!

Измените if(...) на:

if( isset($_POST['emailChange']) && isset($_POST['descChange']) )

Следующая строка является более короткой формой с идентичной семантикой:

if( isset( $_POST['emailChange'], $_POST['descChange'] ) )

Другими способами является изменение 2 других строк, например:

    $desc  = isset($_POST['descChange'])  ? $_POST['descChange']  : '';
    $email = isset($_POST['emailChange']) ? $_POST['emailChange'] : '';
0 голосов
/ 19 апреля 2019

Вы должны настроить Регистрация ошибок PDO .


Из комментариев;Перефразировано для ясности:

Мой user_id столбец равен int(11) auto_increment

Ваша проблема в том, что вы пытаетесь вставить значение stringв числовой столбец в MySQL.

user_id / id на языке базы данных обычно является числовым значением, но вы не установили тип значения в SQL, поэтому по умолчанию используется значение string.

Поскольку ваше значение :id является числовым значением в PHP, вам необходимо сделать следующее:

$stmt->bindParam(":id", $id, 'i');  // i = integer type. 

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

Если данные, передаваемые в PDO, не соответствуют указанному типу значения, транзакция PDO будет аннулирована и не будет завершена.Это мера безопасности.

Например:

$id = 3;
$stmt->bindParam(":id", $id); 

Это то же самое, что сказать:

$stmt->bindParam(":id", 3, 's'); // default type value is 's' for string. 

Очевидно, что значение 3 не является строкой, поэтому эта транзакция ($stmt) никогда не выполняется.


Я предполагаю, что это потому, что он рассматривает описание как специальное слово, если это правда, тогда я должен изменить имя в моей базе данных.Мысли?

«описание» не является ни ключевым словом, ни зарезервированным словом в MySQL 5.5 -> 5.7
( в MySQL 8.0.4 DESCRIPTION является ключевым словом, но является не зарезервированное слово )
Вы можете просмотреть список ключевых слов MySQL и зарезервированных слов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...