Доброго времени суток уважаемые форумчане. Вот уже 2-ой день никак не могу одолесть такую задачу. Есть у меня массив из слов, пользователь вводит в текстовое поле через перенос, я его разбиваю на массив Код (Text): $name = split("\n", trim($name)); // Разбиваем на массив Получаю массив. А теперь самый главный вопрос, как теперь избежать попадания двойников в базу данных. Массив записываю в бд и там уже есть данные. Пробовал вот так Код (Text): function dubleString($cat, $name){ foreach($name as $item){ $res[$item] = mysql_num_rows(mysql_query("select * from ".TABLE." where root_category='$cat' AND name_cat='$item'")); if($res[$item]>0) return true; } return false; } где $name - массив из текстового поля (textarea) где переменная $cat - это номер категории, нужно сравнить 2 значения как в запросе, на соответствие если есть с номером такой категории и с таким именем то просто игнорировать его или дать предупреждение. Этот запрос проверяет только последнюю строку, а все остальные игнорирует. Что деелаю не так? Ткните пожалуйста.
Не помогает пробовал только последнее значение прооверяет в массиве name и все. Добавлено спустя 4 минуты 21 секунду: К примеру вот имеем массив name Код (Text): Array ( [0] => один [1] => два [2] => три ) При первом добавлении все нормально При втором изменил только (три1) - проверяет. Меняю значение 2 или 1 - добавляет пока не изменишь последнее.
Текст через " спуск строки " приходит из " textarea " и ты хочешь преобразовать это в массив и каждый элемент проверить в базе данных по так называемой категории - равно ли это тому что в базе есть и то, что есть покажет?
В массив преобразую Код (Text): $name = split("\n", trim($name)); // Разбиваем на массив И из базы массив, категория также есть в пост запросе но категория одно число для всех сравнений. Нужно проверить есть ли совпадение в базе данных по параметру К примеру я ввожу в textarea строки оди два три Получаю через сплит массив Код (Text): Array ( [0] => один [1] => два [2] => три ) Как проверить все на совпадения? И выдать булев результат хотя бы.
Код (PHP): function dubleString($cat,array $array) { $cat=intval($cat); if($cat && $array) { $result=array(); foreach($array as $item) { $item=mysql_real_escape_string($item); if(empty($result[$item])) { $query=mysql_query(" SELECT `name_cat` FROM `".TABLE."` WHERE `root_category`='".$cat."' AND `name_cat`='".$item."' LIMIT 0,1 ") || exit(mysql_error()); if($query) { $result[$item]=mysql_num_rows($query); } } } return $result; } return array(); } Ты хочешь результат в виде массива выполненых? Или ты хочешь видеть результат не выполненых? Дублей
Ругается на строку Код (Text): $result[]=mysql_num_rows($item); Ошибка Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in Z:\home\test1.ru\www\addcat\function.php on line 37 Что-то не так? Смотрите я вот в файле на который отправлен action проверяю вот так Код (Text): $duble = dubleString($s_cat, $name); if($duble!=0){ exit("Есть совпадения!"); } Добавлено спустя 18 минут 46 секунд: Мне нужно вернуть 1 или 0 если совпадения есть 1 нет 0
Проблема решена самым простым способом, оказалось, что при прогоне в цикле к проверяемому значению из массива добавлялся пробел, по этому и пропускало предыдущие совпадения. Всем спасибо!
Код (PHP): function dubleString($cat, array $array) { $cat=intval($cat); $return=array(); if($cat && $array) { foreach($array as $item) { $item=mysql_real_escape_string($item); if(mysql_query(" SELECT `name_cat` FROM `".TABLE."` WHERE `root_category`='".$cat."' AND `name_cat`='".$item."' LIMIT 0,1 ")) { $return['found'][]=$item; } else { $return['notfound'][]=$item; } } } return $return; }
Извените больше не буду плодить темы. Попробовал возвращает всеравно весь массив ввожу один два три пять Уже есть один два три Возвращает $duble = dubleString($s_cat, $name); print_r($duble); Код (PHP): Array ( [found] => Array ( [0] => один [1] => два [2] => три [3] => пять ) ) А нужно вернуть массив без совпадений то есть Array ( [0] => пять) Может я что-то не так делаю. Спасибо вам огромное за помощь. Это единственный форум где мне ответили нормально. Добавлено спустя 19 минут 50 секунд: В общем когда проверяю вот так print_r($duble['notfound']); то ничего не выводит А вот так print_r($duble['found']); то выводит все и те что есть в базе. Добавлено спустя 36 минут 58 секунд: Сделал вот так Код (PHP): function dubleString($cat, array $array) { $cat=intval($cat); $return=array(); if($cat && $array) { foreach($array as $item) { $item=mysql_real_escape_string($item); if(mysql_num_rows(mysql_query(" SELECT `name_cat` FROM `".TABLE."` WHERE `root_category`='".$cat."' AND `name_cat`='".$item."' LIMIT 0,1 "))>0) { $return['found'][]=$item; } else { $return['notfound'][]=$item; } } } return $return; } Все работает Огромное спасибо rognorog
агась, забыл mysql_num_rows дописать. только можно не писать >0 - это можно убрать, так как в случае 0 - это типичный false. лож.
даю подсказку на миллион долларов: - сделай поле уникальным (если оно не первичный ключ, создай уникальный индекс). теперь ты застрахован от несчастного случая - записывай новые значения без проверки. если писать значения отдельными запросами, то новые значения пройдут, а лишнее не запишется. можно также писать все значения в одном INSERT, но тогда надо использовать опцию IGNORE. Гуглить "MYSQL INSERT IGNORE"
Все кто писал позже! Запись в базу идет относительно категории с номером. А если у меня к примеру есть запись зонтик под другой категорией? А запись идет только уникальных значений? Читайте вопрос!
Тогда уникальный индекс надо объявить по комбинации (категория, название). Код (Text): ALTER TABLE `mytable` ADD UNIQUE INDEX (`root_category`, `name_cat`) P.S. Делать запрос В ЦИКЛЕ блин чтобы узнать какие имена нельзя вставлять это ебаный капец! Если тебя самого не корёжит от такого, то ты никогда не станешь программистом
попробуйте такой запрос: Код (PHP): $implodes = array(); foreach($name as $item) { $implodes[] = "select $item as `name_cat`"; } $sql1 = implode(' union ', $implodes); $sql2 = "SELECT `name_cat` FROM `".TABLE."` WHERE `root_category`='".$cat."'"; $query = "select distinct vars.name_cat from ($sql1) as vars left join ($sql2) as t on t.name_cat = vars.name_cat where t.name_cat is null"; должен вывести строки, которых в базе нет.
artoodetoo Мне нужно получить массив совпавших и не совпавших. И не нужно здесь умничать на счет запросов в цикле. Mysql выдержывает нормально миллионы запрсов в секунду в чем проблема? Мы в 21 веке живем, что же вы все паритесь на счет нагрузок на сервер баз данных, забудьте уже наконец про них! Мне этот запрос нужен на локальной машине а не на сайте. Расслабтесь попейте пива отдохните!