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

Форум MySQL

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

 

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

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

тема: Поиск слов по базе и создание не существующих
 
 автор: Proger   (07.09.2008 в 06:36)   письмо автору
 
 

Вот встала передо мной задачка.
Делаю систему тегов, пользователь вводит в поле тэги скажем к записи в личном дневнике, через пробел. Я через explode это собираю в массив и вот вопрос...

Я сделал запрос вида:
SELECT `id` FROM `tags`.`tags` WHERE `tag` IN ('слово1','слово2','слово3','слово4','слово5')


Но к сожалению если не существует какого-то из слов на него ничего не придет, даже NULL. Я в данном случае придумал только если делать на каждое слово по запросу и если mysql_num_rows == 0 то делать insert слова в базу. Но возможно (не нашел) есть иные более простые решения.
Заранее спасибо.

   
 
 автор: Trianon   (07.09.2008 в 14:17)   письмо автору
 
   для: Proger   (07.09.2008 в 06:36)
 

А какой результат хочется получить от запроса?

   
 
 автор: Proger   (07.09.2008 в 21:54)   письмо автору
 
   для: Trianon   (07.09.2008 в 14:17)
 

Возможно не правильно написал немного...

Мой результат это получить id существующих слов и id не существующих, соответственно вставив их перед этим.

Были слова

слово1, слово2, слово3 в базе

а слово4 и слово5 не было, мы их должны insert их в базу и их иды узнать

Берём иды всех введённых пользователем слов (то есть слово1, слово2, слово3, слово4, слово5) и их ИДЫ вставляем в другую таблицу соответствие номера записи в дневнике заданному тегу.

   
 
 автор: Trianon   (07.09.2008 в 22:14)   письмо автору
 
   для: Proger   (07.09.2008 в 21:54)
 

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

   
 
 автор: AcidTrash   (07.09.2008 в 22:23)   письмо автору
 
   для: Proger   (07.09.2008 в 21:54)
 

>и id не существующих, соответственно вставив их перед этим.
Интересно id не существующих откуда берутся и куда их вставить перед этим?

   
 
 автор: Proger   (07.09.2008 в 22:35)   письмо автору
 
   для: AcidTrash   (07.09.2008 в 22:23)
 

В таблицу где все слова... ид = auto_increment какое это имеет отношение к делу?

   
 
 автор: Valick   (07.09.2008 в 22:48)   письмо автору
 
   для: Proger   (07.09.2008 в 22:35)
 

и их ИДЫ вставляем в другую таблицу
зачем вам ещё одна таблица?

Вобщем я бы передавал эти теги массивом
И в цикле обходил каждый... если в безе есть, то возвращаем АйДи, если нет , то инсёрт и соответствинно ласт АйДи.
только вот непонятно как вы будете проверять тег прислал юзер или лабуду?

   
 
 автор: Proger   (07.09.2008 в 23:13)   письмо автору
 
   для: Valick   (07.09.2008 в 22:48)
 

тэг это слово! Я имею ввиду не html теги или т.п. а ТЭГИ - как web 2.0 - ключевые слова к информации. Другая таблица нужна....

2 таблицы
Первая: ид ТЭГ
Вторая: ид тэга ид информации по ТЭГу

Ладно понял... так видимо и назревает смотреть каждое слово по отдельности с помощью цикла...

   
 
 автор: Valick   (07.09.2008 в 23:21)   письмо автору
 
   для: Proger   (07.09.2008 в 23:13)
 

Я имею ввиду на html теги или т.п. а ТЭГИ
Во блин... когда смотрел первый раз тему я думал и о тех и о других тегах.
А сейчас почему-то втемяшились ХТМЛ теги)

   
 
 автор: Trianon   (07.09.2008 в 23:30)   письмо автору
 
   для: Proger   (07.09.2008 в 23:13)
 

Я бы сделал следующий цикл.
1. Получить в $present список имеющихся слов
SELECT id, word FROM tagTable WHERE word in($list)
2. если число строк равно расмеру $list - прекратить цикл.
3. Вычислить разницу между $list и $present в массив $need
4. Сформировать по $need многострочный INSERT IGNORE
5. повторять с п1.

