如何检查数据库中重复的用户名?
How to check duplicate username in the database?
我在将数据保存到数据库时遇到问题。我的情况是,当我将数据保存到数据库 table (user
) 时,新用户名不能与 table 中已有的用户名相同。
下面是我的代码,用于检查插入用户名是否与现有用户名相同,如果不相同则可以插入到 table,但我的代码不起作用,任何人都可以指导我哪一部分我错了。
save
$arr_val = $_POST;
$arr_val = $_POST;
$loc = $arr_val['loc'];
$action = $arr_val['action'];
$id = $arr_val['id'];
$type = $arr_val['type'];
unset($arr_val['loc']);
unset($arr_val['action']);
unset($arr_val['filter_id']);
unset($arr_val['type']);
$table = 'user';
if ($action == 'save') {
$query_user = mysqli_query($mysql_con, 'SELECT * FROM user WHERE username="' . $arr_val['username'] . '"');
$num_user = mysqli_num_rows($query_user);
if(count($num_user)>0){
echo "Duplicate username";
}elseif($num_user == 0) {
$key_relationship_1[] = 'is_active';
$val_relationship_1[] = convert_db_value('1');
$key_relationship_1[] = 'user_type';
$val_relationship_1[] = convert_db_value('1');
$key_relationship_1[] = 'created';
$val_relationship_1[] = convert_db_value($cur_dt);
$key_relationship_1[] = 'createdby';
$val_relationship_1[] = convert_db_value($user_name);
$key_relationship_1[] = 'modified';
$val_relationship_1[] = convert_db_value($cur_dt);
$key_relationship_1[] = 'modifiedby';
$val_relationship_1[] = convert_db_value($user_name);
$key_relationship_1[] = 'username';
$val_relationship_1[] = convert_db_value($_POST['username']);
$key_relationship_1[] = 'name';
$val_relationship_1[] = convert_db_value($_POST['name']);
$key_relationship_1[] = 'email';
$val_relationship_1[] = convert_db_value($_POST['email']);
$row_insert = db_conn_insert('user', $key_relationship_1, $val_relationship_1);
$sql_insert = $row_insert['sql'];
$error_insert = $row_insert['error'];
$record_id = $row_insert['record_id'];
unset($key_relationship_1);
unset($val_relationship_1);
}
elseif ($row_insert) {
echo 'Saved successfully';
}
输出如下所示:
此输出我尝试插入与 table "user" 相同的用户名。
如果去掉"count",输出如下:
永远不要仅仅依靠 SELECT 的结果来确定记录是否唯一。另一个进程有可能在 SELECT 完成和随后的 INSERT 完成之间插入具有相同值的记录——然后你就有了重复项。 only 确保数据库字段中唯一值的方法是对其使用 UNIQUE
约束。实现各不相同,但 here 是 MySQL.
中的示例
有了 UNIQUE
约束,重复的 INSERT 尝试将失败,因此您需要确保检查所有数据库函数调用的 return 状态。
另请注意,您的代码容易受到攻击SQL injection attacks. You should use prepared statements with bound parameters, via either mysqli or PDO. This post有一些很好的例子。
您return通过以下查询搜索了一些用户,
$num_user = mysqli_num_rows($query_user);
mysqli_num_rows 将始终 return 结果集中的行数。
但是在下面的语句中,
if(count($num_user) > 0) {
echo "Duplicate username";
}
您正在使用 count() 功能。 count()
函数 return 是数组中元素的数量。由于 $num_user
不是一个数组,你应该得到如下错误,
count(): Parameter must be an array or an object that implements
Countable
您不需要使用 count()
函数,因为 $num_user
已经是一个数字。
按如下方式使用即可,
if($num_user > 0) {
echo "Duplicate username";
}
希望对您有所帮助!
我在将数据保存到数据库时遇到问题。我的情况是,当我将数据保存到数据库 table (user
) 时,新用户名不能与 table 中已有的用户名相同。
下面是我的代码,用于检查插入用户名是否与现有用户名相同,如果不相同则可以插入到 table,但我的代码不起作用,任何人都可以指导我哪一部分我错了。
save
$arr_val = $_POST;
$arr_val = $_POST;
$loc = $arr_val['loc'];
$action = $arr_val['action'];
$id = $arr_val['id'];
$type = $arr_val['type'];
unset($arr_val['loc']);
unset($arr_val['action']);
unset($arr_val['filter_id']);
unset($arr_val['type']);
$table = 'user';
if ($action == 'save') {
$query_user = mysqli_query($mysql_con, 'SELECT * FROM user WHERE username="' . $arr_val['username'] . '"');
$num_user = mysqli_num_rows($query_user);
if(count($num_user)>0){
echo "Duplicate username";
}elseif($num_user == 0) {
$key_relationship_1[] = 'is_active';
$val_relationship_1[] = convert_db_value('1');
$key_relationship_1[] = 'user_type';
$val_relationship_1[] = convert_db_value('1');
$key_relationship_1[] = 'created';
$val_relationship_1[] = convert_db_value($cur_dt);
$key_relationship_1[] = 'createdby';
$val_relationship_1[] = convert_db_value($user_name);
$key_relationship_1[] = 'modified';
$val_relationship_1[] = convert_db_value($cur_dt);
$key_relationship_1[] = 'modifiedby';
$val_relationship_1[] = convert_db_value($user_name);
$key_relationship_1[] = 'username';
$val_relationship_1[] = convert_db_value($_POST['username']);
$key_relationship_1[] = 'name';
$val_relationship_1[] = convert_db_value($_POST['name']);
$key_relationship_1[] = 'email';
$val_relationship_1[] = convert_db_value($_POST['email']);
$row_insert = db_conn_insert('user', $key_relationship_1, $val_relationship_1);
$sql_insert = $row_insert['sql'];
$error_insert = $row_insert['error'];
$record_id = $row_insert['record_id'];
unset($key_relationship_1);
unset($val_relationship_1);
}
elseif ($row_insert) {
echo 'Saved successfully';
}
输出如下所示:
此输出我尝试插入与 table "user" 相同的用户名。
如果去掉"count",输出如下:
永远不要仅仅依靠 SELECT 的结果来确定记录是否唯一。另一个进程有可能在 SELECT 完成和随后的 INSERT 完成之间插入具有相同值的记录——然后你就有了重复项。 only 确保数据库字段中唯一值的方法是对其使用 UNIQUE
约束。实现各不相同,但 here 是 MySQL.
有了 UNIQUE
约束,重复的 INSERT 尝试将失败,因此您需要确保检查所有数据库函数调用的 return 状态。
另请注意,您的代码容易受到攻击SQL injection attacks. You should use prepared statements with bound parameters, via either mysqli or PDO. This post有一些很好的例子。
您return通过以下查询搜索了一些用户,
$num_user = mysqli_num_rows($query_user);
mysqli_num_rows 将始终 return 结果集中的行数。
但是在下面的语句中,
if(count($num_user) > 0) {
echo "Duplicate username";
}
您正在使用 count() 功能。 count()
函数 return 是数组中元素的数量。由于 $num_user
不是一个数组,你应该得到如下错误,
count(): Parameter must be an array or an object that implements Countable
您不需要使用 count()
函数,因为 $num_user
已经是一个数字。
按如下方式使用即可,
if($num_user > 0) {
echo "Duplicate username";
}
希望对您有所帮助!