Замена неуникальных записей

sizam

Новичок
Замена неуникальных записей

Есть база данных, в ней четыре поля : id , name, family, altname

Поля id , name, family уже заполнены, поле altname заполняется скриптом из поля name, сделано для того, чтоб переделать записи ввиде Alex Petrov в alex_petrov

Так вот , записи в name часто повторяються , а следовательно и в altname повторяються. Изза этого нарушаеться работа сайта.

Хотел сделать, чтоб каждая повторяющаяся запись имела вид alex_petrov
alex_petrov1
alex_petrov2
alex_petrov3


Пробовал сделать , но так нечего и не получилось.

Может ктото сталкивался в данной проблеммой , помогите.
 

dimagolov

Новичок
как у тебя эти altname генеряться? чем?

я бы ввел дополнительную таблицу, где держал бы уникальные altname и max index для каждого, а в основной бы хранил ссылку на altname и номер индекса текущего юзера. заполнение всего этого можно было бы сделать тригерром BEFORE INSERT основной таблицы, правда скрипт конвертации name->altname тогда тоже как хранимую процедуру оформить придется.
 

sizam

Новичок
Вот так генеряться

function altname ($string)
{
$string = str_replace("A","a",$string);
$string = str_replace("B","b",$string);
$string = str_replace("C","c",$string);
$string = str_replace("D","d",$string);
$string = str_replace("E","e",$string);
$string = str_replace("F","f",$string);
$string = str_replace("G","g",$string);
$string = str_replace("H","h",$string);
и т.д.

$names=_select('base', '', array('name', 'id'), "", "", "", 1);
foreach ($name as $d)
{
$altname=altname($d['name']);
echo $altname."..............";
_update("base", array('altname'=>$altname), array('id'=>$d['id']));
echo "Good<br>";
 

sizam

Новичок
Вот полный листинг функции altname

function altname ($string)
{
$string = str_replace("A","a",$string);
$string = str_replace("B","b",$string);
$string = str_replace("C","c",$string);
$string = str_replace("D","d",$string);
$string = str_replace("E","e",$string);
$string = str_replace("F","f",$string);
$string = str_replace("G","g",$string);
$string = str_replace("H","h",$string);
$string = str_replace("I","i",$string);
$string = str_replace("J","j",$string);
$string = str_replace("K","k",$string);
$string = str_replace("L","l",$string);
$string = str_replace("M","m",$string);
$string = str_replace("N","n",$string);
$string = str_replace("O","o",$string);
$string = str_replace("P","p",$string);
$string = str_replace("Q","q",$string);
$string = str_replace("R","r",$string);
$string = str_replace("S","s",$string);
$string = str_replace("T","t",$string);
$string = str_replace("U","u",$string);
$string = str_replace("V","v",$string);
$string = str_replace("W","w",$string);
$string = str_replace("X","x",$string);
$string = str_replace("Y","y",$string);
$string = str_replace("Z","Z",$string);
$string = str_replace(" ","_",$string);
$string = str_replace("!","_",$string);
$string = str_replace("/","_",$string);
$string = str_replace("|","_",$string);
$string = str_replace("?","_",$string);
$string = str_replace(".","_",$string);
$string = str_replace("&","_",$string);
$string = str_replace("*","_",$string);
$string = str_replace("(","_",$string);
$string = str_replace(")","_",$string);
$string = str_replace("-","_",$string);
$string = str_replace("#","_",$string);
$string = str_replace("@","_",$string);
$string = str_replace("`","_",$string);
$string = str_replace("'","_",$string);
$string = str_replace("$","_",$string);
$string = str_replace("^","_",$string);
$string = str_replace("+","_",$string);
$string = str_replace("=","_",$string);
$string = str_replace(":","_",$string);
$string = str_replace(",","_",$string);

return $string;
}

strtolower() переводит все буквенные символы в нижний регистр, а у меня используецца

$string = str_replace(" ","_",$string);
$string = str_replace("!","_",$string);
$string = str_replace("/","_",$string);
$string = str_replace("|","_",$string);
$string = str_replace("?","_",$string);
$string = str_replace(".","_",$string);
$string = str_replace("&","_",$string);
$string = str_replace("*","_",$string);
$string = str_replace("(","_",$string);
$string = str_replace(")","_",$string);
$string = str_replace("-","_",$string);
$string = str_replace("#","_",$string);
$string = str_replace("@","_",$string);
$string = str_replace("`","_",$string);
$string = str_replace("'","_",$string);
$string = str_replace("$","_",$string);
$string = str_replace("^","_",$string);
$string = str_replace("+","_",$string);
$string = str_replace("=","_",$string);
$string = str_replace(":","_",$string);
$string = str_replace(",","_",$string);

Значит strtolower() не подходит.

Вообще не в этом суть моего вопроса,

Хотел сделать, чтоб каждая повторяющаяся запись alex_petrov имела вид
alex_petrov1
alex_petrov2
alex_petrov3
 

dimagolov

Новичок
sizam
скажи честно, по твоему 26 вызовов str_replace более читабельны и эфективны, чем один вызов strtolower?
ты ман по str_replace читать пробовал? про то, что первые 2 аргумента могут быть массивами?

про то как тебе обрабатывать повторяющиеся записи с минимумом нагрузки на базу я тебе написал в первом же посте. ну а твою altname как раз в том виде в котором она есть перевести на SQL раз плюнуть :D
 
Сверху