0

So Ive been designing a site where you see a table with persons and can filter that table by searching for an expression and make your search more specific by filtering by Group (Member, Guest, etc.), First Name, Last Name and Company the Person works for.

First off heres how I build the Query:

//Here I get the the searchvalue and filtervalues from the form

$searchq = $_POST['searchq'];                                                                                                               
$gruppenfilter = $_POST['typfilter'];
$vorname = $_POST['vorname'];
$nachname = $_POST['nachname'];
$unternehmen = $_POST['unternehmen'];

//Here I define some variables Ill use later on
$TitelQuery = NULL;
$VornameQuery = NULL;
$NachnameQuery = NULL;
$UnternehmenQuery = NULL;

$searchquery = "SELECT Titel, Vorname, Nachname, Unternehmen, Gruppe, Geschlecht FROM mitglieder WHERE";

    //The Code for this function can be found later on in my post
    filterQuery($gruppenfilter, $vorname, $nachname, $unternehmen);

    //Most of the variables used from now on are from the function

    if($NoFilter == false){
        $TitelQuery = "'$FilterQuery' AND Titel LIKE '%$searchq%'";

        if($vornameused == false){
            $VornameQuery = " OR '$FilterQuery' AND Vorname LIKE '%$searchq%'";
        }
        if($nachnameused == false){
            $NachnameQuery = " OR '$FilterQuery' AND Nachname LIKE '%$searchq%'";
        }
        if($unternehmenused == false){
            $UnternehmenQuery = " OR '$FilterQuery' AND Unternehmen LIKE '%$searchq%'";
        }

        $searchquery .= "'$TitelQuery''$VornameQuery''$NachnameQuery''$UnternehmenQuery'";
    }
    else{
        $searchquery .= " Titel LIKE '%$searchq%' OR Vorname LIKE '%$searchq%' OR Nachname LIKE '%$searchq%' OR Unternehmen LIKE '%$searchq%'";    
    }

Heres the code of the function:

function filterQuery ($gruppenfilter, $vorname, $nachname, $unternehmen)
{
    $used = false;
    $vornameused = false;
    $nachnameused = false;
    $unternehmenused = false;

    $NoFilter = true;

    $FilterQuery = "";

    if(! empty($gruppenfilter)){
        $FilterQuery .= " Gruppe LIKE '%$gruppenfilter%'";
        $NoFilter = false;
        $used = true; 
    }
    if(! empty($vorname)){
        if ($used == true){
            $FilterQuery .= " AND Vorname LIKE '%$vorname%'";    
        }
        else{
            $FilterQuery .= " Vorname LIKE '%$vorname%'";
            $used = true;
            $NoFilter = false;
        }

        $vornameused = true;
    }
    if(! empty($nachname)){
        if ($used == true){
            $FilterQuery .= " AND Nachname LIKE '%$nachname%'";
        }
        else{
            $FilterQuery .= " Nachname LIKE '%$nachname%'";
            $used = true;
            $NoFilter = false;
        }

        $nachnameused = true;
    }
    if(! empty($unternehmen)){
        if ($used == true){
            $FilterQuery .= " AND Unternehmen LIKE '%$unternehmen%'";
        }
        else{
            $FilterQuery .= " Unternehmen LIKE '%$unternehmen%'";
            $NoFilter = false;
        }

        $unternehmenused = true;
    }

    return $NoFilter;
    return $FilterQuery;
    return $nachnameused;
    return $vornameused;
    return $unternehmenused;
}

So to test the code I echoed out the query when the searchbutton is pressed.

So I type in "vic" and set no filters. So I expect the query:

SELECT Titel, Vorname, Nachname, Unternehmen, Gruppe, Geschlecht FROM mitglieder WHERE Titel LIKE '%$vic%' OR Vorname LIKE '%$vic%' OR Nachname LIKE '%$vic%' OR Unternehmen LIKE '%$vic%'

But instead get:

SELECT Titel, Vorname, Nachname, Unternehmen, Gruppe, Geschlecht FROM mitglieder WHERE''' AND Titel LIKE '%vic%''' OR '' AND Vorname LIKE '%vic%''' OR '' AND Nachname LIKE '%vic%''' OR '' AND Unternehmen LIKE '%vic%''

So apparently my function doesnt think that the filters were empty, despite me not touching them. And for some reason just uses "" instead of nothing.

Does anybody have a clue why this would happen?

w00ds98
  • 141
  • 8
  • 1
    PHP only support single return from function. Your `filterQuery()` with multiple `return` statement doesn't make any sense. Also, to use the return value, you need to explicitly assign the function return as variable (e.g. `$var = somefunc()`). You should not expect the variable to leak to the scope that calls the function. – Koala Yeung Sep 04 '18 at 11:12
  • The shot form is: `return` does not do what you think it does. It returns a value and does not update a variable in the caller's scope. – johannes Sep 04 '18 at 11:12
  • 1
    If you really want to do multiple return value, you can use a statement like `return array($value1, $value2, $value3);`. Then call the function like this: `list($var1, $var2, $var3) = somefunc();`. – Koala Yeung Sep 04 '18 at 11:13
  • @KoalaYeung Alright, so return does not work like that, good to know. Thanks! Any clue how I could use a variable that is defined in the function, outside of the function? – w00ds98 Sep 04 '18 at 11:14
  • `if($NoFilter == false){` `$NoFilter` seems to only exist within your function. – brombeer Sep 04 '18 at 11:14
  • @kerbholz how do I make it possible to use a variable outside of my function? – w00ds98 Sep 04 '18 at 11:15
  • @w00ds98: As described im my last comment: you can use a statement like `return array($value1, $value2, $value3);`. Then call the function like this: `list($var1, $var2, $var3) = somefunc();`. – Koala Yeung Sep 04 '18 at 11:17
  • 1
    return an array of the items you want `return ['no_filter'=>$NoFilter, 'filterQuery'=>$FilterQuery, 'nachnameused'=>$nachnameused, 'vornameused'=>$vornameused, 'unternehmenused'=>$unternehmenused];` – RiggsFolly Sep 04 '18 at 11:17
  • @KoalaYeung Great! Thanks :) – w00ds98 Sep 04 '18 at 11:18
  • also make sure to group your OR and AND clauses in logical groups with `()` around the 'groups'. – Jeff Sep 04 '18 at 11:23

1 Answers1

0

Ok guys figured it out with your help. Seems like you cant just use variables that were defined in a function, outside of said function, just like that.

Instead I need to return my values in an array and then call them up that way.

Thanks to anybody that helped!

w00ds98
  • 141
  • 8