Проверка на совпадение в БД

AlexB57

Новичок
Всем привет!
Дано:
Генерация логина :
PHP:
$loginpartner=  mt_rand(100000, 999999);
Проверка в БД на совпадение -
PHP:
 $query = mysql_query("SELECT COUNT(partner_id) FROM partners WHERE partner_login='".$loginpartner."'");
Условие проверки -
PHP:
mysql_result($query, 0) > 0
Вопрос как это объединить в проверку которая по возвращении значения больше нуля снова бы генерировала логин, проверяла на совпадение снова?

Как я понял мне нужен цикл. Я думаю так:

PHP:
$query = mysql_query("SELECT COUNT(partner_id) FROM partners WHERE partner_login='".$loginpartner."'");

do {

$loginpartner =  mt_rand(100000, 999999);

} while (mysql_result($query, 0) > 0);
Правильно ли эта конструкция? Если нет помогите составить, пожалуйста.
 

artoodetoo

великий и ужасный
конструкция вроде бы соответствует тому, что ты написал.
только пара замечаний:
- расширение mysql обещают ликвидировать в недалеком будущем. привыкай работать с mysqli или PDO
- тебе ведь реально не нужно знать count()! вообще SELECT не нужен. достаточно сделать уникальный индекс по колонке (он полюбому должен быть) и обнаруживать факт, что операция НЕудалась — mysql_query("INSERT... ") в таком случае возвращает false.
 

WMix

герр M:)ller
Партнер клуба
PHP:
// переменная $query уже создана
$query = mysql_query("SELECT COUNT(partner_id) FROM partners WHERE partner_login='".$loginpartner."'");
do {
    // если ты ожидаешь что эта строка меняет $query, то ты ошибаешься!
    $loginpartner = mt_rand(100000, 999999);
} while (mysql_result($query, 0) > 0);
если чесно, я не понимаю что ты хочешь добиться, даже если менять $query на каждую интерацию
 
Последнее редактирование:

AlexB57

Новичок
WMix, чего я хочу:
1. Генерю логин партнера mt_rand
2. Проверяю селектом на наличие совпадений в БД
2.1. Если есть такой логин, то:
2.1.1 Снова генерю логин.
2.1.2. Снова проверяю.
3. Если такого логина (который был сгенерирован в п.1) нет в БД, пишу его в БД

artoodetoo, спасибо за замечания

конструкция вроде бы соответствует тому, что ты написал.
только пара замечаний:
- расширение mysql обещают ликвидировать в недалеком будущем. привыкай работать с mysqli или PDO
- тебе ведь реально не нужно знать count()! вообще SELECT не нужен. достаточно сделать уникальный индекс по колонке (он полюбому должен быть) и обнаруживать факт, что операция НЕудалась — mysql_query("INSERT... ") в таком случае возвращает false.
Вот это правда я не совсем понял, поясни если не трудно
уникальный индекс есть partner_id

Структура таблицы

PHP:
CREATE TABLE `partners` (
    `partner_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    `partner_name` VARCHAR(60) NOT NULL,
    `partner_login` VARCHAR(30) NOT NULL,
    `partner_password` VARCHAR(32) NOT NULL,
    PRIMARY KEY (`partner_id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
AUTO_INCREMENT=6;
 

WMix

герр M:)ller
Партнер клуба
PHP:
insert into `partners` set `partner_id` = CAST( RAND() * (999999 - 100000) + 100000 AS UNSIGNED );
и в цикл, "и обнаруживать факт, что операция НЕудалась"
PHP:
if(!mysql_query($query)){
  echo "Ж" . mysql_error();
}
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
я не понимаю какой цикл, я не понимаю суть задачи
PHP:
while(true){/*тело цикла */}
 

AlexB57

Новичок
WMix, Суть задачи полностью
У меня есть форма добавления партнера.
Когда я нажимаю кнопку "добавить партнера" открывается эта самая форма добавления партнера
При открытии формы партнеру автоматически генерируется логин и пароль

