PHP代码未在MYSQL数据库PDO中插入详细信息
所以我有一段代码,当有人按下“注册”按钮时,我正在执行它 这件事我已经读了10遍了,找不到我做错了什么 问题是:当您单击register时,它不会将详细信息插入数据库(即使它说它已注册用户)。我甚至浏览了我的db.php,在那里我存储了数据库的详细信息 注册页面代码:PHP代码未在MYSQL数据库PDO中插入详细信息,php,mysql,pdo,Php,Mysql,Pdo,所以我有一段代码,当有人按下“注册”按钮时,我正在执行它 这件事我已经读了10遍了,找不到我做错了什么 问题是:当您单击register时,它不会将详细信息插入数据库(即使它说它已注册用户)。我甚至浏览了我的db.php,在那里我存储了数据库的详细信息 注册页面代码: <?php if(isset($_POST['register'])){ $username = $_POST['username'];
<?php
if(isset($_POST['register'])){
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$checkUsername = $odb->prepare("SELECT COUNT(*) FROM users WHERE username = :username");
$checkUsername->execute(array(':username' => $username));
$countUsername = $checkUsername -> fetchColumn(0);
$checkEmail = $odb->prepare("SELECT COUNT(*) FROM users WHERE email = :email");
$checkEmail->execute(array(':email' => $email));
$countEmail = $checkEmail -> fetchColumn(0);
if(!($countEmail == 0))
{
echo '<p>This e-mail has been taken.</p>';
}
elseif(!($countUsername == 0))
{
echo '<p>Error - this username has been taken.</p>';
}
else
{
try
{
$insertUser = $odb -> prepare('INSERT INTO users (username,password,email) VALUES(:username, :password, :email)');
$insertUser -> execute(array(':username' => $username, ':password' => $password, ':email' => $email));
echo 'Sucessfully registered.';
}
catch (PDOException $e)
{
echo 'Error: ' .$e->getMessage();
}
}
}
?>
我希望有人知道发生了什么,谢谢 我认为您在PDO数据方面有问题,请检查以下内容:
我是一个MYSQL的家伙,但是我在不使用MYSQL\u real\u escape\u字符串时遇到了相同的错误,这个错误看起来与PDO相同。您的表单是作为get请求处理的,而不是POST。默认的表单方法是GET,因此可以更改/add
method=“post”
或使用$\u GET
。发送用户私有用户数据时,使用POST
是一个更好的选择
备选方案A:
<form method="POST">
选项B(更改变量分配):
if(isset($\u GET['register'])){
$username=$_GET['username'];
$password=$_GET['password'];
$email=$_获取['email'];
$checkUsername=$odb->prepare(“从username=:username的用户中选择COUNT(*));
$checkUsername->execute(数组(':username'=>$username));
$countUsername=$checkUsername->fetchColumn(0);
$checkEmail=$odb->prepare(“从email=:email的用户中选择COUNT(*));
$checkEmail->execute(数组(':email'=>$email));
$countEmail=$checkEmail->fetchColumn(0);
如果(!($countEmail==0)){
回显“此电子邮件已被接收。”;
}elseif(!($countUsername==0)){
回显“错误-已使用此用户名。”;
}否则{
试一试{
$insertUser=$odb->prepare('INSERT INTO users(用户名、密码、电子邮件)值(:用户名、密码、电子邮件)');
$insertUser->execute(数组(“:username'=>$username,”:password'=>$password,”:email'=>$email));
echo“成功注册”;
}捕获(PDO$e){
回显“错误:”。$e->getMessage();
}
}
}
正如前面提到的,密码不应该以纯文本形式存储。MD5和SHA1比这更好,但它们不再是最好的方法。看看这些帖子:
您是在发邮件还是在收邮件?你得到的确切信息是什么<代码>成功注册。当
如果(isset($\u GET['register']){
我想你正在发送一个GET,所以所有值都是空的$\u POST
未设置。是的,当如果(isset($\u GET['register']){
当我发送如果(isset($\u POST['register']),如何){
我没有收到回显消息,也没有向数据库添加任何内容?因此,您正在发送get
notPOST
。更改表单方法或变量分配。此外,您不应该存储纯文本密码。PDO用法正确,变量分配不正确。您应该熟悉PDO
或者mysqli
Mysql\uuu
函数已经过时/不安全。我已经在使用mysqli,我知道Mysql已经过时了。但是即使在mysqli中,你也有真正的_escape_字符串。你应该继续讨论这个话题。而且我在第一部分说,发送到PDO的数据可能是错误的。即使这样,一个语句也是正确的,因为变量assig这是不正确的。结束对我的观点的讨论你不应该逃避你应该使用准备好的陈述。我也在这个话题上。我在你的“答案”前10分钟解决了这个问题。至于在mysqli
中转义,…因此,对于数据库安全性这一要素,预先准备好的语句只是一种更方便、更不容易出错的方法。
来自mysqli手册。主题结束。甚至对垃圾话都不感兴趣。祝你好运。
<form method="POST">
if(isset($_GET['register'])){
$username = $_GET['username'];
$password = $_GET['password'];
$email = $_GET['email'];
$checkUsername = $odb->prepare("SELECT COUNT(*) FROM users WHERE username = :username");
$checkUsername->execute(array(':username' => $username));
$countUsername = $checkUsername -> fetchColumn(0);
$checkEmail = $odb->prepare("SELECT COUNT(*) FROM users WHERE email = :email");
$checkEmail->execute(array(':email' => $email));
$countEmail = $checkEmail -> fetchColumn(0);
if(!($countEmail == 0)) {
echo '<p>This e-mail has been taken.</p>';
} elseif(!($countUsername == 0)) {
echo '<p>Error - this username has been taken.</p>';
} else {
try {
$insertUser = $odb -> prepare('INSERT INTO users (username,password,email) VALUES(:username, :password, :email)');
$insertUser -> execute(array(':username' => $username, ':password' => $password, ':email' => $email));
echo 'Sucessfully registered.';
} catch (PDOException $e) {
echo 'Error: ' .$e->getMessage();
}
}
}