Я работаю в системе баз данных, и я стараюсь избегать повторяющихся записей для электронной почты и имени пользователя. Я пытался, но это все еще отклоняет, но не в состоянии точно видеть, что отклоняется.
Может кто-нибудь сказать, объясните, где я не прав?
if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$sql="INSERT into users (username,password,email) VALUES('$username','$password','$email')";
$result = mysql_query("INSERT INTO users VALUES ('duplicate')");
if (!$result) {
echo "Enter a different value";
} else {
echo "Save successful.";
}
}
Я формулирую этот ответ только для того, чтобы показать вам основы проверки на наличие дубликатов и вставки.
В конечном итоге вы должны установить ограничение UNIQUE для данного столбца (столбцов) и использовать условный оператор, основанный на результате ошибки.
Посоветуйтесь с моим сноски ниже в отношении безопасности.
Sidenote # 1: Вы можете удалить OR Username= '".$username."'
если вы не хотите проверять наличие электронной почты и имени пользователя.
Sidenote # 2: — Я не уверен, что имена ваших столбцов имеют смешанный регистр, поэтому вам, возможно, придется внести некоторые коррективы.
Sidenote # 2: — Убедитесь, что все ваши элементы содержат атрибут name и что форма действительно использует метод POST.
Сначала запросите, затем, если пользователь / электронная почта не существует, выполните INSERT.
Это, если вы уже создали Подключение к БД: (см. другие примечания ниже сносок, под «Установление соединения с БД»).
if(isset($_POST['submit'])){
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
$query = "SELECT * FROM users
where email='".$email."'
OR Username= '".$username."'";
$result = mysql_query($query);
if(mysql_num_rows($result) > 0){
echo "A record already exists.";
exit;
}
else{
$insert = mysql_query("INSERT into users (email, Username, Password)
VALUES ('".$email."','".$username."', '".$password."')");
}
if($insert){
echo "Success";
}
else{
echo "There was an error " . mysql_error();
}
mysql_close();
} // brace for if(isset($_POST['submit']))
Вы также можете заменить
$username = $_POST['username'];
$password = $_POST['password'];
$email = $_POST['email'];
с
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$email = mysql_real_escape_string($_POST['email']);
для некоторой дополнительной безопасности, пока вы не начнете использовать подготовленные заявления.
Примечания:
По поводу безопасности.
Не используйте старые mysql_
API, и вы не должны хранить пароли в виде простого текста.
использование mysqli
с подготовленными заявлениями, или же PDO с подготовленными заявлениями.
Для хранения пароля используйте CRYPT_BLOWFISH или PHP 5.5 password_hash()
функция.
Для PHP < 5.5 использовать password_hash() compatibility pack
.
Добавьте отчет об ошибках в начало файла (ов), который поможет найти ошибки.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
Примечание: Отчеты об ошибках должны выполняться только на стадии подготовки, а не на производстве.
Установление соединения с БД:
То есть из руководства mysql_select_db()
:
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
die('Not connected : ' . mysql_error());
}
// make foo the current db
$db_selected = mysql_select_db('foo', $link);
if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error());
}
Привет! Проверьте определение таблицы MySQL, если в столбце электронной почты и имени пользователя установлен UNIQUE KEY. Без этого флажка таблицы по-прежнему принимают все электронные письма и имена пользователей.
Также попробуйте получить информацию, если что-то плохое случится.
if (!$result) {
die('Invalid query: ' . mysql_error());
}
просто установите структуру столбца вашей таблицы электронной почты и имя пользователя на UNIQUE
тогда все будет хорошо.
если вы пытались вставить дубликаты данных
он не будет вставлен и mysql_query вернет false
При создании таблицы …
CREATE TABLE table_name (
column_name data_type(size) constraint_name
)
…Вы можете использовать UNIQUE
ограничение вот так:
CREATE TABLE table_name (
column_name data_type(size) UNIQUE
)
Это ограничение нечувствительно к регистру, что означаетИмя пользователя‘ а также ‘имя пользователясчитаются идентичными.
Нажмите Вот для получения дополнительной информации об этом ограничении.