2014-07-23 18 views
1

我試圖讓SQL查詢成爲動態的。PHP選擇所有等於1的變量

這些是我採取的步驟:

步驟1:

//Here the user sets which table fields will be used: 
<input type="checkbox" name="id" value="1"> ID 
<input type="checkbox" name="name" value="1"> name 
<input type="checkbox" name="email" value="1"> email 

步驟2:

//Here I see what fields the user wants to use and set a variable to 1 
<?php 
if (isset($_POST['id']) && $_POST['id'] == "1") 
{ 
    $form_id='1'; 
} 
//etc etc 
?> 

步驟3:

//And finally here's the sql query 
$sql = mysql_query("select * from mytable"); 

現在我需要設置用戶選擇查詢的字段。

例如,如果用戶檢查idname,那麼就應該是這樣的:

$sql = mysql_query("select id, name from $table"); 

什麼是這樣做的最佳方式?

+2

[**在新的代碼,請不要使用'mysql_ *'功能**](HTTP: //bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**粉紅色框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – h2ooooooo

+0

我發現你的問題有點不清楚,但編輯後我覺得它更容易理解。 – Jonast92

回答

3

爲什麼不把所有的字段名稱都放到數組中而不是設置不同的變量?

$fields = []; 
if(isset($_POST['id']) && $_POST['id'] == 1) { 
    $fields[] = 'id'; 
} 

那麼你就應該能夠在陣列內爆一起爲了讓您的選擇欄:

$fields = implode(', ', $fields); 

此外,@ h2ooooo是正確的,請避免使用mysql_功能。他們已被depracated並將在未來版本的PHP中被刪除。

1

基本的解決方案是檢查哪些參數已設置並等於一個,並將列名稱推入數組(如果是這種情況)。

然後,您可以遍歷數組並將字段連接到查詢,使其成爲動態

這裏最大的問題是您使用mysql_*函數deprecated。我推薦使用PDO,因爲我覺得它們舒適且方便使用,但mysqli也是可行的。

隨着PDO和mysqli你將能夠使用prepared-statements這是最好的方法來防止注射所以請使用它們。

解決方案

使用ternary運營商,我們可以檢查哪些參數設置,並相應分配的字段名。

$id = isset($_POST['id']) && $_POST['id'] == 1 ? 'id' : null; 
$name = isset($_POST['name']) && $_POST['name'] == 1 ? 'name' : null; 
$email = isset($_POST['email']) && $_POST['email'] == 1 ? 'email' : null; 

我這樣做becuse我覺得三元運營商漂亮不是多個if語句。

讓我們構建一個數組,我們剛創建的變量:

$parameters = array($id, $name, $email); 

通過簡單地檢查該字段不null我們可以很容易地構造柱陣列。

$columns = array(); 
foreach($parameters as $column) 
{ 
    if($column != null) 
    { 
     $columns[] = $column; 
    } 
} 

最後,我們可以implode列在一起,用逗號分隔它們:

$activeColumns = implode(",", $columns); 

所以,你可以使用$activeColumns爲您的查詢,然後將其推薦給在之後準備的一部分。

+1

這或多或少是@watcher的回答,但我已經開始寫答案,所以我讓它留下來。 – Jonast92

1

簡單地可以使用!空()函數而不是isset()函數& & $ _ POST [ '身份證'] == 1

$select_fields = array(); 
if(!empty($_POST['id'])) 
    $select_fields[] = 'id'; 
if(!empty($_POST['name'])) 
    $select_fields[] = 'name'; 
if(!empty($_POST['email'])) 
    $select_fields[] = 'email'; 

$query_fields = implode(', ', $select_fields); 

$sql = mysql_query("select $query_fields from $table");