0

我正在为我的网站制作一个 PHP 注册页面,我目前正在使用下面的代码来执行注册表单。目前如果刷新页面,提交数据到数据库后会重新提交。我知道如何使用标头重定向,我也会使用它。虽然我想去哪里如果有另一个用户使用相同的用户名,让脚本不提交到数据库中。我将如何使用 IF 函数继续执行此操作?

<?php
include 'dbconnect.php';
$birth_year= $_POST['year'];
$birth_month= $_POST['month'];
$birth_day= $_POST['day'];
$birthday=$_POST['year'].'-'.$_POST['month'].'-'.$_POST['day'];
$password=md5($_POST['password']);
$sql = "INSERT INTO users      (first_name,last_name,username,password,email,gender,birthday) VALUES (:first_name,:last_name,:username,:password,:email,:gender,:birthday)";
$q = $conn->prepare($sql);
$q->execute(array(':first_name'=>$_POST['first_name'],
          ':last_name'=>$_POST['last_name'],
          ':username'=>$_POST['username'],
          ':password'=>$password,
          ':email'=>$_POST['email'],
          ':gender'=>$_POST['gender'],
          ':birthday'=>$birthday));
?>
4

3 回答 3

2

获取行数,其中username=$_POST['username']

$username = $_POST['username'];
$checkexisting = $conn->prepare("SELECT COUNT(*) FROM users WHERE username=:username");

if($checkexisting->execute(array(':username' => $username))->fetchColumn() == 0) {
  // username does not exist
  // fetch column returns the first column from the select statement, which is COUNT(*)
}

或者将用户名列设为唯一 ID。这将防止该列直接在数据库中出现任何重复值。你必须为你的 SQL 语句准备好然后抛出错误。

此外,为了帮助刷新而不重新提交表单,请查看 John 使用 POST/REDIRECT/GET 的答案。

于 2013-03-07T15:39:29.513 回答
1

脚本不会“提交到数据库”。您的脚本将运行查询以尝试向数据库中插入一行。如果用户名是唯一的,则将其设为唯一索引,SQL INSERT 语句将失败并返回一个代码,告诉您该特定条目已经存在。

于 2013-03-07T15:39:59.110 回答
0

通过 POST 加载的页面将导致浏览器要求用户重新提交信息以查看页面,从而导致该页面执行的操作再次发生。

解决此问题的最佳方法是使用POST/REDIRECT/GET 模式我在我为 Authorize.Net 编写的关于处理付款的示例中使用了它。希望这会为您指明正确的方向。

于 2013-03-07T15:37:42.870 回答