Минимум SQL-операторов. И отсутствие коллизий при одновременном исполнении.

   
 
 автор: Valick   (07.09.2008 в 23:45)   письмо автору
 
   для: Trianon   (07.09.2008 в 23:30)
 

А чем плох мой алгоритм неподскажите?

   
 
 автор: Trianon   (07.09.2008 в 23:50)   письмо автору
 
   для: Valick   (07.09.2008 в 23:45)
 

А алгоритм-то где?

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

   
 
 автор: Valick   (07.09.2008 в 23:54)   письмо автору
 
   для: Trianon   (07.09.2008 в 23:50)
 

>А алгоритм-то где?
вот: в цикле обходил каждый... если в безе есть, то возвращаем АйДи, если нет , то инсёрт и соответствинно ласт АйДи
В любом случае и в вашем и в моём надо блокировать таблицу, что бы и селект и инсёрт "ехали на одном велосипеде"

   
 
 автор: Trianon   (07.09.2008 в 23:58)   письмо автору
 
   для: Valick   (07.09.2008 в 23:54)
 

>>А алгоритм-то где?
>вот: в цикле обходил каждый... если в безе есть, то возвращаем АйДи, если нет , то инсёрт и соответствинно ласт АйДи
Так число селектов и инсертов в пределе равно числу слов. Это много.

>В любом случае и в вашем и в моём надо блокировать таблицу, что бы и селект и инсёрт "ехали на одном велосипеде"

В моем - блокировать не нужно. В Вашем - не возьмусь определить, но по-моему тоже не нужно.

   
 
 автор: Valick   (08.09.2008 в 00:08)   письмо автору
 
   для: Trianon   (07.09.2008 в 23:58)
 

В моем - блокировать не нужно. В Вашем - не возьмусь
Ну как же? один юзер хочет добавить теги "кожа" и "рожа" , второй - теги "морда" и "рожа"
практически одновременно и в обоих случаях слова "рожа" пока нет в базе. После инсёрта в базе будут две "рожи" с разными АйДи

   
 
 автор: Trianon   (08.09.2008 в 00:26)   письмо автору
 
   для: Valick   (08.09.2008 в 00:08)
 

>Ну как же? один юзер хочет добавить теги "кожа" и "рожа" , второй - теги "морда" и "рожа"
>практически одновременно и в обоих случаях слова "рожа" пока нет в базе. После инсёрта в базе будут две "рожи" с разными АйДи
На столбце word стоит UNIQUE индекс. INSERT IGNORE добавит только "морду".

   
 
 автор: Valick   (08.09.2008 в 00:31)   письмо автору
 
   для: Trianon   (08.09.2008 в 00:26)
 

Понятно. Спасибо.

   
 
 автор: Valick   (08.09.2008 в 00:20)   письмо автору
 
   для: Trianon   (07.09.2008 в 23:58)
 

Так число селектов и инсертов в пределе равно числу слов. Это много
согласен. Просто я пытался сократить промежуток между отдельно взятыми селектом и инсёртом.

   
 
 автор: Trianon   (08.09.2008 в 00:28)   письмо автору
 
   для: Valick   (08.09.2008 в 00:20)
 

>согласен. Просто я пытался сократить промежуток между отдельно взятыми селектом и инсёртом.

А смысл?

   
 
 автор: Valick   (08.09.2008 в 00:33)   письмо автору
 
   для: Trianon   (08.09.2008 в 00:28)
 

Ну чтоб таблицу блокировать на минимальный промежуток времени.
Да и это уже неважно... ваш алгоритм круче (обещаю не называть его в вашу честь))) )

   
 
 автор: Proger   (08.09.2008 в 00:51)   письмо автору
 
   для: Trianon   (07.09.2008 в 23:30)
 

А можно попродробней расписать это?

Просто на слово РОЖА может быть запись с ид 412512 и 3253253 и 45435643, зайдите на любой хабрахабр или бобрдобр и посмотрите как это выглядит.




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

--
-- База данных: `tags`
--

-- --------------------------------------------------------

