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

问题描述 投票:0回答:2

我的网站上有一个表单标签,指向带有电子邮件和/或/无描述的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]

php pdo
2个回答
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不是一个字符串,所以这个transacion($stmt)从未执行过。


我认为这是因为它将描述视为一个特殊的单词,如果是真的那么我应该更改我的数据库中的名称。思考?

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


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'] : '';
© www.soinside.com 2019 - 2024. All rights reserved.