2016-11-22 1 views
-3

Да, прежде чем вы укажете мне, чтобы установить столбец имени пользователя в первичный ключ, так что его не разрешено дублировать. Я уже использую первичный ключ для моего user_id, который находится на автоматическом приращении. Я надеялся, что смогу поставить чек на php, чтобы увидеть, было ли уже введено имя пользователя и отправить json_encode обратно в мое приложение. BTW, база данных размещается в Интернете, поэтому на самом деле не localhost!Как предотвратить дублирование имен пользователей на php/mysql?

Это то, что я использую сейчас, что не работает:

<?php 
    $con = mysqli_connect("localhost", "id177667_root", "***", "id177667_loginb"); 
    $name = $_POST["name"]; 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 
    $response = array(); 
    $dup = mysqli_query($con, "SELECT * FROM user WHERE username=$username"); 
    if(mysqli_num_rows($dup) > 0) { 
     $response["success"] = false; 
    } 
    else { 
     $statement = mysqli_prepare($con, "INSERT INTO user (name, username, password) VALUES (?, ?, ?)"); 
     mysqli_stmt_bind_param($statement, "sss", $name, $username, $password); 
     mysqli_stmt_execute($statement); 
     $response["success"] = true; 
    } 
    echo json_encode($response); 
?> 

Когда я бегу принимающей ссылку на это, я получаю success:true, но оно должно быть ложным:

<?php 
    $con = mysqli_connect("localhost", "id177667_root", "***", "id177667_loginb"); 
    $name = $_POST["name"]; 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 
    $response = array(); 
    $statement = mysqli_prepare($con, "SELECT * FROM user WHERE username=?"); 
    mysqli_stmt_bind_param($statement, "s", $username); 
    mysqli_stmt_execute($statement); 
    if(mysqli_num_rows($statement) > 0) { 
     $response["success"] = false; 
    } 
    else { 
     $statement = mysqli_prepare($con, "INSERT INTO user (name, username, password) VALUES (?, ?, ?)"); 
     mysqli_stmt_bind_param($statement, "sss", $name, $username, $password); 
     mysqli_stmt_execute($statement); 
     $response["success"] = true; 
    } 
    echo json_encode($response); 
?> 
+1

Строки нуждаются в одинарных кавычках вокруг них. например: '... WHERE username = '$ username'" '- и вы также должны использовать параметризованные запросы, а не только для вставки. И вы можете иметь более одного ограничения UNIQUE. – Qirel

+0

что именно делает это значит, я действительно новичок в этом! –

+1

Ваш первый запрос терпит неудачу, потому что вам нужно обернуть все строки в вашем операторе SQL в singlequotes '' ', поэтому' ... WHERE username = $ username "' становится '... WHERE username = '$ username' "'. И вы используете заполнители/подготовленный оператор для запроса INSERT - вы должны сделать то же самое для своего запроса SELECT. – Qirel

ответ

-2

создание цикла для проверки имени пользователя. эта ссылка может помочь вам

How to prevent duplicate Usernames in php/mysql

+0

Как говорится: «Ссылки идут плохо». Пожалуйста, объясните весь ответ в своем посте, а не просто отправьте сообщение Кроме того, я боюсь, что этот подход не очень хороший, поскольку он открыт для условий гонки и довольно хам-кулак. – ChristianF

+0

нет, это просто идея, что делать. вам нужно проверить, что имя пользователя введено с именем в базе данных. – nets0011

2

Вы можете сделать это, установив UNIQUE ограничение на имя пользователя в базе данных. Затем вы должны установить MySQLI (или PDO) в throw exceptions on errors.

Затем, когда пользователь пытается зарегистрировать дублированное имя пользователя, исключение генерируется с определенным кодом ошибки и сообщением. Затем это можно использовать, чтобы определить, когда у вас есть ситуация с «повторяющимся именем пользователя» и правильно обрабатывать его.

Это лучший способ убедиться, что не введены дублированные имена пользователей. Если вы сначала попытаетесь проверить, а затем напишите в базу данных, вы столкнетесь с условиями гонки. Значение двух записей может произойти в одно и то же время, после того, как оба проверили и увидели, что имя пользователя уже не существует.
Этот метод можно сделать устойчивым к условиям гонки, заблокировав стол перед чтением, а затем отпирая его после записи. Я бы не рекомендовал этот метод, так как число потенциальных ошибок резко возрастает.