php - Search the database using 4 different select boxes -


i have rather complex "where" statement create. have searched many sites find answers , yet page still shows nothing.

business requirement: use 4 different drop downs results database either selecting one, all, or combination of four.

here php code file searchinstructors.php:

         <?php         $dsn = 'mysql: host=localhost; dbname=name';         $user = 'user';         $password = 'pass';         try {         $pdo = new pdo($dsn, $user, $password);         $pdo ->setattribute(pdo::attr_errmode, pdo::errmode_exception);         }         catch (pdoexception $e) {         echo 'connection failed: ' . $e->getmessage();         }           if(isset($_get['semester'])){             $semester = $_get['semester'];           }else{             $semester = "not selected";         }         if(isset($_get['year'])){             $year = $_get['year'];           }else{             $year = "not selected";         }         if(isset($_get['courseprefix'])){             $courseprefix = $_get['courseprefix'];           }else{             $courseprefix = "not selected";         }         if(isset($_get['coursenumber'])){             $coursenumber = $_get['coursenumber'];           }else{             $coursenumber = "not selected";         }          echo "<table class='tg' width='100%'>";         echo "<tr>                  <th><strong>course</strong></th>                         <th><strong>name</strong></th>                 <th><strong>email/phone</strong></th>                 <th><strong>semester</strong></th>                 <th><strong>institution</strong></th>         </tr>";         $sql="select courses.courseprefix  courses.coursenumber,   facultycontact.firstname, facultycontact.lastname, facultycontact.email, facultycontact.phone, facultycontact.institution, courses.semester, courses.year         courses         left join facultycontact          on courses.id=facultycontact.id         (courses.semester :semester , courses.year :year) or (courses.semester :semester , courses.courseprefix :courseprefix) or (courses.semester :semester , courses.coursenumber :coursenumber)  or (courses.year :year , courses.courseprefix :courseprefix) or (courses.year :year , courses.coursenumber :coursenumber) or (courses.courseprefix :courseprefix , courses.coursenumber :coursenumber) or (courses.semester :semester , courses.year :year , courses.courseprefix :courseprefix) or (courses.semester :semester , courses.year :year , courses.coursenumber :coursenumber) or  (courses.semester :semester , courses.year :year , courses.courseprefix :courseprefix , courses.coursenumber :coursenumber)         order facultycontact.lastname";          $stmt = $pdo->prepare($sql);         $stmt->bindparam(':semester', $semester, pdo::param_str);         $stmt->bindparam(':year', $year, pdo::param_int);         $stmt->bindparam(':courseprefix', $courseprefix, pdo::param_int);         $stmt->bindparam(':coursenumber', $coursenumber, pdo::param_int);         $stmt->execute();         $total = $stmt->rowcount();         while ($row = $stmt->fetchobject()) {             echo "<tr>                 <td>{$row->courseprefix}<br /> {$row->coursenumber} </td>                 <td>{$row->firstname} {$row->lastname}</td>                 <td>{$row->email} <br />{$row->phone}</td>                 <td>{$row->semester} {$row->year} </td>                 <td>{$row->institution} </td>";         }         if (empty($total)) {              echo '<td colspan="5">no results found selection<br>' .         '<strong>'. $semester . ' - ' . $year. ' - ' .  $courseprefix. ' - ' .     $coursenumber . '</strong></td>';          } else {             echo implode($total);         }          $pdo = null;         echo "</tr></table>";            ?> 

here html code in search_form.php:

                <div class="search-wrapper">          <form id="form2" method="get" action="searchinstructors.php">              <p>              <label for="semester">semester</label>                 <select name="semester" id="semester">                   <option selected="selected" value="not selected">select one</option>                   <option value="spring">spring</option>                   <option value="summer">summer</option>                   <option value="fall">fall</option>               </select>         </p>         <p>             <label for="year">year</label>                 <select name="year" id="year">                   <option selected="selected" value="not selected">select one</option>                   <option value="2015">2015</option>                   <option value="2014">2014</option>                   <option value="2013">2013</option>                 </select>             </p>             <p>             <label for="courseprefix">course subject</label>               <select name="courseprefix" id="courseprefix">                <option selected="selected" value="not selected">select one</option>                <option value="aced">aced</option>                <option value="crju">crju</option>                <option value="engl">engl</option>                <option value="fren">fren</option>                <option value="hadm">hadm</option>                <option value="leas">leas</option>                <option value="orgl">orgl</option>                <option value="pla">pla</option>                <option value="pols">pols</option>                <option value="psyc">psyc</option>                <option value="soci">soci</option>                <option value="span">span</option>              </select>         </p>         <p>      <label for="coursenumber">course number</label>       <select name="coursenumber" id="coursenumber">        <option selected="selected" value="not selected">select one</option>        <option value="1100">1100</option>        <option value="1101">1101</option>        <option value="1102">1102</option>        <option value="2000">2000</option>        <option value="2010">2010</option>        <option value="2050">2050</option>        <option value="2100">2100</option>        <option value="2200">2200</option>        <option value="2300">2300</option>        <option value="2400">2400</option>        <option value="2700">2700</option>        <option value="3000">3000</option>        <option value="3001">3001</option>        <option value="3002">3002</option>        <option value="3010">3010</option>        <option value="3030">3030</option>        <option value="3050">3050</option>        <option value="3100">3100</option>        <option value="3101">3101</option>        <option value="3110">3110</option>        <option value="3150">3150</option>        <option value="3160">3160</option>        <option value="3200">3200</option>        <option value="3201">3201</option>        <option value="3210">3210</option>        <option value="3220">3220</option>        <option value="3230">3230</option>        <option value="3240">3240</option>        <option value="3250">3250</option>        <option value="3260">3260</option>        <option value="3300">3300</option>        <option value="3301">3301</option>        <option value="3302">3302</option>        <option value="3303">3303</option>        <option value="3304">3304</option>        <option value="3350">3350</option>        <option value="3400">3400</option>        <option value="3500">3500</option>        <option value="3501">3501</option>        <option value="3600">3600</option>        <option value="3610">3610</option>        <option value="3700">3700</option>        <option value="3710">3710</option>        <option value="3800">3800</option>        <option value="3810">3810</option>        <option value="4000">4000</option>        <option value="4001">4001</option>        <option value="4002">4002</option>        <option value="4011">4011</option>        <option value="4020">4020</option>        <option value="4050">4050</option>        <option value="4070">4070</option>        <option value="4110">4110</option>        <option value="4160">4160</option>        <option value="4200">4200</option>        <option value="4210">4210</option>        <option value="4220">4220</option>        <option value="4230">4230</option>        <option value="4240">4240</option>        <option value="4250">4250</option>        <option value="4251">4251</option>        <option value="4260">4260</option>        <option value="4300">4300</option>        <option value="4301">4301</option>        <option value="4350">4350</option>        <option value="4401">4401</option>        <option value="4402">4402</option>        <option value="4500">4500</option>        <option value="4600">4600</option>        <option value="4610">4610</option>        <option value="4620">4620</option>        <option value="4650">4650</option>        <option value="4690">4690</option>        <option value="4700">4700</option>        <option value="4800">4800</option>        <option value="4802">4802</option>        <option value="4820">4820</option>        <option value="4860">4860</option>        <option value="4900">4900</option>        <option value="4950">4950</option>        <option value="4960">4960</option>        <option value="4980">4980</option>        <option value="4991">4991</option>      </select>       </p>       <div class="clear"></div>       <input type="submit" name="search" id="search" value="search" class="btn" />  </form>  </div> 

