Търсене при multiple select

nom3r1

Registered
В момента правя едно разширено търсене и се сетих за готината опция , която има SELECT , именно ~> multiple

<select multiple="multiple" name="city[]" id="city">
...
</select>

Вкарал съм в този multiple Области и Градове, като се сещам, че ще трябва да ги вкарам в масив и после да извеждам резултата.

Въпроса ми е как да взема избрания периметър.

Впрочем чудя се дали би имало проблем , ако използвам multiple при GET метода или да си използвам POST метода

Предполагам, ще е трябва да се използва - foreach();

Също така, за да не отварям нова тема искам да питам - как става номера при "точното търсене" , в доста търсачки съм го срещал примерно;

Използвайте кавички, за да търсите конкретни изрази.

"bmw x5"
"джанти 16ки"
"работа с multiple"
 
Как така "как да взема избрания параметър" ?

Когато се подава масив, така или иначе ще трябва да се врътне през нещо, за да искаш нужните данни.
 
Обясних го дървено.

Тоест искам да взема избраните VALUE's

Нали знаеш , че в multiple има option пример:

PHP:
<select multiple="multiple" name="city[]" id="city">
<?php
	$query = $db->query("SELECT * FROM `oblasti` ORDER BY `name`;");
	$select = '';
	while ($row = mysql_fetch_object($query)){
		$select .= "<optgroup label=\"{$row->name}\">";
		$query2 = $db->query("SELECT * FROM `gradove` WHERE `oblast_id`='{$row->id}' ORDER BY `grad_name`;");
			while ($row2 = mysql_fetch_object($query2)) {
				$select .= "<option value=\"{$row2->id}\">{$row2->grad_name}</option>\n";
			}
		$select .= "</optgroup>";
	}
	echo $select;
?>
</select>

След, което взимам от масива избраните градове и търся в базата, като търся в примерна таблица:

`table` в колона `gradove`

Предполагам, ще е нещо токова;
PHP:
<?php
if(isSet($_GET['city'])) {
	$city = $_GET['city'];
} else {
	$city = "";
}
foreach ($city as $t){
	$c[] = $city;
}
$query = mysql_query("SELECT * FROM `table` WHERE `city` = '".implode($c,',')."';") or die(mysql_error());
?>
<form method="GET">
<select multiple="multiple" name="city[]" id="city">
<?php
	$query = $db->query("SELECT * FROM `oblasti` ORDER BY `name`;");
	$select = '';
	while ($row = mysql_fetch_object($query)){
		$select .= "<optgroup label=\"{$row->name}\">";
		$query2 = $db->query("SELECT * FROM `gradove` WHERE `oblast_id`='{$row->id}' ORDER BY `grad_name`;");
			while ($row2 = mysql_fetch_object($query2)) {
				$select .= "<option value=\"{$row2->id}\">{$row2->grad_name}</option>\n";
			}
		$select .= "</optgroup>";
	}
	echo $select;
?>
</select>
<input type="submit" value="Давай!" />
</form>

ЕДИТ:
Сега като тръгнах да си правя експеримент, като избрах няколко градове адреса стана:
search.php?city[]=2&city[]=3&city[]=4&city[]=5&city[]=6&city[]=7&city[]=8&city[]=9&city[]=10&city[]=11&city[]=12&city[]=13&city[]=14&city[]=15&city[]=16&city[]=17&city[]=18&city[]=19&city[]=20&city[]=21&city[]=22&city[]=23&city[]=24&city[]=25&city[]=26&city[]=27&city[]=28&city[]=29&city[]=30&city[]=31&city[]=32&city[]=33&city[]=34

:D Явно ще трябва да правя всичко с POST метода

LAST EDIT:

Сега го направих така;
PHP:
<?php
if(isSet($_POST['submit'])) {
	if(isSet($_POST['city'])) {
		$city = $_POST['city'];
	} else {
		$city = "";
	}
	foreach ($city AS $selectedOption) {
		echo $selectedOption;
	}
	/*
	Array (
		[0] => 1
		[1] => 2
		[2] => 3
		[3] => 4
		[4] => 5
		[5] => 6
		[6] => 7
		[7] => 8
		[8] => 9
		[9] => 10
	)
	*/
} else {
echo '
<form method="POST">
<select multiple="multiple" name="city[]" id="city">';
	$query = $db->query("SELECT * FROM `oblasti` ORDER BY `name`;");
	$select = '';
	while ($row = mysql_fetch_object($query)){
		$select .= "<optgroup label=\"{$row->name}\">";
		$query2 = $db->query("SELECT * FROM `gradove` WHERE `oblast_id`='{$row->id}' ORDER BY `grad_name`;");
			while ($row2 = mysql_fetch_object($query2)) {
				$select .= "<option value=\"{$row2->id}\">{$row2->grad_name}</option>\n";
			}
		$select .= "</optgroup>";
	}
	echo $select;
echo '
</select>
<input type="submit" name="submit" value="Давай!" />
</form>';
}
?>

Резултата , който визуализирам е:
1234567891011

Това са градове:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11

Сега се чудя заявката във foreach(); ли да е включа или номера ще стане и извън нея?

структурата на таблицата , в която ще търся;

CREATE TABLE IF NOT EXISTS `table` (
`id` int(15) NOT NULL auto_increment,
.................
`zaglavie` varchar(30) NOT NULL default '0',
`etiketi` int(100) NOT NULL default '0',
`grad` int(15) NOT NULL default '0',
.................
PRIMARY KEY (`id`)
);

/това е само примерна таблица/

Тествах така;
PHP:
	foreach ($city AS $selectedOption) {
		echo "SELECT * FROM `test` WHERE `grad`='{$selectedOption}';";
	}

и резултата е;
Код:
SELECT * FROM `test` WHERE `grad`='1';SELECT * FROM `test` WHERE `grad`='2';SELECT * FROM `test` WHERE `grad`='3';SELECT * FROM `test` WHERE `grad`='4';SELECT * FROM `test` WHERE `grad`='5';SELECT * FROM `test` WHERE `grad`='6';SELECT * FROM `test` WHERE `grad`='7';SELECT * FROM `test` WHERE `grad`='8';SELECT * FROM `test` WHERE `grad`='9';SELECT * FROM `test` WHERE `grad`='10';SELECT * FROM `test` WHERE `grad`='11';

.. Което ме навежда на мисълта , че така ще търси градовете както искам, но ако са избрани всички градове? Да речем това ще са.. хм примерно 100 градове = 100 заявки??.. :?
 
nom3r1 каза:
.. Което ме навежда на мисълта , че така ще търси градовете както искам, но ако са избрани всички градове? Да речем това ще са.. хм примерно 100 градове = 100 заявки??.. :?

За да видиш какви стойности взима пробвай 1 print_r($масива), а иначе - ами прави 1 проверка с count($променливата-на-масива) и примерно ако броят на елементите в масива е равен на тези в селект-та да изпълнява 1 единствена заявка, ако са 2-5-15 да прави друго... Все пак не прекалявай със заявките, за да не ти стане бавен скрипта :)
 
PHP:
$query = "SELECT * FROM `table` WHERE ";

foreach(.....){

        $query = $query . implode(' AND ', $val);
}

mysql_query($query);

Нещо такова трябва да стане.


ЕДИТ: Или по-скоро така:

PHP:
$query = "SELECT * FROM `table` WHERE ";

$clauses = array();
foreach(.....){
       $clauses[] = "grad = {$val}";
}

mysql_query($query . implode(' AND ', $clauses);
 
Добре, но аз имам два пъти multiple.

При избиране на град + категория заявката става така:

[sql]SELECT * FROM `table` WHERE cat_id = '23' AND cat_id = '19' AND cat_id = '12' AND cat_id = '6' AND cat_id = '3' AND cat_id = '24' AND cat_id = '25' AND cat_id = '2' AND cat_id = '7' AND cat_id = '8' city_id = '23' AND city_id = '19' AND city_id = '12' AND city_id = '6' AND city_id = '3' AND city_id = '24' AND city_id = '25' AND city_id = '2' AND city_id = '7' AND city_id = '8'[/sql]

Което не ми се вижда редно.

Другия вариант е как каза по-горе @t0m3kk, да огранича търсенето, ако са избрани повече от 5 града и 5 категории да върне грешка:

"Вашите критерии за търсене са повече от допустимите!"

Например;

PHP:
$city_id_count = count($city_id, COUNT_RECURSIVE);
$cat_id_count = count($cat_id, COUNT_RECURSIVE);
if($cat_id_count > 5) {
	echo "Вашите критерии за търсене са повече от допустимите!";
} else {
	$clauses = array();
	foreach($city_id AS $val){
		$clauses[] = "city_id = '{$val}'";
	}
	if($cat_id_count > 5) {
		echo "Вашите критерии за търсене са повече от допустимите!";
	} else {
		$clauses2 = array();
		foreach($cat_id AS $val2){
			$clauses2[] = "cat_id = '{$val2}'";
		}
		$implode1 = implode(' AND ', $clauses);
		$implode2 = implode(' AND ', $clauses2);
		echo "{$implode1} {$implode2}";
	}
}

или съм в грешка?

ЕДИТ:

Сега забелязах и нещо друго. Ако не съм избрал град/категория ми връща грешка:

Warning: Invalid argument supplied for foreach() in /home/nom3r1/public_html/index.php on line 100

Това е ред:
PHP:
foreach ($cat_id AS $var) {
 
Ако мислиш, че можеш да ги ограничил до 5 избора - направи го. Но смени AND с OR в заявката, че съм объркал.

Относно втория ти въпрос: Проверявай с isset или sizeof дали има нещо в $cat_id и тогава върти цикъла.
 
relax4o каза:
Ако мислиш, че можеш да ги ограничил до 5 избора - направи го. Но смени AND с OR в заявката, че съм объркал.

Относно втория ти въпрос: Проверявай с isset или sizeof дали има нещо в $cat_id и тогава върти цикъла.

Аз така съм го и направил и за това попитах - прав ли съм или греша , тоест - има ли по-добър вариант.

PHP:
if(isSet($_POST['cat_id'])) {
	$cat_id = $_POST['cat_id'];
} else {
	$cat_id = "";
}
if(isSet($_POST['city_id'])) {
	$cat_id = $_POST['cat_id'];
} else {
	$city_id = "";
}
$city_id_count = count($city_id, COUNT_RECURSIVE);
$cat_id_count = count($cat_id, COUNT_RECURSIVE);
if($cat_id_count > 5) {
        echo "Вашите критерии за търсене са повече от допустимите!";
} else {
        $clauses = array();
        foreach($city_id AS $val){
                $clauses[] = "city_id = '{$val}'";
        }
        if($cat_id_count > 5) {
                echo "Вашите критерии за търсене са повече от допустимите!";
        } else {
                $clauses2 = array();
                foreach($cat_id AS $val2){
                        $clauses2[] = "cat_id = '{$val2}'";
                }
                $implode1 = implode(' AND ', $clauses);
                $implode2 = implode(' AND ', $clauses2);
                echo "{$implode1} {$implode2}";
        }
}

Сега като се замисля, може след $cat_id_count да правя една проверка , ако някое от полетата е празно да не търси в него тоест ->

PHP:
<?php
if(isSet($_POST['cat_id'])) {
	$cat_id = $_POST['cat_id'];
} else {
	$cat_id = "";
}
if(isSet($_POST['city_id'])) {
	$cat_id = $_POST['cat_id'];
} else {
	$city_id = "";
}
$city_id_count = count($city_id, COUNT_RECURSIVE);
$cat_id_count = count($cat_id, COUNT_RECURSIVE);
if($city_id_count > 0) {
	if($city_id_count > 5) {
			echo "Вашите критерии за търсене са повече от допустимите!";
	} else {
			$clauses = array();
			foreach($city_id AS $val){
					$clauses[] = "city_id = '{$val}'";
			}
			$implode1 = implode(' AND ', $clauses);
	}
} else {
	$implode1 = "";
}
if($city_id_count > 0) {
	if($cat_id_count > 5) {
		echo "Вашите критерии за търсене са повече от допустимите!";
	} else {
		$clauses2 = array();
		foreach($cat_id AS $val2){
			$clauses2[] = "cat_id = '{$val2}'";
		}
		$implode2 = implode(' AND ', $clauses2);
	}
} else {
	$implode2 = "";
}
echo "{$implode1} {$implode2}";
?>

Но не мисля, че е най-добрия вариант
 

Back
Горе