MySQL заявка - въпрос

kopura

Registered
Имам една търсачка и с полета примерно 'ИМЕ' , 'Добавено от', 'формат' и 'Година'. Искато когато примерно когато някое от полетата е празно от mysql базата данни да изкарва всичките резултати от съответното поле. Ето пример:

Въвел съм полетата ИМЕ и ГОДИНА другите са празни.
PHP:
<?php
$name = $_POST['name'];
$added_by = $_POST['added_by'];
$format = $_POST['format'];
$year = $_POST['year'];

$result = mysql_query("SELECT * FROM `files` WHERE  name='$name' AND added_by='$added_by' AND format='$format' AND year='$year'");
while($red=mysql_fetch_array(...)){
....
}
?>

Така написана обаче заявката няма да върне резултат тъй като полетата ФОРМАТ и ДОБАВЕНО ОТ са празни. Искам да стане така , че когато са празни да взима всичките резултати, а когато не са да си търси съвпадения.
Надявам се да сте ме разбрали.
Благодаря предварително +1
Поздрави! :)
 
PHP:
<?php
function sql_protect($value) {
    $protected= trim($value);
    $protected= addslashes($protected);
    $protected= htmlspecialchars($protected);
    return $protected;
}

if(isset($_POST['name'])) {
    $name = sql_protect($_POST['name']);
    $query_where = "`name` = '$name'";
}
if(isset($_POST['added_by'])) {
    $added_by= sql_protect($_POST['added_by']);
    if(!empty($query_where))
        $query_where .= " AND ";
    $query_where .= "`added_by` = '$added_by'";
}
if(isset($_POST['format'])) {
    $format= sql_protect($_POST['format']);
    if(!empty($query_where))
        $query_where .= " AND ";
    $query_where .= "`format` = '$format'";
}
if(isset($_POST['year'])) {
    $year= (int)sql_protect($_POST['year']);
    if(!empty($query_where))
        $query_where .= " AND ";
    $query_where .= "`year` = '$year'";
}
$result = mysql_query("SELECT * FROM `files` WHERE $query_where");
while($red=mysql_fetch_array(...)){
....
}
?>
Може би някъде може да се поопрости, но набързо това скалъпих. Сложих ти елементарна защита от sql инжекции. Никога не използвай POST или GET променливи директно в sql заявка! Минавай ги поне през функциите, както ти ги направих! :wink:
 
И аз го мислех някак така да е. Ще поизчакам ако някой даде поопростен варянт. Мерси много иначе. :)
 
Е пък изобщо не е трудно ако ги събираш в един масив, и после да ги пльосваш в заявката :-)
PHP:
$array = array();
if ( !empty($added_by) ) $array[] = "added_by = '{$added_by}'";
....
PHP:
$result = mysql_query(sprintf("SELECT * FROM `files` WHERE  %s",implode(" AND) ",$asrray);
 

Back
Горе