2013-08-19 46 views
-2

我試圖使用PDO準備語句來運行查詢,該語句允許我讓用戶選擇一個字段,然後爲該字段輸入值,並將其包含在我的查詢中。PHP PDO綁定搜索框中的動態字段和值

因此,在這個基本的查詢:

$sql = "SELECT LastName, FirstName FROM administrators WHERE Status=:Status "; 
$stmt->bindParam(':Status',$Status, PDO::PARAM_STR); 

的偉大工程。

但是我有一個搜索表單,允許說用戶選擇下拉顯示名字,姓氏,然後在文本框中輸入搜索詞

$sql = "SELECT LastName, FirstName FROM administrators WHERE Status=:Status **AND FIELD = TERM**"; 

我還沒有發現任何很好的例子網上,這樣遠。任何指導表示讚賞。

我使用:

$params = array(); 
    if (!empty($SearchField) && !empty($SearchFor)) 
    { 
     $params['SearchField'] = $SearchField; 
     $params['SearchFor'] = $SearchFor; 
    } 

但我得到的錯誤: 致命錯誤:未捕獲的異常 'PDOException' 有消息「SQLSTATE [42S22]:列未找到:1054未知列 'SearchField' 在「where子句」

更新的代碼:

這是我從我的形式使用的代碼:

<input id="searchtext" name="searchtext" type="text" placeholder="Search" value="<?php echo GetParam('searchtext'); ?>" /> 
          <select name="searchby"> 
           <option value="">Search By</option> 
           <option id="LastName" value="LastName" <?php if(GetParam('searchby') == 'LastName'){echo "selected='selected'";}?>>Last Name</option> 
           <option id="FirstName" value="FirstName" <?php if(GetParam('searchby') == 'FirstName'){echo "selected='selected'";}?>>First Name</option> 
           <option id="RoleName" value="RoleName" <?php if(GetParam('searchby') == 'RoleName'){echo "selected='selected'";}?>>Role Name</option> 
          </select> 
          <input type="submit" id="submit" name="command" value="search" /> 

,這裏是我的方法的代碼:

public function GetAllUsers($Status = 'A',$SearchField = '',$SearchFor = '') 
{ 
$db=DB::getInstance(); 
$sql = "SELECT administrators.AdminId, AdminEmail, LastName, FirstName, PrimaryPhone, CellPhone, administrators.Status, LoginDateTime, RoleName FROM administrators INNER JOIN permissions on permissions.AdminId=administrators.AdminId INNER JOIN roles on roles.RoleId=permissions.RoleId INNER JOIN sessions on sessions.AdminId=administrators.AdminId WHERE Status=:Status "; 

$stmt=$db->prepare($sql); 
$stmt->bindParam(':Status',$Status, PDO::PARAM_STR); 

$stmt->execute(); 
return $stmt->fetchAll(PDO::FETCH_OBJ); 
} 
+1

[從提供的非常相關的問題清單向你wile你正忙着寫你的問題,並仍然顯示在此頁上的右列](http://stackoverflow.com/questions/4538960/dynamic-queries-with-php-pdo) –

+0

我早先試過這個例子,它並不完全適合我。我沒有一個特定的字段名稱具有特定的值,但一個字段可能是三個字段名稱之一,然後搜索字段,所以我需要它在$ SearchField = $ SearchFor。我沒有得到如何將這兩個綁定到SearchField =:SearchFor – Scott

回答

0

不能使用參數標識符(表/列名等)。您需要適當地清理這些並將它們注入到查詢字符串中。您仍然可以使用該參數作爲值。我也可能會帶着一系列可搜索的列。例如

// create a map of field key to column name mappings 
$searchCols = array(
    'fn' => 'FirstName', 
    'ln' => 'LastName' 
); 

當顯示你的表格,你可以用它來生成選項

<select name="SearchField"> 
    <?php foreach ($searchCols as $key => $label) : ?> 
    <option value="<?= htmlspecialchars($key) ?>"><?= htmlspecialchars($label) ?></option> 
    <?php endforeach ?> 
</select> 

現在用它來構建查詢

// you'll probably want some more validation around this 
$searchField = $searchCols[$_POST['SearchField']]; 

$query = sprintf('SELECT LastName, FirstName FROM administrators WHERE Status = :Status AND `%s` = :searchTerm', 
    $searchField); 

// prepare statement and bind status, etc ... 

$stmt->bindParam(':searchTerm', $SearchFor); 
+0

這不起作用 - 我不斷得到一個錯誤:致命錯誤:帶有消息'SQLSTATE [HY093]的未捕獲異常'PDOException':無效參數編號:綁定變量。我已經顯示了管理員表中的所有用戶,但是如果他們想要通過最後一個縮小範圍,首先...他們可以提交表單。我玩了一個switch語句,在其中添加了正確的字段名稱,但這似乎打敗了目的,我知道我的其他一些表單將有更多的選項可供搜索。 – Scott

+0

@Scott然後你需要展示更多的代碼。您的問題沒有足夠的數據來發現問題所在 – Phil

+0

我已經更新了上面的代碼。 – Scott