PHP Update查询正在执行,但凭据未更新

时间:2019-04-19 20:15:37

标签: php pdo

我的网站上有一个表单标签,该表单标签指向带电子邮件和/或/没有描述的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 :(得分:0)

您应该设置PDO error logging


来自评论;为了清楚起见,解释如下:

  

我的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)。


  

我认为这是因为它将描述视为一个特殊的词,如果是这样,那么我应该在数据库中更改名称。有想法吗?

“ description”在MySQL 5.5-> 5.7中既不是关键字也不是保留字。
在MySQL 8.0.4 DESCRIPTION中是关键字,但不是 保留字
您可以查看list of MySQL Keywords and Reserved words

答案 1 :(得分:0)

有关逻辑的一些说明:

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'] : '';