this doesn't work. tried this:

 if(isset($_get['semester'])){  $semester = $_get['semester'];  $query="select courses.courseprefix, courses.coursenumber, facultycontact.firstname, facultycontact.lastname, facultycontact.email, facultycontact.phone, facultycontact.institution, courses.semester, courses.year courses left join facultycontact  on courses.id=facultycontact.id courses.semester :semester or courses.year :year or  courses.courseprefix :courseprefix or courses.coursenumber :coursenumber order facultycontact.lastname";  }else{     $semester = "not selected";  }  if(isset($_get['year'])){      $year = $_get['year'];     $query="select courses.courseprefix, courses.coursenumber, facultycontact.firstname, facultycontact.lastname, facultycontact.email, facultycontact.phone, facultycontact.institution, courses.semester, courses.year courses left join facultycontact  on courses.id=facultycontact.id courses.semester :semester or courses.year :year or courses.courseprefix :courseprefix or courses.coursenumber :coursenumber order facultycontact.lastname";  }else{       $year = "not selected";  }  if(isset($_get['courseprefix'])){      $courseprefix = $_get['courseprefix'];     $query="select courses.courseprefix, courses.coursenumber, facultycontact.firstname, facultycontact.lastname, facultycontact.email, facultycontact.phone, facultycontact.institution, courses.semester, courses.year courses left join facultycontact  on courses.id=facultycontact.id courses.semester :semester or courses.year :year or courses.courseprefix :courseprefix or courses.coursenumber :coursenumber order facultycontact.lastname";  }else{    $courseprefix = "not selected";  }  if(isset($_get['coursenumber'])){      $coursenumber = $_get['coursenumber'];     $query="select courses.courseprefix, courses.coursenumber, facultycontact.firstname, facultycontact.lastname, facultycontact.email, facultycontact.phone, facultycontact.institution, courses.semester, courses.year courses left join facultycontact  on courses.id=facultycontact.id courses.semester :semester or courses.year :year or courses.courseprefix :courseprefix or courses.coursenumber :coursenumber order facultycontact.lastname";  }else{      $coursenumber = "not selected";  } 

it didn't work either. can make work when statement , and or. work 2 drop down , 1 or this:

courses.semester :semester , courses.year :year or  courses.semester :semester , courses.courseprefix :courseprefix or courses.semester :semester , courses.coursenumber :coursenumber 

i had thought creating views , making each drop down pull view, there many combinations , when new courses added have redo views. possible create statement or query take input 4 drop downs in combination?

instead of manually creating sql every possible combination of semester, year, prefix, , number, let php build dynamically.

define variables you'll want use in sql.

$inputs = array(     'semester'      => false,     'year'          => false,     'courseprefix'  => false,     'coursenumber'  => false ); 

check presence of variables in $_get array.

foreach ( $inputs $k => $v ) {     if ( isset($_get[$k]) ) {         $inputs[$k] = $_get[$k];     } } 

dynamically build clause in sql. note: code starting point , doesn't need, such bindings. you'll have yourself.

$sql = 'select your_columns courses left join your_joins '; $where = array(); foreach ( $inputs $k => $v ) {     if ( $v !== false ) {         $where[$k] = 'courses.'.$k.' = :'.$k;        } } if ( sizeof($where) > 0 ) {     $sql .= 'where '.implode(' , ', $where);   } $sql .= ' order some_columns'; 

now play few urls, e.g.

semester=summer&year=2009&courseprefix=pla semester=summer&year=2009 semester=summer 

and note how code doesn't know or care combination of parameters given.

once work out, adding option allow user specify and/or between parameters - or allowing them select multiples (e.g. checkboxes) super easy.


Comments

Popular posts from this blog

yii2 - Yii 2 Running a Cron in the basic template -

asp.net - 'System.Web.HttpContext' does not contain a definition for 'GetOwinContext' Mystery -

wso2esb - How to concatenate JSON array values in WSO2 ESB? -