2013-04-24 69 views
0

我有一個腳本,從一個mysql結果產生一個表,我的目標是使列顯示完全動態基於一個變量,其中包含我想顯示的列的名稱。我已經制作表格標題這種方式使用此代碼:如果列名稱匹配變量只打印行列

$search_field_names=explode(',', $search_field_names)  
for($i=0, $count=count($search_field_names);$i<$count;$i++) { 
     echo ('<th>'.$search_field_names[$i].'</th>'); 
    } 

其中$ search_field_names是一個逗號separatated值的字符串(例如像fristname,姓氏,USER_ID等)。

打一個比方,假設上面的字符串包含我要顯示這樣的列名7:

$search_field_names=('firstname,lastname,dob,company,position,user_id,date_added') 

第一代碼片段將隨後產生的表與7名標題。

然後出現棘手的部分:存儲所有記錄的數據庫表共有22列。通過完成與第一個片段打印記錄完全相同的內容,結果將會打印該表格的前7列,這不一定是我想要的。

這裏是我得到的記錄(這abviously自帶的腳本上面的片斷後):

$query=mysqli_query($mysqli, "SELECT * FROM table WHERE column_name1='$search_query' AND column_name2='$search_query' etc...); 
while($row=mysqli_fetch_assoc($query)) { 
echo('<tr>'); 
for($i=0, $count=count($search_field_names);$i<$count;$i++) { 
     echo ('<td>'.$row[$i].'</td>'); 
    } 
echo('</tr>'); 

所以,我想實現的是隻取在數據庫中,這correspons列到變量$ search_field_names中設置的名稱。

+1

爲什麼不;噸你改變你的選擇查詢並只獲取​​$ Search_field_names變量中可用的列? – Haider 2013-04-24 11:49:20

+0

因爲我的網頁的每個用戶都有數據存儲在數據庫的不同列中,所以查詢會搜索所有列。但是,正如你提到的那樣,是否有可能在搜索查詢中爲()循環做類似的操作,所以它只搜索存儲在變量中的列?如果這是可能的這可能會解決我的問題。 – Vegard 2013-04-24 11:58:16

回答

1

兩種解決方案,由海德爾建議,請使用$ search_field_names變量,以適應​​您的查詢:

​​

或者,因爲你在做一個mysqli_fetch_assoc,這應該工作:

$query=mysqli_query($mysqli, "SELECT * FROM table"); 
while($row=mysqli_fetch_assoc($query)) { 
    echo('<tr>'); 
    for($i=0, $count=count($search_field_names);$i<$count;$i++) { 
     // Using header name as the key to the column 
     echo ('<td>'.$row[ $search_field_names[$i] ].'</td>'); 
    } 
    echo('</tr>'); 
} 

編輯:到目前爲止,我們只看巧妙循環$ search_field_names來生成結果表。您在最後的評論中詢問了構建查詢約束條件時是否可以使用相同的技巧。一個問題是,你的似乎要直接在您的查詢中使用$ _POST。請不要這樣做,這是SQL injections的來源。另一個問題是,我們永遠不會聰明。如果所有字段的類型都是相同的,我們可以這樣做,但如果其中一個搜索字段是日期或整數,那麼編寫和調試將會非常困難。

所以,如果你真的要巧用你的查詢,你可以做這樣的事情(假設所有搜索字段字符串值):

<?php 
// Assuming you have a $post_array like so, where inputs have the same names as the column names in the database 
// $post_array = array('username' => 'T', 'url' => 'http'); 

// Build constraints of the form column_name LIKE 'value%' 
$constraints = array(); 
foreach ($post_array as $key => $value) { 
    $constraints[] = "$key LIKE ?"; 
    $post_array[$key] = $value.'%'; 
} 

// Build a query selecting the columns from $post_array, with corresponding constraints 
// Note : replace " AND " by " OR " if you want the query to match ANY parameter. 
$query_text = "SELECT ".implode(", ", array_keys($post_array))." FROM table WHERE ".implode(" AND ", $constraints); 

// Prepare this query, we don't want SQL injections! 
$query = $mysqli->prepare($query_text); 

$bind = array(); 
foreach ($post_array as $key => $value) { 
    // We need to use our bind variables outside the scope of this loop, so we create them in $GLOBALS 
    $GLOBALS[$key] = $value; 
    // Array of references to our bind variables. 
    $bind[] = &$$key; 
} 
// Binding the parameters : we need as many 's' as there are inputs 
$bindtypes = str_repeat('s', count($post_array)) 
call_user_func_array(array($query, 'bind_param'), array_merge(array($bindtypes), $bind)); 
// Binding the retrieved columns 
echo call_user_func_array(array($query, 'bind_result'), $bind); 
$query->execute(); 

// Header row 
echo '<tr>'; 
foreach ($post_array as $key => $value) { 
    echo '<th>'.$key.'</th>'; 
} 
echo '</tr>'; 

// Result rows 
while ($query->fetch()) { 
    echo('<tr>'); 
    foreach ($post_array as $key => $value) { 
     echo '<td>', $$key, '</td>'; 
    } 
    echo('</tr>'); 
} 
?> 
+0

是的,這是一個可能的解決方案,但是我忘了在我的原始問題中包含查詢是SELECT .. FROM table WHERE column_name ='$ search_query'。 – Vegard 2013-04-24 12:26:39

+0

我不明白這個查詢。 '$ search_query'變量中有什麼? 'column_name'是什麼意思? – 2013-04-24 13:08:56

+0

$ search_query是來自輸入字段的POST變量 column_name只是一個示例。一個真實世界的例子是: SELECT .. FROM table WHERE firstname LIKE'$ search_query%'和lastname LIKE'$ search_query $'等。 – Vegard 2013-04-25 06:09:52