Цель задачи:
записать уникальный логин в базу новому партнеру
Для этого я его хочу проверить перед записью в БД на уникальность
Если он не уникален, сгенерировать снова
Т.е. алгоритм вот
1. Генерю логин партнера mt_rand
2. Проверяю селектом на наличие совпадений в БД
2.1. Если есть такой логин, то:
2.1.1 Снова генерю логин.
2.1.2. Снова проверяю.
3. Если такого логина (который был сгенерирован в п.1) нет в БД, пишу его в БД

Но я хочу это реализовать полностью на автомате, т.е. без вывода echo сообщений пользователю
Т.е. при совпадении логина с логином в базе, скрипт сам его генерит заново и снова проверяет, и так до уникальности

Например.
Скрипт сгенерил логин 3650
Запросом в базу определяем что такой логин уже есть в базе
Генерим снова логин, например 6900
Проверяем запросом
Запрос нам возвращает что "Такого логина нет в база"
Записываем логи партнеру

Я понимаю что мне это нужно реализовать через цикл, но не могу его составить.
 

WMix

герр M:)ller
Партнер клуба
а чем тебе AUTO_INCREMENT не угодил? зачем такие велосипеды?
 

AlexB57

Новичок
Я понял, WMix имеете ввиду автоинкремент логина? Мне это не подходит. Нужны рандомные.
А по поводу проверки не можете подсказать, все-таки? :)
 

Breeze

goshogun
Команда форума
Партнер клуба
Мне это не подходит. Нужны рандомные.
То, как ты генеришь логины, считай не рандомно. При 899999 логинах в базе они все там будут.
Кроме того, чем больше логинов в базе, тем больше вероятность увеличения времени работы скрипта вплоть до бесконечности.

Бери auto_increment значение и добавляй ему случайную строку из диапазона a-zA-Z
В итоге получишь что-то типа fkT493783
 

AlexB57

Новичок
Breeze, спасибо но мне необходимо именно так как я описал
При 899999 логинах в базе они все там будут.
Такого количества партнеров у меня пока не будет :) А когда будет я думаю у меня будет возможность передать эту работу специалистам :)
Breeze, поможете с кодом?
 

WMix

герр M:)ller
Партнер клуба
тогда умножай на любое большое простое число и считай по модулю от мах - мин - 1 получешь часики (довольно-таки рандомные), но даже для этого не стоит отказываться от AUTO_INCREMENT, это просто view

 
Последнее редактирование:

Вурдалак

Продвинутый новичок
Ты можешь юзать блочный шифр, будет как раз маппинг обычного AUTO_INCREMENT на нечто «рандомное».
 

AlexB57

Новичок
Ты можешь юзать блочный шифр, будет как раз маппинг обычного AUTO_INCREMENT на нечто «рандомное»
Вурдалак, я так ругаться пока не научился :) я начинающий программист

Я сделал вот так, оцените профи :)

PHP:
// запрашиваем последний ID  
$query = mysql_query("select * FROM partners WHERE partner_id = (select MAX(partner_id) FROM partners)");
//генерируем 6-значный логин
$loginpartner =  substr(mysql_result($query, 0).mt_rand(1000000, 9999999), 0, 6);
// проверяем, не сущестует ли пользователя с таким логином
  $query = mysql_query("SELECT COUNT(partner_id) FROM partners WHERE partner_login='".$loginpartner."'");
//если логин есть
    if(mysql_result($query, 0) > 0)
    {
    //кричим об ошибке и делаем логин на единицу больше
       echo "Пользователь с таким логином уже существует в базе данных!";
      $loginpartner = ++$loginpartner;
    }
Какова "рандомность" сего опуса?
 

Breeze

goshogun
Команда форума
Партнер клуба
зачем substr? логин обязательно 6 знаков?
 
Сверху