Problem with using Foreach to untangle arrays to form query

Discussion in 'PHP' started by harold.tor@ei-ie.org, Jul 15, 2008.

  1. #1
    Hi guys,

    I try to use foreach to print out a part of an mysql query, but always the last one cancels the previous one out. Please advise me on what to do:

    $searchterm=$_POST['searchterm'];


    if ($type) {
    foreach($_POST['type'] as $type) {
    $search_type = "AND type = '$type' ";
    }
    } else {
    $search_type = " ";
    }

    if ($year) {
    foreach($_POST['year'] as $year) {
    $search_year = "AND DATE_FORMAT(dateofissue,'%Y') = '$year' ";
    }
    } else {
    $search_year = " ";
    }

    if ($theme) {
    foreach($_POST['theme'] as $theme) {
    $search_theme = "AND keywords LIKE '%*$theme*%' ";
    }
    } else {
    $search_theme = " ";
    }

    if ($geography) {
    foreach($_POST['geography'] as $geography) {
    $search_geography = "AND geography = '$geography' ";
    }
    } else {
    $search_geography = " ";
    }

    $search_query = "SELECT * FROM library WHERE (title_en LIKE '%$searchterm%' OR fulltext_en LIKE '%$searchterm%') $search_type $search_year $search_theme $search_geography ORDER BY dateofissue DESC, type DESC, title_en DESC";


    The original values come from a form which one fills in. So geography[] is parsed to this and it can have one or more values. For example, if geography[]=africa and geography[]=asia, the query will only show "AND geography=asia" as the latter comes later.

    However the thing would work if I put the variable in the URL, like thisfile.php?geography[]=africa&geography[]=asia

    Can someone help me?
     
    harold.tor@ei-ie.org, Jul 15, 2008 IP
  2. BDazzler

    BDazzler Peon

    Messages:
    215
    Likes Received:
    5
    Best Answers:
    0
    Trophy Points:
    0
    #2
    Try this ...


    $search_geography = "";

    if ($geography) {
    foreach($_POST['geography'] as $geography) {
    $search_geography .= "AND geography = '$geography' ";
    }
    } else {
    $search_geography = " ";
    }

    Thiis is the difference: $search_geography .= "AND geography = '$geography' ";

    The append operator may be what you need.

    Also watch out for SQL Injection attacks on your method.
     
    BDazzler, Jul 15, 2008 IP