我的网站上有一个表单标签,指向带有电子邮件和/或/无描述的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]
你应该设置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 。
关于逻辑的一些注意事项:
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'] : '';