--
-- Структура таблицы `forum_tags`
--

CREATE TABLE `forum_tags` (
  `tagid` int(10) NOT NULL,
  `topicid` int(10) NOT NULL,
  KEY `tagid` (`tagid`,`topicid`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

--
-- Дамп данных таблицы `forum_tags`
--


-- --------------------------------------------------------

--
-- Структура таблицы `tags`
--

CREATE TABLE `tags` (
  `id` int(10) NOT NULL auto_increment,
  `tag` varchar(25) NOT NULL,
  KEY `id` (`id`,`tag`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=32 ;

--
-- Дамп данных таблицы `tags`
--

INSERT INTO `tags` VALUES(1, 'жопа');
INSERT INTO `tags` VALUES(2, 'привет');
INSERT INTO `tags` VALUES(3, 'проверка');
INSERT INTO `tags` VALUES(4, 'теги');
INSERT INTO `tags` VALUES(5, 'таги');
...

   
 
 автор: Proger   (08.09.2008 в 00:53)   письмо автору
 
   для: Proger   (08.09.2008 в 00:51)
 

Да и кстати для каждого модуля сайта (конечной информации модуля, например сообщение на форуме или в дневнике) есть свой уникальный ID который я и сопостовляю tag_id, тут я представил пример с forum_tags...

Ну эт так... чтобы было понятней :)

   
 
 автор: Proger   (08.09.2008 в 00:58)   письмо автору
 
   для: Proger   (08.09.2008 в 00:53)
 


$tags = explode(" ",$_POST['tags']);
$zap = ", ";
$cnt = $ins = null;

foreach ($tags as $ky) {
if (strlen($ky) <= 2) continue;
$tag[] = $ky;
}

$c = count($tag);

foreach ($tag as $key) {
$cnt++;
if ($c == $cnt) $zap = null;
$ins .= "'$key'".$zap;
}

$q = "SELECT * FROM `tags`.`tags` WHERE tag IN (".$ins.")";
$r = mysql_query($q);

if (count($words) != mysql_num_rows($r)) {
//как вычислить какие именно слова не вставлены? Сравнивать с массивом $words полученные из БД данные?
}

while ($row = mysql_fetch_assoc($r)) {
//insert `tags`.`forum_tags` ...
}



Правильно понимаю? и как массивы оптимальней сравнить, подскажите пожалуйста!

   
 
 автор: Trianon   (08.09.2008 в 01:01)   письмо автору
 
   для: Proger   (08.09.2008 в 00:51)
 

>А можно попродробней расписать это?
распишите, конечно.

>Просто на слово РОЖА может быть запись с ид 412512 и 3253253 и 45435643,

слова РОЖА в Вашей таблице нет. Но допустим, если оно есть под id=6, то таблица forum_tags дополнится строками
6,412512
6,3253253
6,45435643


>зайдите на любой хабрахабр или бобрдобр и посмотрите как это выглядит.

мне сказать, куда Вам зайти?

   
 
 автор: Proger   (08.09.2008 в 01:04)   письмо автору
 
   для: Trianon   (08.09.2008 в 01:01)
 

>>зайдите на любой хабрахабр или бобрдобр и посмотрите как это выглядит.

>мне сказать, куда Вам зайти?

Это было обращение к Valick =)



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

   
 
 автор: Trianon   (08.09.2008 в 01:10)   письмо автору
 
   для: Proger   (08.09.2008 в 01:04)
 

>>>зайдите на любой хабрахабр или бобрдобр и посмотрите как это выглядит.
>>мне сказать, куда Вам зайти?
>Это было обращение к Valick =)

А то я не заметил :))


>А что попродробней то расписывать, вроде уже все изложил...

Вот и я так же мыслю...

PS. Я может какого смутного подтекста не понимаю?

   
 
 автор: Proger   (08.09.2008 в 01:14)   письмо автору
 
   для: Trianon   (08.09.2008 в 01:10)
 

Мммм... или я засыпаю или кофе был не качественным))


вопрос тут:

if (count($words) != mysql_num_rows($r)) { 
//как вычислить какие именно слова не вставлены? Сравнивать с массивом $words полученные из БД данные? 
}


Вроде более и нет...пока...

   
 
 автор: Trianon   (08.09.2008 в 01:16)   письмо автору
 
   для: Proger   (08.09.2008 в 01:14)
 

см. п.3 алгоритма.
Есть соответствующие функции работы с массивами.
Хотя можно и без них.

   
 
 автор: Proger   (08.09.2008 в 01:21)   письмо автору
 
   для: Trianon   (08.09.2008 в 01:16)
 

Дык я понял п.3 только вот КАК!? Нужно из всех данных полученных по select сформировать массив $tag_from_db и сравнить (в цикле?) с массивом $tag? Сравнение массивов что-то мне не понятно в данной ситуации...


PS кофе все-таки плохой, туплю :((((

   
 
 автор: Valick   (08.09.2008 в 01:33)   письмо автору
 
   для: Trianon   (08.09.2008 в 01:16)
 

Запрс
$query="SELECT id, word FROM tags WHERE word in($list)";

у меня не хочет выполнятся, говорит
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

   
 
 автор: Proger   (08.09.2008 в 01:36)   письмо автору
 
   для: Valick   (08.09.2008 в 01:33)
 

я бы тоже не захотел на такой запрос отвечать)) (сделайте echo $query)

Нашел супер функцию array_diff =)

   
 
 автор: Valick   (08.09.2008 в 01:45)   письмо автору
 
   для: Proger   (08.09.2008 в 01:36)
 

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

   
 
 автор: Proger   (08.09.2008 в 02:01)   письмо автору
 
   для: Valick   (08.09.2008 в 01:45)
 

а чего пытацца я его уже почти в полном виде привел в посте выше и сейчас сделаю сравнение массивов, вроде уже готово))

   
 
 автор: Valick   (08.09.2008 в 02:39)   письмо автору
 
   для: Proger   (08.09.2008 в 02:01)
 

я тут подумал если INSERT IGNORE добавляет только новые значения, то зачем вообще эти пляски с бубном?
Делаем INSERT IGNORE
А следом селект и всё.

   
 
 автор: Proger   (08.09.2008 в 04:45)   письмо автору
 
   для: Valick   (08.09.2008 в 02:39)
 

Повторюсь 3 раз))) Кофе был плахой)) Попил чаю понял примерно тоже самое)) Уря! ;) Всем пасиба!

   
 
 автор: Trianon   (08.09.2008 в 08:54)   письмо автору
 
   для: Valick   (08.09.2008 в 02:39)
 

Я хотел вообще избежать тяжелого оператора INSERT IGNORE в ситуации (как я понимаю - довольно частой) когда присутствуют все слова.

   
 
 автор: Valick   (08.09.2008 в 09:41)   письмо автору
 
   для: Trianon   (08.09.2008 в 08:54)
 

просто интересно неужели INSERT IGNORE намного тяжелее SELECT, как я понимаю и там и там необходимо перелопатить всю таблицу
И вообще если в таблице есть уникальное поле, то я так понимаю нагрузка от INSERT возростает из-за него?

   
 
 автор: Trianon   (08.09.2008 в 10:32)   письмо автору
 
   для: Valick   (08.09.2008 в 09:41)
 

Оператор INSERT "тяжел" хотя бы тем, что это оператор DML а не SQL - он вносит измеения в таблицу, а не читает её.
В ситуации, когда можно обойтись без записи - без нее стоит обойтись.

   
 
 автор: Proger   (08.09.2008 в 19:34)   письмо автору
 
   для: Trianon   (08.09.2008 в 10:32)
 

По алгоритму да и просто с течением времени скажем в таблице тегов будет 10000 слов, а они все в нижнем регистре, соответственно с чем дальше, тем больше уже слов будет существовать...

   
 
 автор: Valick   (09.09.2008 в 00:59)   письмо автору
 
   для: Proger   (08.09.2008 в 19:34)
 

Ну как у вас успехи? Можете показать конечный результат?

   
 
 автор: Proger   (09.09.2008 в 01:42)   письмо автору
 
   для: Valick   (09.09.2008 в 00:59)
 

