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

nom3r1

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

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

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

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

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

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

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

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

"bmw x5"
"джанти 16ки"
"работа с multiple"
 

relax4o

Registered
Как така "как да взема избрания параметър" ?

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

nom3r1

Registered
Обясних го дървено.

Тоест искам да взема избраните 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 заявки??.. :?
 

t0m3kk

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

За да видиш какви стойности взима пробвай 1 print_r($масива), а иначе - ами прави 1 проверка с count($променливата-на-масива) и примерно ако броят на елементите в масива е равен на тези в селект-та да изпълнява 1 единствена заявка, ако са 2-5-15 да прави друго... Все пак не прекалявай със заявките, за да не ти стане бавен скрипта :)
 

relax4o

Registered
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);
 

nom3r1

Registered
Добре, но аз имам два пъти 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) {
 

relax4o

Registered
Ако мислиш, че можеш да ги ограничил до 5 избора - направи го. Но смени AND с OR в заявката, че съм объркал.

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

nom3r1

Registered
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}";
?>

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

Горе