Да, прежде чем вы укажете мне, чтобы установить столбец имени пользователя в первичный ключ, так что его не разрешено дублировать. Я уже использую первичный ключ для моего 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);
?>
Строки нуждаются в одинарных кавычках вокруг них. например: '... WHERE username = '$ username'" '- и вы также должны использовать параметризованные запросы, а не только для вставки. И вы можете иметь более одного ограничения UNIQUE. – Qirel
что именно делает это значит, я действительно новичок в этом! –
Ваш первый запрос терпит неудачу, потому что вам нужно обернуть все строки в вашем операторе SQL в singlequotes '' ', поэтому' ... WHERE username = $ username "' становится '... WHERE username = '$ username' "'. И вы используете заполнители/подготовленный оператор для запроса INSERT - вы должны сделать то же самое для своего запроса SELECT. – Qirel