Успехи вчера были достигнуты ещё в 5 утра, а кода слишком много, это я вопрос насчет одного кусочка задавал, а файлов не менее 10, также html, js, dom, ajaj и т.п. так что...

   
 
 автор: Valick   (09.09.2008 в 01:50)   письмо автору
 
   для: Proger   (09.09.2008 в 01:42)
 

Я у вас про кусочек и спрашиваю... хочу сравнить ваш с моим

   
 
 автор: Proger   (09.09.2008 в 22:24)   письмо автору
 
   для: Valick   (09.09.2008 в 01:50)
 

А смысл? =))

ЗЫ: Усё. Тему мона закрывать, а то оффтоп пошел.

   
 
 автор: Trianon   (09.09.2008 в 23:32)   письмо автору
 
   для: Proger   (09.09.2008 в 22:24)
 

>А смысл? =))
Тот же что и у Вас.


>ЗЫ: Усё. Тему мона закрывать, а то оффтоп пошел.

Жадно стало или стыдно? :)

   
 
 автор: Valick   (10.09.2008 в 00:24)   письмо автору
 
   для: Trianon   (09.09.2008 в 23:32)
 

Пока не закрыли тему вот мой код:

<?php
// *********************************************************
// Функция выборки существующих id из таблицы $table
// если слова нет, то вставляем
// $table - имя таблици
// $field_id - имя колонки id
// $field_word - имя колонки ключевых слов (UNIQUE)
// Функция возвращает массив содержащий id значений из $mass
//**********************************************************
function show_id($table,$field_id,$field_word,$mass)
{
while (isset(
$mass))
{
// Формируем запрос на выборку из базы слов содержащихся в массиве
$query="SELECT `$field_id`, `$field_word` FROM `$table` WHERE `$field_word` IN('".implode("','",$mass)."')";
$res=mysql_query($query);
while (
$present=mysql_fetch_object($res))
    {
    
$id[]=$present->$field_id;
    
$key=array_search($present->$field_word,$mass);
    if(isset(
$key))  unset($mass[$key]);
    }
if(
count($mass)==0)
    {
    unset(
$mass); 
    }
else 
    {
// Формируем многострочный запрос к базе из массива для вставки
    
$query "INSERT IGNORE INTO `$table` (`$field_word`) VALUES('".implode("'),('",$mass)."')";
    
$res=mysql_query($query);
    }
}
$id=array_unique($id);
return 
$id;
}
//**********************************************************

include_once ("conect.php");
$list[]="ноги";
$list[]="теги";
$list[]="жопа";
$list[]="Valick";
$list[]="вставили";
$list[]="жопа";
$list[]="мамонт";



$id=show_id('tags','id','word',$list);
print 
"<PRE>";
print_r ($id);
print 
"</PRE>";
?>

   
 
 автор: Trianon   (10.09.2008 в 00:27)   письмо автору
 
   для: Valick   (10.09.2008 в 00:24)
 

IN('".implode("','",$mass)."')"

Вы ж понимаете, что так с текстом нельзя. И почему. :(

   
 
 автор: Valick   (10.09.2008 в 00:30)   письмо автору
 
   для: Trianon   (10.09.2008 в 00:27)
 

Ещё пока непонимаю... яж не волшебник)
Было бы неплохо если бы вы намекнули, для этого собственно я и выкладывал код.
Если вы имеете ввиду инъекции... то для меня сейчас важны нюансы самого алгоритма... про безопасность речь не идёт

   
 
 автор: Trianon   (10.09.2008 в 00:35)   письмо автору
 
   для: Valick   (10.09.2008 в 00:30)
 

То, что Вы называете инъекциями, я называю некорректной обработкой данных.

   
 
 автор: Valick   (10.09.2008 в 00:39)   письмо автору
 
   для: Trianon   (10.09.2008 в 00:35)
 

Тоесть функция должна быть самодостаточной, и корректную обработку выносить за её пределы нестоит? Просто я так думаю функций может быть много, а обработать введённые данные (корректно) можно один раз.

   
 
 автор: Trianon   (10.09.2008 в 00:46)   письмо автору
 
   для: Valick   (10.09.2008 в 00:39)
 

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

   
 
 автор: Valick   (10.09.2008 в 00:49)   письмо автору
 
   для: Trianon   (10.09.2008 в 00:46)
 

Подскажите, что надо поправить? Напишите как должно быть, или хотябы как должен выглядеть "эхо" запроса в данном случае. Спасибо, что хоть как-то наставляете на путь истинный.

   
 
 автор: Trianon   (10.09.2008 в 01:11)   письмо автору
 
   для: Valick   (10.09.2008 в 00:49)
 

Код набросал на одном дыхании, и не проверял.
Ляпов может быть море.
<?
function to_sql($x)
{
    return 
is_array($x) ? ('('implode(',',array_map('to_sql'$x)).')')
         : 
is_string($x) ? ("'"mysql_escape_string($x)."'")
         : 
is_numeric() ? $x;
}
function 
show_id($table,$field_id,$field_word,$mass)
{
  for(;;)
  {
    
$sql "SELECT `$field_id` AS fi, `$field_word` AS fw FROM `$table` WHERE fw IN "to_sql($mass);
    if(!(
$res=mysql_query($sql)))    exit("Error in $sql : " .mysql_error());
    for(
$list = array(); $row mysql_fetch_assoc($res); $list[$row['fw']] = intval($row['fi'])) ;
    if(
count($list) == $count($mass))    return $list;
    
$sql "INSERT IGNORE INTO `$table` (`$field_word`) VALUES " to_sql(array_diff($massarray_keys($list)))
    if(!(
$res=mysql_query($sql)))    exit("Error in $sql : " .mysql_error());
    if(!
mysql_affected_rows())       exit("Error in $sql : no rows added");
  }
}

   
 
 автор: Ocelot   (11.09.2008 в 00:59)   письмо автору
 
   для: Trianon   (10.09.2008 в 01:11)
 

Почитал:
<?php
function show_id($table,$field_id,$field_word,$mass

  
// зачем этот цикл?
  
for(;
  {      
    
// зачем выносить запрос в отдельную переменную? чтобы выполнить лишний оператор присваивания?
    
$sql "SELECT `$field_id` AS fi, `$field_word` AS fw FROM `$table` WHERE fw IN "to_sql($mass);
    if(!(
$res=mysql_query($sql)))    exit("Error in $sql : " .mysql_error()); 
     
// сдесь в этом варианте нужно сделать отступ, чтоб читать было легче
    
for($list = array(); $row mysql_fetch_assoc($res); $list[$row['fw']] = intval($row['fi'])) ;
    
// если перенес на другую строку, то будь добр увелич отступ, т.к. этот иф лежит внутри фора 
    
if(count($list) == $count($mass))    return $list
    
// опять используем лишнюю переменную
    
$sql "INSERT IGNORE INTO `$table` (`$field_word`) VALUES " to_sql(array_diff($massarray_keys($list))) 
     
// нет слов...
    
if(!($res=mysql_query($sql)))    exit("Error in $sql : " .mysql_error()); 
     
// нет слов...
    
if(!mysql_affected_rows())       exit("Error in $sql : no rows added"); 
  }   
// конец ненужного цикла
}

Зачем нам return $list если в случае, когда нуно что-либо добавить мы ничего не возващаем абсолюнто.
Убрал лишний мусор, продумал возврат значенй:
если ничего добавлять не надо, то функция вернет 2.
добавили что-то = 1
ошибка = 0
вот что получилось:
<?php
function show_id($table,$field_id,$field_word,$mass

   if(
$res=mysql_query("SELECT `$field_id` AS fi, `$field_word` AS fw FROM `$table` WHERE fw IN "to_sql($mass)) )
   {
        for(
$list = array(); $row mysql_fetch_assoc($res); $list[$row['fw']] = intval($row['fi'])); 
            if(
count($list) == $count($mass))
                return 

     
if( mysql_query("INSERT IGNORE INTO `$table` (`$field_word`) VALUES " to_sql(array_diff($massarray_keys($list)))) ) return 1; else return 0;
  } else return 
0;
}

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

   
 
 автор: Valick   (11.09.2008 в 01:06)   письмо автору
 
   для: Ocelot   (11.09.2008 в 00:59)
 

Вы не ознакомились с заданием. Функция (код) должна возвращать АйДи строк содержащихся в массиве (если строки нет в базе, то вставить её и вернуть её АйДи). В принципе мой код (см выше) рабочий (упс... нашёл ещё огрех ... вобщем-то и есть куда совершенствовать код), только осталось сделать её "всеядной"
I 100% know why O"Relly & partners doesn't eat Mc'donalds Gamburgers\Cheeseburgers
"скормить" пока не смог)) (хотя толком ещё и не пробовал)
Появилась мысль ограничиться одним селектом (без цикла)... сёдня спать, а завтра буду думать.

   
 
 автор: Proger   (11.09.2008 в 01:21)   письмо автору
 
   для: Valick   (11.09.2008 в 01:06)
 

Скормить "это" в задачи функции не входило даже. Я потому свой код и не привел ибо у нас как я понимаю конечные задачи координально различатся!


Ocelot - немного не понятно что же выйдет на результат, но код по быстродействую выигрывает. Только не понимаю чей алгоритм он реализует...
ЗЫ опять кофе плохой...

   
 
 автор: Ocelot   (11.09.2008 в 01:52)   письмо автору
 
   для: Proger   (11.09.2008 в 01:21)
 

Суть в разделении на 2 функции.
1) добавляет значения
2) берет их id
напр. при сохранении тегов (если мы не выводим список тегов пользователю) нам не нужно получать его из базы.
При подготовке можно просто получать список тегов уже имеющихся в базе, не занося новые (показать пользователю, что уже есть и сколько экземпляров чего-то помечено этим тегом).
Итого: пока редактируем у нас будет 5-10 селект запросов (смотря сколько раз юзер правил список и как часто мы обновляем его) и один инсерт при сохранении.

   
 
 автор: Ocelot   (11.09.2008 в 01:36)   письмо автору
 
   для: Valick   (11.09.2008 в 01:06)
 

вместо возврата 2 вернем на место $лист
и цикл... только ИМХО он тут не есть лучшее решение

   
 
 автор: Ocelot   (11.09.2008 в 01:46)   письмо автору
 
   для: Ocelot   (11.09.2008 в 00:59)
 

автор: Ocelot (11.09.2008 в 00:59) письмо автору
2 Трианон: прошу прощеия, на часах 4 часа ночи (по местному)... не доконца понял задачу.

   
 
 автор: Proger   (11.09.2008 в 00:24)   письмо автору
 
   для: Trianon   (09.09.2008 в 23:32)
 

и не то и не то, просто я не общественный банк кода)) Да и всё равно я чуствую что человек делает иначе, дык мой код с его сравнивать в данном случае глупо.

   
 
 автор: Valick   (11.09.2008 в 00:41)   письмо автору
 
   для: Proger   (11.09.2008 в 00:24)
 

У вас случайно не двойное гражданство?
Я попросил вас выложить кусочек кода, чтобы я мог посмотреть ход ваших мыслей. Это нужно было лично мне. И я считаю раз уж вы обращаетесь за помощью в данном вопросе, то могли бы ответить взаимностью. Вместо этого вы несёте какую-то чепургу.
Вобщем лично я сделал кое-какие выводы относительно вас. И как любил говаривать В. Стрельников "Доззвиданья"

-2-

   
 
 автор: Trianon   (11.09.2008 в 11:17)   письмо автору
 
   для: Proger   (11.09.2008 в 00:24)
 

>и не то и не то, просто я не общественный банк кода

Ок. Я учту.

   
 
 автор: Valick   (07.09.2008 в 23:31)   письмо автору
 
   для: Proger   (07.09.2008 в 23:13)
 

Вторая: ид тэга ид информации по ТЭГу

Тем более вам ненужна такая вторая таблица...
Я бы сделал так:
Первая: ид ! ТЭГ ! ид информации по ТЭГу
Вторая: ид информации по ТЭГу ! информация

   
Rambler's Top100
вверх

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