[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: уникальность имени
zeromind
понадобилось сделать уникальный title (по нему инет выборка из БД, сам он содержится в GET запросе), если тайтл например audi-r8, уже есть, должен подставить audi-r8-1, если и этот вариант есть, то автоинкриментируем счетчик, т.е. audi-r8-2 и тд..

накатал тут функцию:

function rndTitle($model, $title, $i)
{
$i++;
$res = DB::query("SELECT COUNT(*) AS `cnt`
FROM `"
. DBPREFIX . "videos`
WHERE `model_id` = "
. $model . "
AND `title` = "
. DB::quote($title) . "
"
);
if ($res->fetchColumn() == 0)
return $title;
else
{
$title = $title . '-' . $i;
rndTitle($model, $title, $i);
}
return $title;
}


но, что-то совсем не получается сделать ни чего :)), не понимаю как тут рекурсия отрабатывает, по моей логике - как в базе нету совпадений, сразу возвращаем новый $title, а до тех пор делаем рекурсию на себя (перебирая варианты), попробывал я отловить блок else, с выводом echo, вроде тут больше похоже на правду, но title естественно генерируется чудок не правильно, а так $title = $title . '-' . $i; т.е. получается audi-r8, audi-r8-1, audi-r8-1-2, audi-r8-1-2-3, ни как мне нужно..

помогите, что-то совсем с простой задачей справится не могу :)



Спустя 11 минут, 32 секунды (8.03.2012 - 11:49) cyberside написал(а):
Самый простой способ делать титл по id записи в БД...

Спустя 2 минуты, 55 секунд (8.03.2012 - 11:52) zeromind написал(а):
мне такой способ не подходит smile.gif

Спустя 1 минута, 45 секунд (8.03.2012 - 11:54) cyberside написал(а):
Ну, а если к титлу в конец подставлять id записи?))

Спустя 3 минуты, 16 секунд (8.03.2012 - 11:57) zeromind написал(а):
а как узнать заранее id записи?) или делать 2 SQL запроса? ) хочется вообщем чтоб счетчик шел с единицы smile.gif

Спустя 4 минуты, 37 секунд (8.03.2012 - 12:02) cyberside написал(а):

SELECT MAX(id) as `maxid` FROM `babyunia`


$myID = $result['maxid']+1;


Как-то так... Или же как ты сказал 2 SQL

Спустя 14 минут, 51 секунда (8.03.2012 - 12:17) zeromind написал(а):
это и будет 2 SQL запроса)) первый на выборку, второй на вставку..
вообщем мне нужно, как я описал smile.gif

Спустя 7 минут, 36 секунд (8.03.2012 - 12:24) sharki написал(а):
zeromind
Ну сохрани первоначальное имя в переменной перед функцией, а потом используй по назначению, подставляя циферки

Спустя 4 минуты, 27 секунд (8.03.2012 - 12:29) zeromind написал(а):
дело в том, что первоначальное имя $title парсится с всяких там youtube, vk и тд, название файлов может совпасть, я решил разумно будет после $title дописать цифру 1, если уже такое $title в БД есть, значит цифру 2 и тд.. вот алгоритм не могу правильно записать такой задачи((

Спустя 4 минуты, 16 секунд (8.03.2012 - 12:33) Visman написал(а):
zeromind, при использовании рекурсии ты согласен плодить запросы к базе?

function rndTitle($model, $title, $i)
{
$i++;
$res = DB::query("SELECT 1 AS `cnt`
FROM `"
. DBPREFIX . "videos`
WHERE `model_id` = "
. $model . "
AND `title` = "
. DB::quote($title) . "
"
);
if ($res->fetchColumn() > 0)
{
$title = preg_replace('%\-\d+$%', '', $title) . '-' . $i;
rndTitle($model, $title, $i);
}
return $title;
}

Спустя 3 минуты, 58 секунд (8.03.2012 - 12:37) zeromind написал(а):
Цитата (Visman @ 8.03.2012 - 12:33)
zeromind, при использовании рекурсии ты согласен плодить запросы к базе?

function rndTitle($model, $title, $i)
{
$i++;
$res = DB::query("SELECT 1 AS `cnt`
FROM `"
. DBPREFIX . "videos`
WHERE `model_id` = "
. $model . "
AND `title` = "
. DB::quote($title) . "
"
);
if ($res->fetchColumn() > 0)
{
$title = preg_replace('%\-\d+$%', '', $title) . '-' . $i;
rndTitle($model, $title, $i);
}
return $title;
}

конечно, до тех пор, пока тайтл ни станит уникальным

Спустя 3 минуты, 31 секунда (8.03.2012 - 12:40) zeromind написал(а):
всё вроде бы хорошо, но результат совпадения последний не выводит, точнее функция вообще ни чего не выводит, а если после рекурсии пишу echo $title;
то вроде тут все циклы правильные, мне получается надо последний вариант ретюрнить ? ток как ))

хотя, я не прав, выводит первый результат рекурсии.. в БД такая запись уже есть smile.gif, щяс буду пробыватье ещё)

Спустя 4 минуты, 54 секунды (8.03.2012 - 12:45) Visman написал(а):
model_id и title строковые поля, значения в кавычки надо брать в запросе.

$res->fetchColumn() возвращает колонку, а надо проверять на наличие строк в ответе.

Спустя 47 секунд (8.03.2012 - 12:46) zeromind написал(а):
т.е. вот так:
function rndTitle($model, $title, $i)
{
$i++;
$res = DB::query("SELECT 1 AS `cnt`
FROM `"
. DBPREFIX . "videos`
WHERE `model_id` = "
. $model . "
AND `title` = "
. DB::quote($title) . "
"
);
if ($res->fetchColumn() == 0)
return $title;
else
{
$title = preg_replace('%\-\d+$%', '', $title) . '-' . $i;
rndTitle($model, $title, $i);
echo $title;
}
}

показывает все циклы, вплоть до последнего валидного !
сама функция при такой записи не возвращает ни чего, хотя должен отработать блок
if ($res->fetchColumn() == 0)
return $title;

Спустя 1 минута, 51 секунда (8.03.2012 - 12:48) zeromind написал(а):
model_id - (int), а title - я экранирую DB::quote - там они автоматом прописываются ''..
щяс попробую rowCount(), или что тут нужно ? )

Спустя 3 минуты, 23 секунды (8.03.2012 - 12:51) Visman написал(а):
function rndTitle($model, $title, $i)
{
$i++;
$res = DB::query("SELECT 1 AS `cnt`
FROM `"
. DBPREFIX . "videos`
WHERE `model_id` = "
. $model . "
AND `title` = "
. DB::quote($title) . "
"
);
if ($res->fetchColumn() > 0)
{
$title = preg_replace('%\-\d+$%', '', $title) . '-' . $i;
$title = rndTitle($model, $title, $i);
}
return $title;
}

Спустя 2 минуты, 32 секунды (8.03.2012 - 12:54) zeromind написал(а):
Цитата (Visman @ 8.03.2012 - 12:51)
function rndTitle($model, $title, $i)
{
$i++;
$res = DB::query("SELECT 1 AS `cnt`
FROM `"
. DBPREFIX . "videos`
WHERE `model_id` = "
. $model . "
AND `title` = "
. DB::quote($title) . "
"
);
if ($res->fetchColumn() > 0)
{
$title = preg_replace('%\-\d+$%', '', $title) . '-' . $i;
$title = rndTitle($model, $title, $i);
}
return $title;
}

is_valid = true;
+ в карму за помощь smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.