2013-06-25 5 views
0

Я только недавно задал вопрос и получил мой код фиксируется на картинке ниже:Дубликат Учетные записи пользователей

{ 
//Check if user already exists 
$un_check = mysql_query("SELECT Username FROM users WHERE Username = '$un'"); 
if(mysql_num_rows($un_check) >0) { 
echo "Username already exists"; 
} 
else{ 
// Username Free 
} 

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

Это проблема с моим кодом или с базой данных?

+3

Ваш код уязвим для SQL-инъекций! –

+2

* Обязательно: * Функции 'mysql_ *' будут [устарели в PHP 5.5] (http://php.net/manual/en/faq.databases.php#faq.databases.mysql.deprecated). Не рекомендуется писать новый код, поскольку он будет удален в будущем. Вместо этого либо [MySQLi] (http://php.net/manual/en/book.mysqli.php), либо [PDO] (http://php.net/manual/en/book.pdo.php) и [быть лучшим разработчиком PHP] (http://jason.pureconcepts.net/2012/08/better-php-developer/). –

+0

Это чек, и вам нужно закодировать, что должно произойти в зависимости от результата этой проверки. Мы не можем написать код до ваших требований здесь – Stoleg

ответ

0

Другой способ - убить сценарий. Я имею в виду, используйте функцию die();. Это останавливает скрипт везде, где вы его размещаете. Вы хотели бы, чтобы вставить его, как это:

//Check if user already exists 
$un_check = mysql_query("SELECT Username FROM users WHERE Username = '$un'"); 
if(mysql_num_rows($un_check) >0) { 
    echo "Username already exists"; 
    die(); // Don't continue, as we don't want to insert a username 
} 
else{ 
    // Username Free 
} 

Хотя это будет работать, если есть какой-либо другой код, который вы все еще хотите выполнить независимо от того, существует ли имя пользователя или нет, просто поместите код, который вставляет пользователей внутри блока else{}, как предложили другие.

+0

Спасибо! это помогло. – user2517092

+0

Добро пожаловать, рад, что он сделал то, что вам нужно. – SixteenStudio

+0

Я что-то упустил или он всегда проверяет того же пользователя с именем $ un вместо проверки содержимого переменной $ un? – Bun

3

Если вы хотите forbid, вводя те же значения дважды в таблицу, создайте unique index.

Проверка наличия существующей записи - это одно - запрет на добавление другой строки с одинаковыми значениями - это еще одна вещь.

Добавление такого индекса работает следующим образом:

ALTER TABLE `users` ADD UNIQUE `MY_UNIQUE_INDEX` (`username`) 
+0

Не возражаете ли вы объяснить, как это сделать? – user2517092

+0

@ user2517092 Я отредактировал ответ, чтобы добавить ссылку на соответствующую документацию MySQL. –

+0

Я отредактировал свой ответ с приведенным выше примером – conceptdeluxe

1

Вы можете просто поместить код запроса MySQL, который добавляет пользователь в базу данных внутри else блока. Таким образом, вы никогда не будете вставлять в базу данных, если пользователь уже существует.

0

Возможные случаи

  • Username не является уникальным в вашей базе данных.

  • (Если вы не хотите менять структуру таблицы) Поместите insert часть кода внутри инструкции else.

    if (mysql_num_rows ($ un_check)> 0) { echo "Имя пользователя уже существует"; } еще { // вставить новое имя пользователя }

BTW не использовать mysql_ функции. ОТРАБОТАНО

-1

я прошел через такой же проблемой, и мое решение было это

<?php 
//Connection Script Start 
$mysql_host = "localhost"; 
$mysql_user = "root"; 
$mysql_password = "*******"; 
$mysql_database = "db_name"; 
$connect = mysqli_connect($mysql_host, $mysql_user, $mysql_password, $mysql_database); 
//Connection Script Ends 

$un = "userabc"; 
$search = "SELECT * FROM table_name WHERE username='$un'"; 
$query = mysqli_query($connect, $search); 
$i = mysqli_num_rows($query); 
if($i==0){ 
//username free 
}else{ 
echo "This username is already taken"; 
} 
?> 
+2

Безрассудное игнорирование [правильных методов экранирования] (http://bobby-tables.com/php) вызовет у вас проблемы с этим подходом. Кроме того, ** не используйте ** mysql_query' в новом коде. Он устарел и будет удален в будущих версиях PHP. – tadman

+0

tadman Я использовал mysqli_query ... это okey ?? –

+0

Niraj: Даже с mysqli_query вам нужно убежать, поскольку ваш код уязвим для тривиальной атаки SQL-инъекций. Если вы хотите попробовать, настройте базу данных и перейдите в 'x '; DROP TABLE имя_таблицы - ', заставляя запускать неэкранированный SQL и удаляя таблицу. – hexafraction

0

Проблема состоит в два раза.

Во-первых, строго из хранилища данных - aka database - точки зрения, проблема заключается в плохо выполненном проекте базы данных. Если имя пользователя - это поле, которое должно быть уникальным, то это должно быть объявлено в базе данных путем добавления уникального индекса в столбец имени пользователя. Это создает правильную структуру базы данных, поэтому никакая новая запись не может быть добавлена, если значение имени пользователя уже существует в таблице - следовательно, уникальный индекс.

Sencond, ваш код, который проверяет, существует ли имя пользователя. Является ли он по-прежнему создавать учетную запись после проверки базы данных для дубликатов или вы просто говорите, что можете дублировать имена пользователей вручную в базе данных? Если коды все еще дублируют пользователя, то это может быть связано с тем, что результатом является пустой набор, то есть без каких-либо результатов, поскольку не существует имени пользователя и поэтому он не будет возвращать число строк, поэтому измените> на> =.

+0

Ну, я имел в виду, что он все еще создавал учетную запись после проверки базы данных на дубликаты. – user2517092

Смежные вопросы