Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: уникальное значение тектового поля как сделать
 
 автор: Bvz   (28.05.2012 в 15:13)   письмо автору
 
 

Есть таблица в которой есть колонка ailas, например в одной из строк есть знаячение name.
Как сделать так, что при добавлении новой строки дублирующего значения name колонки alias создавалось новое значение name_1,
при очередном дублировании name содавалось name_2 и т.д.

  Ответить  
 
 автор: confirm   (28.05.2012 в 15:35)   письмо автору
 
   для: Bvz   (28.05.2012 в 15:13)
 

Добавление каким способом - приходит от клиента и помещается в базу?
Значит при выводе таблице нумеруйте.
Добавляется динамически на стороне клиента?
Значит в раздел html - это js работа.

  Ответить  
 
 автор: Bvz   (28.05.2012 в 15:41)   письмо автору
 
   для: confirm   (28.05.2012 в 15:35)
 

причем здесь html и js?

данные из формы добавляютя в БД, необходимо, чтоб в БД они были уже уникальны

  Ответить  
 
 автор: confirm   (28.05.2012 в 15:53)   письмо автору
 
   для: Bvz   (28.05.2012 в 15:41)
 

А при том, что вы же не поясняете, что значит "добавить", вот и уточняем.

А добавленная запись в базу имеет свой уникальный id? Если да, то почему его нельзя использовать?

  Ответить  
 
 автор: Sfinks   (28.05.2012 в 16:02)   письмо автору
 
   для: Bvz   (28.05.2012 в 15:41)
 

> причем здесь html и js?
А вы что, где-то написали о какой технологии идет речь? Явно не о пхп. В пхп нет таблиц. Значит имеется ввиду либо хтмл-таблица, либо таблица БД. В любом случае это не из этого раздела вопрос.

Так что вам нужно? Можно сделать и на уровне БД не возвращаясь в ПХП.
И что такое "name"? Это именно всегда name или это любая строка может быть?

  Ответить  
 
 автор: Bvz   (28.05.2012 в 16:14)   письмо автору
 
   для: Sfinks   (28.05.2012 в 16:02)
 

name это всего лишь пример, значение может быть любое,
т.е. если name существует, создавалось значение name_1 если и оно существует создавалось name_2 и т.д.

  Ответить  
 
 автор: confirm   (28.05.2012 в 16:19)   письмо автору
 
   для: Bvz   (28.05.2012 в 16:14)
 

Вы бы лучше словами пояснили подробнее чего вы делаете, глядишь и решение нашлось у кого либо хорошее.
Что значит name - это запись в базе, причем имеющая уже уникальное значение, или же это значение из какой-то записи, при этом в этой записи может быть несколько значений с таким именем?
Что значит уникальность в данном случае - она используется впоследствии и должна быть постоянной, или речь идет о временной нумерации на странице, которая может меняться?

  Ответить  
 
 автор: Bvz   (28.05.2012 в 16:32)   письмо автору
 
   для: confirm   (28.05.2012 в 16:19)
 

значение поступает из формы и заносится в базу данных
дублей name в таблице не должно быть, т.к. оно формирует ссылку на конкретный материал и по значению alias будет загружаться нужный материал

  Ответить  
 
 автор: confirm   (28.05.2012 в 16:37)   письмо автору
 
   для: Bvz   (28.05.2012 в 16:32)
 

Я вас о структуре ваших данных спрашиваю, а вы о том откуда приходит. Да пусть хоть почтой присылают.
Можно держать имя "name" в таблице под id=12, и такое же имя, но под id=13. И это две разных ссылки будут, причем не по "name", а по id.
Думаю вы знакомы с таким, а значит должны понять о чем спрашивают вас.

  Ответить  
 
 автор: Bvz   (28.05.2012 в 16:47)   письмо автору
 
   для: confirm   (28.05.2012 в 16:37)
 

например есть поле name в которые записываются названия новостей на кириллице,
а alias это их дубли в транслите,
вот чтоб избежать дублей именно в alias, т.е. в одной строке одно значение

  Ответить  
 
 автор: confirm   (28.05.2012 в 16:58)   письмо автору
 
   для: Bvz   (28.05.2012 в 16:47)
 

А на кириллице значит не важно, сколь угодно одинаково?
Я могу это представлять так:
id  cyr  trs
1   так  tak    
14  так  tak

и первичное поле у вас уже обеспечивает уникальность, для обеих полей. А если дубль транслита, то это значит одинакова и кириллица. И чего вы хотите не понятно.

  Ответить  
 
 автор: Bvz   (28.05.2012 в 17:01)   письмо автору
 
   для: confirm   (28.05.2012 в 16:58)
 

я же написал, что я хочу


id  cyr  trs
1   так  tak    
14  так  tak_1
26  так  tak_2


чтоб в адресной строке было так:

/news/tak /
/news/tak_1 /
/news/tak _2/

а не так

/news/1 /
/news/14 /
/news/26/

  Ответить  
 
 автор: confirm   (28.05.2012 в 17:09)   письмо автору
 
   для: Bvz   (28.05.2012 в 17:01)
 

А не лучше ли по id? Или /news/tak _2/ это красота неописуемая, а /news/26/ это фуфло? Не проще ли извлекать записи из базы по уникальному id, чем карячится по транслиту?
А если так хочется, то ранее я говорил - что вам мешает добавлять к транслиту первичный ключ при добавлении записи в базу?

  Ответить  
 
 автор: Bvz   (28.05.2012 в 17:11)   письмо автору
 
   для: confirm   (28.05.2012 в 17:09)
 

а почему корячиться, разве это не решаемая проблема?

вы предлагаете так:

/news/1/tak /
/news/14/tak/
/news/26/tak/

  Ответить  
 
 автор: confirm   (28.05.2012 в 17:15)   письмо автору
 
   для: Bvz   (28.05.2012 в 17:11)
 

Да проблема то решаема, но вы тут о миллионах говорили, а работать с числами проще и быстрее, нежели со строками.
Впрочем, если вам все равно, дело хозяйское.
Я говорил так - если при добавлении записи она получает id 15, то обновление поля транслита и получается tak _15, значит /news/tak _15/. Вы же такого желаете.
Кстати, можно предположить, что это под mod_rewrite, то ваш транслит в url, это тоже не лучшее для него.

  Ответить  
 
 автор: Bvz   (28.05.2012 в 17:22)   письмо автору
 
   для: confirm   (28.05.2012 в 17:15)
 

не совсем так я не хочу привязывать id к транслиту, я хочу, что при дублировании значение увеличивалось на единицу tak, tak_1,tak_2 ... а если нет дублей, то без цифр просто tak

о каких миллионах вы говорите?

  Ответить  
 
 автор: confirm   (28.05.2012 в 17:35)   письмо автору
 
   для: Bvz   (28.05.2012 в 17:22)
 

Не маялись бы вы ерундой, а делали бы так, как проще и быстрее, тем более, что ваш транслит не так и читабелен, чтобы кто-то там интересовался им в ссылке.
Ну а если вам нужна еще и нумерация - проверяйте есть ли такое и нумеруйте, по другому никак.

  Ответить  
 
 автор: Bvz   (28.05.2012 в 17:38)   письмо автору
 
   для: confirm   (28.05.2012 в 17:35)
 

ну вот ч чего начали к тому и вернулись, вопрос был изначально поставлен, как проверить, есть ли такое?

  Ответить  
 
 автор: confirm   (28.05.2012 в 17:49)   письмо автору
 
   для: Bvz   (28.05.2012 в 17:38)
 

Вы же должны как-то вычислить номер уже существующий, значит надо делать запрос, а ведь у вас не номер, а строка. Иначе было бы просто, типа такого:
<?
"INSERT INTO `tbl` (`name`, `trans`) VALUES ('val','val') 
                  ON DUPLICATE KEY UPDATE `trans` = CONCAT(VALUES(`trans`),'_1')"

Может лучше нумерацию держать в отдельном поле, так проще будет и для поиска, и принятия решения. А уж "приклеить" этот номер можно и при выводе.

  Ответить  
 
 автор: Bvz   (28.05.2012 в 18:23)   письмо автору
 
   для: confirm   (28.05.2012 в 17:49)
 

я об этом думал, т.е. отделить нумерацию в отдельное поле

  Ответить  
 
 автор: confirm   (28.05.2012 в 18:26)   письмо автору
 
   для: Bvz   (28.05.2012 в 18:23)
 

Ну да. Можно конечно "прошерстить" и строки ваши, но с помощью рег.выражения, но ведь это утяжеление выполнения запроса, и пусть вставка данных реже чем вывод, все равно стоит ли?
А если в отдельном поле, то достаточно запросить число записей (значения то без номеров одинаковы), и N-1, даст вам следующий номер.

PS. Только учтите, что это не уникальность, то есть, если запись N удалена, то такая "уникальность" нарушается, ибо добавление нового примет удаленный номер. И если кто-то сохранил ссылку на "старое", то попадет уже совсем не туда.

  Ответить  
 
 автор: Sfinks   (28.05.2012 в 18:49)   письмо автору
 
   для: confirm   (28.05.2012 в 18:26)
 

Однако вы тут настрочить успели, пока я запрос составлял.... )))

  Ответить  
 
 автор: Sfinks   (28.05.2012 в 18:46)   письмо автору
 
   для: Bvz   (28.05.2012 в 16:14)
 

Нужно, конечно, послушать confirm'a и пересмотреть структуру БД....
Но мне охото было поупражняться в SQL =)))
<?php
  
// пусть таблица имеет имя tbl
  // поле, которое нас интересует называется f1
  // также в таблице есть еще 2 текстовых поля f2 и f3
  // и одно целочисленное f4

  // значения, которые нужно вставить
  
$val_1 'name';  // для столбца f1
  
$val_2 'fgh';   // для столбца f2
  
$val_3 'jkl';   // для столбца f3
  
$val_4 123;     // для столбца f4
  // в запросе нужно исправить имена таблицы (tbl) и полей (f1,f2,f3,f4) на реальные 
  
$sql "INSERT INTO tbl(f1,f2,f3,f4)
          SELECT CASE WHEN T3.f1 IS NULL THEN nm
                      WHEN T2.f1 IS NULL THEN CONCAT(nm,'_1')
                      ELSE CONCAT(nm,'_',max(CAST(substr(T2.f1,length(nm)+2) AS UNSIGNED))+1)
                 END      f1
                ,'
$val_2' f2
                ,'
$val_3' f3
                , 
$val_4  f4
          FROM (SELECT '
$val_1' nm)T1
          LEFT JOIN tbl T2 ON T2.f1 LIKE CONCAT(nm,'\_%')
          LEFT JOIN tbl T3 ON T3.f1 = nm"
;
  
mysql_query($sql);
?>

  Ответить  
 
 автор: confirm   (28.05.2012 в 18:49)   письмо автору
 
   для: Sfinks   (28.05.2012 в 18:46)
 

Да, для упражнения конечно мощно, но стоит ли все этого? ))

  Ответить  
 
 автор: Sfinks   (28.05.2012 в 19:03)   письмо автору
 
   для: confirm   (28.05.2012 в 18:49)
 

А я начал с того что не стОит )

  Ответить  
 
 автор: The Electronic Cat   (29.05.2012 в 14:07)   письмо автору
 
   для: Sfinks   (28.05.2012 в 18:46)
 

Есть подозрение, что

<?php
$sql 
"select count(*) from `tbl` where `cyr`='$cyr'";
list(
$count) = mysql_fetch_row(mysql_query($sql));
settype('count''int');
$trs $count 'name_'. (++$count) : 'name' ;
mysql_query("insert into `tbl` set `cyr`='$cyr', `trs`='$trs'");

сработает быстрее, чем это sql-великолепие)
Но упражнение зачетное.

ps.И, в любом случае, индекс бы не помешал на строке в таблице при такой организации структуры.

  Ответить  
 
 автор: Sfinks   (29.05.2012 в 14:57)   письмо автору
 
   для: The Electronic Cat   (29.05.2012 в 14:07)
 

Если бы я начиная писать запрос знал о существовании поля cyr и откуда там ноги растут, то и запрос составил бы на основе его значения.
Т.е. то что вы написали, только на уровне SQL. И это было бы быстрее.
Но ТС же не сказал сразу ничего. Как и из всех пришлось клещами вытягивать.

  Ответить  
 
 автор: Sfinks   (29.05.2012 в 15:22)   письмо автору
 
   для: The Electronic Cat   (29.05.2012 в 14:07)
 

Хотя, если предположить, что в таблице были name_1, name_2, name_3, name_4, а потом name_3 удалили, то ваш вариант уже сработает не правильно и добавит nаme_4 второй раз.

  Ответить  
 
 автор: confirm   (30.05.2012 в 01:12)   письмо автору
 
   для: Sfinks   (29.05.2012 в 15:22)
 

МАХ поможет. )
Но предположение об удалении, это как раз то, что и определяет бесполезность этой затеи в том виде, в котором хочет автор ее.
На уникальность (в кавычках) я говорил автору, вроде бы как побоку это. Если даже и будет принято мое замечание во внимание, и в конечном итоге будет так:
url/id/yazyk_mozhno_slomat_ot_takogo_kotoroe_nafik_komu_nuzhno_120
то это все равно не решает проблемы такой "уникальности", значит надо добавлять еще бухгалтера ведущего отчет прихода/расхода.
Вот и возникает вопрос - это для чего, если практическая ценность от этого нулевая и информативная составляющая тоже близка к нулю? Остается только и вспоминать о верности высказывания - "охота пуще неволи".

  Ответить  
 
 автор: ONYX   (28.05.2012 в 15:55)   письмо автору
 
   для: Bvz   (28.05.2012 в 15:13)
 

Проверяйте совпадения в поле ailas и все, до тех пор пока идет совпадение имени с уже существующим именем в базе, увеличивайте его индекс name_<номер>

  Ответить  
 
 автор: Sfinks   (28.05.2012 в 16:03)   письмо автору
 
   для: ONYX   (28.05.2012 в 15:55)
 

Добавлю, что если совпадений будет миллион, можете сходить попить чаю =)))) Как раз успеете.

  Ответить  
 
 автор: The Electronic Cat   (29.05.2012 в 14:03)   письмо автору
 
   для: Sfinks   (28.05.2012 в 16:03)
 

Не в ту ветку

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования