mysql — множественные запросы деталей в переполнении стека

Я изучаю PHP около недели, и мне нужно несколько советов о том, следует ли мне использовать массивы для сортировки моих данных по нескольким переменным. Моя таблица содержит информацию об операх, композиторах, их национальности и содержит ссылку на соответствующий сайт.

Не будучи слишком многословным, мне нужно позволить пользователю выбирать данные на основе национальности, века, в котором они были написаны, и наличия или отсутствия соответствующей ссылки. Я бы хотел, чтобы они были еще более конкретными, но мой код быстро становится неуправляемым. Для 3 переменных у меня есть восемь отдельных запросов, охватывающих каждый случай. Если я хочу перейти к 4 переменным, мне нужно 16 запросов. Я знаю, что есть лучший способ сделать это, но я много раз читал, что массивы больше подходят для меньших количеств, а не обязательно для таблицы, содержащей около 40000 строк.

$req=$_REQUEST['nat'];
$req2=$_REQUEST['cent'];
$req3=$_REQUEST['imslp'];

if ($req!="any" && $req2!="any" && $req3=="yes") $query="SELECT * FROM operadatabase WHERE nationality='$req' AND century=$req2 AND imslplink = imslplink";
else if ($req!="any" && $req2!="any" && $req3=="no") $query="SELECT * FROM operadatabase WHERE nationality='$req' AND century=$req2";
else if ($req!="any" && $req2=="any" && $req3=="yes") $query="SELECT * FROM operadatabase WHERE nationality='$req' AND imslplink = imslplink";
else if ($req!="any" && $req2=="any" && $req3=="no") $query="SELECT * FROM operadatabase WHERE nationality='$req'";

else if($req=="any" && $req2!="any" && $req3=="yes") $query="SELECT * FROM operadatabase WHERE century=$req2 AND imslplink = imslplink";
else if($req=="any" && $req2!="any" && $req3=="no") $query="SELECT * FROM operadatabase WHERE century=$req2";
else if($req=="any" && $req2=="any" && $req3=="yes") $query="SELECT * FROM operadatabase WHERE imslplink = imslplink";
else if($req=="any" && $req2=="any" && $req3=="no") $query="SELECT * FROM operadatabase";

$result=mysql_query($query);
$num=mysql_numrows($result);
mysql_query($result);
mysql_close();

$i=0;
for ($i; $i < $num; $i++){
$f12=mysql_result($result,$i,"fullname");
$f13=mysql_result($result,$i,"operatitle");
$f14=mysql_result($result,$i,"nationality");
$f15=mysql_result($result,$i,"century");
$f16=mysql_result($result,$i,"imslplink");

echo "<tr>";
echo "<td>".$f12."</td><td>".$f13."</td>";
if(strlen($f14) > 2) {
echo '<td><img src="/icons/'.$f14.'.png" width="25" height="25"></td>';
}
echo "<td>".$f15."</td>";
if(substr($f16, 0, 4) == "http") {
echo "<td><a href=".$f16.">IMSLP</a></td>";
}

Наилучшим образом я могу сформулировать свой вопрос следующим образом: как в запросе выбрать набор данных, основанный на одной переменной, затем выбрать из этого набора на основе второй переменной, затем третьей и т. Д.? Или я могу вкладывать запросы?

0

Решение

Вы можете создать простой класс, который включает возвращаемые методы для цепочки. Вам нужно было бы назначить некоторые if / else здесь и, вероятно, добавить дополнительные переменные в класс, но вы поняли идею.

class   Combiner
{
public  $base;
public  function __construct($base = 'SELECT * FROM operadatabase')
{
// This saves the front of your select statement and makes it available
// for the rest of the methods. Uses in final Write() method
$this->base =   $base;
}

public  $vars;
public  function FetchNat($value = '')
{
// This just checks your $_REQUEST value here
if(!empty($value) && $value !== 'any')
// You'll want to sanitize this value
$this->vars[]   =   "nationality = '".mysql_real_escape_string($value)."'";
// Returning this allows you to use this method/function
// in your chain. That is why you are returning $this
// on all your methods/functions
return $this;
}

public  function FetchCent($value = '')
{
// This just checks your $_REQUEST value here
if(!empty($value) && $value !== 'any')
// You'll want to sanitize this value
$this->vars[]   =   "century = '".mysql_real_escape_string($value)."'";

return $this;
}

public  function FetchIMSLP($value = '')
{
// This just checks your $_REQUEST value here
if(!empty($value) && $value == 'yes')
$this->vars[]   =   "imslplink = 'imslplink'";

return $this;
}

public  $sql;
public  function Write()
{
// This compiles all the variables down the line and returns a final string
$statement  =   (isset($this->vars) && !empty($this->vars))? " where ".implode(" and ",$this->vars):"";
$this->sql  =   $this->base.$statement;
return $this;
}
}
// Create new instance of your auto-fetcher
$write  =   new Combiner();
// This is a method chain that will return an auto-compiling string as it compiles further down the line
$test   =   $write->FetchCent('')->FetchNat('test')->FetchIMSLP('yes')->Write()->sql;

print_r($test);

Это написало бы:

SELECT * FROM operadatabase where nationality = 'test' and imslplink = 'imslplink';
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector