Filtry výběru z DB – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Filtry výběru z DB – PHP – Fórum – Programujte.comFiltry výběru z DB – PHP – Fórum – Programujte.com

 

maniakum
~ Anonymní uživatel
16 příspěvků
14. 12. 2015   #1
-
0
-

Ahoj, 

mám databázi filmů a seriálů a snažím se pomocí selectu vyfiltrovat to co přesně hledám. Zatím to mám takto:

<select name="druh" onchange="this.form.submit()">
    <option value=""> zobrazit
        <?php
        if($druh=="serial")
            $selected_serial = "selected";
        else
            $selected_serial = "";
        if($druh=="film")
            $selected_film = "selected";
        else
            $selected_film = "";
        ?>
    <option value="serial" <?php echo $selected_serial?>> seriály
    <option value="film" <?php echo $selected_film?>> filmy
</select>
<select name="hodnoceni" onchange="this.form.submit()">
    <option value=""> hodnocení
        <?php
        if($hodnoceni=="top")
            $selected_top = "selected";
        else
            $selected_top = "";
        if($hodnoceni=="worst")
            $selected_worst = "selected";
        else
            $selected_worst = "";
        ?>
    <option value="top" <?php echo $selected_top?>> od nejlepšího
    <option value="worst" <?php echo $selected_worst?>> od nejhoršího
</select>
<select name="zanr" onchange="this.form.submit()">
    <option value=""> žánr
    <?php
    sort($zanr_filtr);
    for($i=1;$i<count($zanr_filtr);$i++){
        if($zanr==$zanr_filtr[$i])
            $selected = "selected";
        else
            $selected = "";
        echo "<option value=\"$zanr_filtr[$i]\" $selected> $zanr_filtr[$i]";
    }
    ?>
</select>
<select name="videno" onchange="this.form.submit()">
    <option value=""> historie
    <?php
    if($videno=="yes")
        $videno_y = "selected";
    else
        $videno_y = "";
    if($videno=="no")
        $videno_n = "selected";
    else
        $videno_n = "";
    ?>    
    <option value="yes" <?php echo $videno_y;?>> viděno
    <option value="no" <?php echo $videno_n;?>> neviděno
</select>
<select name="jazyk" onchange="this.form.submit()">
    <option value=""> zvuková stopa
    <?php
    sort($jazyk_filtr);
    for($i=1;$i<count($jazyk_filtr);$i++){
        if($jazyk==$jazyk_filtr[$i])
            $selected = "selected";
        else
            $selected = "";
        echo "<option value=\"$jazyk_filtr[$i]\" $selected> $jazyk_filtr[$i]";
    }
    ?>
</select>
elseif($druh=="" and $zanr=="" and $videno!="" and $jazyk!=""){
	$Podminka .= "WHERE audio LIKE '%".$jazyk."%' ";
        if($videno=="yes") {
       		for($i = 0; $i <= $csfd_id_historie_count - 1; $i++){
        		if($i == $csfd_id_historie_count - 1)
                		$nic .= "'".$csfd_id_historie[$i]."'";
	                else
        	                $nic .= "'".$csfd_id_historie[$i]."',";
	        }
	        $Podminka .= "AND csfd_id in ($nic) ";
	}
	elseif ($videno=="no") {
        	for($i = 0; $i <= $csfd_id_historie_count - 1; $i++){
	        	if($i == $csfd_id_historie_count - 1)
	        	        $nic .= "'".$csfd_id_historie[$i]."'";
        	        else
                	        $nic .= "'".$csfd_id_historie[$i]."',";
	        }
        	$Podminka .= "AND csfd_id not in ($nic)";
	}
}
elseif($druh=="" and $zanr!="" and $videno!="" and $jazyk!=""){
	$Podminka .= "WHERE genres LIKE '%".$zanr."%' AND audio LIKE '%".$jazyk."%' ";
        if($videno=="yes") {
        	for($i = 0; $i <= $csfd_id_historie_count - 1; $i++){
                	if($i == $csfd_id_historie_count - 1)
                        	$nic .= "'".$csfd_id_historie[$i]."'";
                        else
                                $nic .= "'".$csfd_id_historie[$i]."',";
        	}
                $Podminka .= "AND csfd_id in ($nic) ";
        }
        elseif ($videno=="no") {
                for($i = 0; $i <= $csfd_id_historie_count - 1; $i++){
        		if($i == $csfd_id_historie_count - 1)
                        	$nic .= "'".$csfd_id_historie[$i]."'";
                        else
                                $nic .= "'".$csfd_id_historie[$i]."',";
                }
                $Podminka .= "AND csfd_id not in ($nic)";
        }
}

A tak dále ve stejném duchu. 

Jak se to dá udělat jinak, abych nemusel používat elseif?

Nahlásit jako SPAM
IP: 82.142.100.–
peter
~ Anonymní uživatel
3981 příspěvků
15. 12. 2015   #2
-
0
-

A proc to takhle mas divne? Tam muzes nastavit nejake $bool = true / false a celou podminku videno yes/no resit az na konec jen 1x. Navic muzes pouzit funkci implode(",",array('a','b','c')).
Taky si muzes udelat na generovani selectu funkci, ktere predas name, id, pole_data(key=>value,...) a pole_selected (key,key,...), protoze existuje neco jako multiselect pres ctrl a shift, ze jo.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:7878:fb...–
Kit+15
Guru
15. 12. 2015   #3
-
0
-

#1 maniakum
Klíčová slova else ani elseif už nepoužívám. Zkusil jsem si tvůj příklad trochu předělat: 

<?php
$druh = 'serial';
$hodnoceni = 'top';
$zanr_filtr = array('scifi', 'akcni', 'romantický');
$zanr = 'scifi';
$jazyk_filtr = array('cs', 'de', 'en');
$jazyk = 'cs';
$videno = 'no';

$selected_serial = ($druh == "serial") ? "selected" : "";
$selected_film = ($druh == "film") ? "selected" : "";
$selected_top = ($hodnoceni == "top") ? "selected" : "";
$selected_worst = ($hodnoceni == "worst") ? "selected" : "";
sort($zanr_filtr);
$zanr_seznam = implode("\n\t",
    array_map(
        function($filtr) use ($zanr) {
            $selected = ($zanr == $filtr) ? "selected" : "";
            return "<option value=\"$filtr\" $selected> $filtr";
        },
            $zanr_filtr)
        );
$videno_y = ($videno == "yes") ? "selected" : "";
$videno_n = ($videno == "no") ? "selected" : "";
sort($jazyk_filtr);
$jazyk_seznam = implode("\n\t",
    array_map(
        function($filtr) use ($jazyk) {
            $selected = ($jazyk == $filtr) ? "selected" : "";
            return "<option value=\"$filtr\" $selected> $filtr";
        },
            $jazyk_filtr)
        );
echo <<<EOT
<select name="druh" onchange="this.form.submit()">
    <option value=""> zobrazit
    <option value="serial" $selected_serial> seriály
    <option value="film" $selected_film> filmy
</select>
<select name="hodnoceni" onchange="this.form.submit()">
    <option value=""> hodnocení
    <option value="top" $selected_top> od nejlepšího
    <option value="worst" $selected_worst> od nejhoršího
</select>
<select name="zanr" onchange="this.form.submit()">
    <option value=""> žánr
    $zanr_seznam
</select>
<select name="videno" onchange="this.form.submit()">
    <option value=""> historie
    <option value="yes" $videno_y> viděno
    <option value="no" $videno_n> neviděno
</select>
<select name="jazyk" onchange="this.form.submit()">
    <option value=""> zvuková stopa
    $jazyk_seznam
</select>
EOT;

Ještě zpracování: 

<?php
$podminky = array();
$hodnoty = array();
if ($videno == "yes") {
    $podminky[] = "csfd_id IN (SELECT id FROM csfd_historie WHERE user_id=?)";
    $hodnoty[] = $user;
}
if ($videno == "no") {
    $podminky[] = "csfd_id NOT IN (SELECT id FROM csfd_historie WHERE user_id=?)";
    $hodnoty[] = $user;
}
if (isset($jazyk) && $jazyk != "") {
    $podminky[] = "audio LIKE ?";
    $hodnoty[] = "%{$jazyk}%";
}
if (isset($zanr) && $zanr != "") {
    $podminky[] = "genres LIKE ?";
    $hodnoty[] = "%{$zanr}%";
}
$sql = "SELECT * FROM movie WHERE " . implode(' AND ', $podminky);
$select = $pdo->prepare($sql);
$select->execute($hodnoty);
$data = $select->fetchAll(PDO::FETCH_ASSOC);
Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Kit+15
Guru
15. 12. 2015   #4
-
0
-

#2 peter

Boolean by nepomohl, protože používá třístavovou logiku:

  1. $videno == "yes"
  2. $videno == "no"
  3. !isset($videno), resp. nic z toho.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
15. 12. 2015   #5
-
0
-

3 stavy tam nepotrebuje. Stav videno=="" mel odfiltrovat uz na zacatku a nastavit na "no". Ale do toho se mu michat nebudu.
A myslel jsem to jinak. Celou tu detekci na videno a nevideno muze resit az podtim, kdyz je to porad stejne, nemusi to duplikovat do kazde podminky zvlast.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:7878:fb...–
maniakum0
Newbie
15. 12. 2015   #6
-
0
-

#5 peter
Potřebuji tři stavy, resp. potřebuji, aby se filtrovalo videno="ano", videno="no" a oba, tedy viděno i neviděno.

Ještě jsem neměl čas se na to pořádně podívat, ale vesměs mi jde o to, udělat to pořádně a abych v případě přidání dalšího filtru nemusel jak blbce předělávat elseif podmínky.

Nahlásit jako SPAM
IP: 80.188.138.–
Kit+15
Guru
16. 12. 2015   #7
-
0
-

#6 maniakum
Tak se na to pořádně podívej, protože tam žádné else ani elseif nemám. Další podmínky prostě přidáš před řádek začínající "$sql =".

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:207:e...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
3981 příspěvků
18. 12. 2015   #8
-
0
-

 Tak, muzu dat i zjednodusenou verzi a pro RGB (v komentu pokus pro imagemagic, uprava +-n na +n, upvrava pokus o prepsani funkci chr; ale on chce na prepis funkci a imagemagick instalovat cosi, coz se mi nechce).
1920x1200 rgb, zpracovano za 23s, komprese gzip 40/69 = 58%

<?php
ini_set('max_execution_time', 10000);	//10000s
set_time_limit(10000);   
ini_set('memory_limit', '256M');

function microtime_float()	//pp 17.3.2014
{
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
$time = array();
$time[] = microtime_float();

function timePrint($time)
{
$time[] = microtime_float();
$t = array();
$t[] = round($time[count($time)-1]-$time[0],3);
for ($i=1;$i<count($time);$i++)
	{
	$t[] = round($time[$i]-$time[$i-1],3);
	}
$t = implode(" | ",$t);
echo '<hr>Cas zpracovani '.$t.' s';
}



function transf(&$img,$w,$h)//&$imagick
{
$out = array('','','');
$c   = array(0,0,0);
$tmp = array(0,0,0);
$tbl = array();
$n = 256;
$nn = $n>>1;
$m = 0;
for ($i=0,$j=-$n;$i<$n;++$i,++$j)
	{

	$tbl[$j] = chr($i);
	$tbl[$i] = chr($i);
/*
	$m = $i<$nn ? $i : $n-1-$i;
	$tbl[$j] = chr($m);
	$tbl[$i] = chr($m);
*/
	}
ksort($tbl);
//$a = 0;
//$iterator = $imagick->getPixelIterator();
$pixel = 0;
for ($j=0;$j<$h;++$j)
	{
	for ($i=0;$i<$w;++$i)
		{
		$pixel = imagecolorat($img, $i, $j);
//return '';
		$c[2] = $pixel & 0xFF;
		$c[1] = ($pixel >> 8) & 0xFF;
		$c[0] = ($pixel >> 16) & 0xFF;
		$out[0] .= $tbl[$c[0]-$tmp[0]];
		$out[1] .= $tbl[$c[1]-$tmp[1]];
		$out[2] .= $tbl[$c[2]-$tmp[2]];
		$tmp[0] = $c[0];
		$tmp[1] = $c[1];
		$tmp[2] = $c[2];
		}
	}
/*
for ($j=0;$j<$h;++$j)
	{
	for ($i=0;$i<$w;++$i)
		{
		$pixel = imagecolorat($img, $i, $j);

foreach($iterator as $row => $pixels)
	{
	foreach ($pixels as $column => $pixel)
		{
var_dump($pixel);
	$iterator->syncIterator();
return '';
*/
return $out[0].$out[1].$out[2];
}

/*
<?php
$imagick = new Imagick("my_image.jpeg");
$iterator = $imagick->getPixelIterator();

foreach($iterator as $row => $pixels) {
    foreach ($pixels as $column => $pixel) {
        // Do something with $pixel
    }
    $iterator->syncIterator();
}
?>
*/



$name1 = "img/jp-bwgirl.jpeg";	//
$name1 = "img/tropical-island-hut.jpg";	//
//$name1 = "img/jp-bwgirl-2.jpeg";	//
$name2 = "tmp/xxx";	//
$bool = file_exists($name1);
echo 'Soubor '.$name1.' '. ($bool ? 'existuje' : 'chyba neexistuje').'<br>';
$b = filesize($name1);

$img = imagecreatefromjpeg($name1);
$w = imagesx($img);
$h = imagesy($img);
//$imagick = new Imagick($name1);
//$w = $imagick->getImageWidth();
//$h = $imagick->getImageHeight();

//var_dump($img);
//imagexbm($img, 'simpletext.xbm');
//header('Content-Type: image/vnd.wap.wbmp');
//imagewbmp($img,$name2);
////header('Content-Type: ' . image_type_to_mime_type(IMAGETYPE_WBMP));
////image2wbmp($img);

$b = $w*$h*3;
$out = '';
$out = transf($img,$w,$h);
imagedestroy($img);




$a = 0;
$out = gzcompress($out,9);	

$file2 = fopen($name2, "wb");
fwrite($file2,$out);
fclose($file2);

$a = strlen($out);	unset($out);
echo '<br>out / in =  floor(10000*$a/$b)/100 % gzip';
echo '<br>'.$a. ' / '. $b .' = '.(floor(10000*$a/$b)/100).'% gzip';
echo '<br>'.$w. ' x '. $h .' = '.($w * $h);







timePrint($time);

/*
class charCode
{
private $a, $b;
function __construct()
	{
	$this->a = array();
	$this->b = array();
	for($i=0;$i<256;++$i)
		{
		$this->a[$i] = chr($i);
		$this->b[chr($i)] = $i;
		}
	}
function chr($code)
	{return $this->b[$code];}
function ord($char)
	{return $this->a[$char];}

}
$charcode = new charCode();
//rename_function('strlen', 'new_strlen');
//override_function('chr', '$code', 'return $charcode->chr($code);');
//override_function('ord', '$char', 'return $charcode->ord($char);');
runkit_function_redefine('chr', '$code', 'return $charcode->chr($code);');
runkit_function_redefine('ord', '$char', 'return $charcode->ord($char);');
*/
?>
Nahlásit jako SPAM
IP: 2001:718:2601:26c:dc3b:7d...–
peter
~ Anonymní uživatel
3981 příspěvků
18. 12. 2015   #9
-
0
-

sis, vedle, smazat

Nahlásit jako SPAM
IP: 2001:718:2601:26c:dc3b:7d...–
maniakum0
Newbie
24. 12. 2015   #10
-
0
-

Děkuji za kód. S drobnými úpravami funkční přesně jak jsem si představoval.

Nahlásit jako SPAM
IP: 82.142.100.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Filtry — založil georginho

Filtry — založil simmarek1234

Filtry v IE — založil Ondřej Škvor

Filtry - ošoupaný styl — založil PetrXXXL

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý