2014-08-27 95 views
0

最近,我一直在處理用戶可以選擇複選框的窗體,並根據選擇結果顯示錶中的數據庫信息。如何使用複選框檢索數據庫中的特定數據

我瀏覽了計算器的問題,發現一個問題,幾乎是相同的,即:Retrieve data from sql database and display in tables - Display certain data according to checkboxes checked

所以用這個信息,並從網上其他一些信息,我開始創建我的代碼。雖然完成後我有幾個錯誤,即我的數據庫字段是輸出重複,該字段的數據不輸出,並有兩個警告。經過大量的搜索和編輯/嘗試,我找不到合適的解決方案,因此我在這裏問這個問題。

在我顯示我的代碼之前,我首先給出關於複選框,數據庫和表/字段(和一個(小)註釋的信息:它是一個wordpress數據庫)。

我有1個名爲xxx_wp1的數據庫。該數據庫包含各種(wordpress)表,但我想從中檢索信息的表稱爲:wp_participants_database。

此表包含各種各樣的列(大約15)。儘管如此,在這個測試示例中,我只用了15個列中的3個:authorss,research_source和research_title。我在這3列中插入了一些隨機信息(3行)。 我創建的表單顯然有3個複選框(對於作者,研究來源和標題)。

基於以前的鏈接,我開始創建我的選擇代碼一些WordPress的信息,其計算方法如下:

<form method="post"> 
<input type="checkbox" name="columns[]" value="1" /><label for="Authors">Authors</label><br /> 
<input type="checkbox" name="columns[]" value="2" /><label for="Research Source">Research Source</label><br /> 
<input type="checkbox" name="columns[]" value="3" /><label for="Research Title">Research Title</label><br /> 
<input type="submit" name="go" value="Submit"/> 
</form> 

<?php 


$all = false; 
$column_names = array('1' => 'Authors', '2'=>'Research Source', '3'=>'Research Title'); 
$column_entries = isset($_POST['columns']) ? $_POST['columns'] : array(); 
$sql_columns = array(); 
foreach($column_entries as $i) { 
    if(array_key_exists($i, $column_names)) { 
    $sql_columns[] = $column_names[$i]; 
    } 
} 

if (empty($sql_columns)) { 
$all = true; 
$sql_columns[] = "*"; 
} else { 
$sql_columns[] = "authorss,research_source,research_title,"; 
} 
global $wpdb; 

//DNI CHECKBOX + ALL 
$tmp = $wpdb->get_results("SELECT ".implode(",", $sql_columns)." FROM wp_participants_database"); 

$result = mysql_query($tmp); 
echo "<table border='1' style='width:450px'> 
<tr> 
<th>authorss</th> 
<th>research_source</th> 
<th>research_title</th>"; 
foreach($column_names as $k => $v) { 
    if($all || (is_array($column_entries) && in_array($k, $column_entries))) 
    echo "<th>$v</th>"; 
} 
echo "</tr>"; 
while($row = mysql_fetch_assoc($result)) 
{ 
    echo "<tr>"; 
    echo "<td>" . $row['authorss'] . "</td>"; 
    echo "<td>" . $row['research_source'] . "</td>"; 
    echo "<td>" . $row['research_title'] . "</td>"; 
    foreach($column_names as $k => $v) { 
     if($all || (is_array($column_entries) && in_array($k, $column_entries))) { 
     echo "<th>".$row[$v]."</th>"; 
     } 
    } 
    echo "</tr>"; 
} 
echo '</table>'; 


?> 
<?php 
mysql_close(); 
?> 

正如你所看到的,quesry是有點不同,因爲它有連接到Wordpress數據庫(全局$ wpdb和$ wpdb-> get_results)。在輸入這個即時消息時,我認爲這也可能是問題的一部分,因爲這個get_results已經獲得了我以後也會得到的結果?

無論如何,當測試這個我得到一些錯誤/不正當行爲,我似乎無法弄清楚。

第一個錯誤是以下警告:

- Warning: mysql_query() expects parameter 1 to be string, array given in /home/xxx/domains/mysite.nl/public_html/Recap/wp-content/themes/radiate/templates/pdb-search-new.php on line 32 --- which is this line of code: `$result = mysql_query($tmp);` 
- Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in /home/xxx/domains/mysite.nl/public_html/Recap/wp-content/themes/radiate/templates/pdb-search-new.php on line 43 --- which is this line of code: `while($row = mysql_fetch_assoc($result))` 

的第二個問題是,所有的列甚至提交了兩次回顯。因此,這將意味着這行代碼正在做不管什麼:

if (empty($sql_columns)) { 
$all = true; 
$sql_columns[] = "*"; 
} else { 
$sql_columns[] = "authorss,research_source,research_title,"; 
} 

當我檢查一個選項,然後按提交按鈕,右列被顯示(所以耶的作品),但所有的3列仍然顯示(不管是什麼)以及選定的一個,所以我得到這個,如果我選擇第一個選項: authors research_source research_title作者(請注意,前3個是從我的定義,而最後一個是從我的定義$ column_names

最後一個問題是列的字段值沒有顯示,列只是空的。

所以問題是任何人都可以給我一些關於發生什麼問題的指針。

預先感謝您!

***** UPDATE *****

我做了一些調整與@Zeusarm的幫助

所以,首先我改變了警告(除其他外$wpdb->get_results更改爲$wpdb->query)和警告全部消失。出於某種原因,我給了$array_names只是他們的前端名稱(愚蠢的我),所以我改變了它,就像你建議他們在數據庫表中正確的列名。因此,第1,2,3場成爲:作者,research_source和research_title。

我還添加了其他更改。雖然錯誤全部消失,但我仍然獲得全部3列顯示+ 1重複(取決於所選複選框的數量)。另外,我仍然沒有得到存儲在列中的數據庫數據(例如:作者有以下存儲值:Barry,Henk和Nicolas。)。

現在的代碼如下(以形式拋棄了,因爲它仍然是相同的):

<?php 
$all = false; 
$column_names = array('1' => 'authorss', '2' => 'research_source', '3' => 'research_title'); 
if(isset($_POST['columns'])){ 
    $column_entries = $_POST['columns']; 
    $sql_columns = array(); 
    foreach($column_entries as $i) { 
     if(array_key_exists($i, $column_names)) { 
      $sql_columns[] = $column_names[$i]; 
     } 
    } 
    $sql_columns[] = "authorss"; 
    $sql_columns[] = "research_source"; 
    $sql_columns[] = "research_title"; 
} else { 
    $all = true; 
    $sql_columns[] = "*"; 
} 
global $wpdb; 

//DNI CHECKBOX + ALL 
$tmp = $wpdb->query("SELECT ".implode(",", $sql_columns)." FROM wp_participants_database"); 

$result = mysql_query($tmp); 
echo "<table border='1' style='width:450px'> 
<tr> 
<th>authorss</th> 
<th>research_source</th> 
<th>research_title</th>"; 
foreach($column_names as $k => $v) { 
    if($all || (is_array($column_entries) && in_array($k, $column_entries))) 
    echo "<th>$v</th>"; 
} 
echo "</tr>"; 

if($result!==false && mysql_num_rows($result)>0){ 
    while($row = mysql_fetch_assoc($result)){ 
     echo "<tr>"; 
     echo "<td>" . $row['authorss'] . "</td>"; 
    echo "<td>" . $row['research_source'] . "</td>"; 
     echo "<td>" . $row['research_title'] . "</td>"; 
     foreach($column_names as $k => $v) { 
      if($all || (is_array($column_entries) && in_array($k, $column_entries))) { 
       echo "<th>".$row[$v]."</th>"; 
      } 
     } 
     echo "</tr>"; 
    } 
    echo '</table>'; 
} 

?> 
<?php 
mysql_close(); 
?> 

*****更新2 *****

所以我改變了代碼最後我正在檢索數據庫的數據!所以我想我應該只用wordpress get_results來從現在開始查詢。 雖然我檢索的信息,我仍然有重複。當我進入頁面時,首先我有3個副本,並且數據檢索正在前3列中輸出。當我選擇1複選框選項時,該複選框的正確數據正在顯示,而來自其他複選框的其他數據不是(這樣工作)。雖然,例如,當我僅選擇作者複選框時,作者的數據將顯示在第一作者複選框中,並且只顯示1個副本(即「作者」)。雖然當我只點擊第二個複選框時,研究來源(列research_source),那麼該列的數據只是顯示(什麼是正確的),但數據輸出在第一作者列,並再次,1複製與正確的列名稱即「research_source」。

但是因爲一張圖片超過1000字,我添加了一些圖片來清除它。 (抱歉鏈接到圖片,但缺少2信譽直接張貼圖片)

起始列/頁(不變):選擇

The starting columns/page (untouched)

只有作者和提交:

留下這一個,因爲我也可以只上傳2個鏈接withh少於10個代表...

只有研究資料來源選擇並提交:

enter image description here

回答

1

我在你的代碼中看到的至少2個錯誤。

  1. 的$ COLUMN_NAMES關聯數組值應該爲字段名要傳遞的,所以我認爲他們是不正確的,因爲你對他們有空間(而據我所知由WordPress默認不具備這樣的場名。

  2. 如果某些選擇是由用戶提供的,那麼您將向用戶傳遞的一次添加一些額外的字段名稱,並且在它們之後有一個冒號,這樣會產生錯誤。陣列所以這就是爲什麼你得到的錯誤 -

正如你所說$ wpdb-> get_results已經返回的結果我也將改寫這樣的代碼

<?php 
$all = false; 
$column_names = array('1' => '`field1`', '2' => '`field2`', '3' => '`field3`'); 
if(isset($_POST['columns'])){ 
    $column_entries = $_POST['columns']; 
    $sql_columns = array(); 
    foreach($column_entries as $i) { 
     if(array_key_exists($i, $column_names)) { 
      $sql_columns[] = $column_names[$i]; 
     } 
    } 
    $sql_columns[] = "authorss"; 
    $sql_columns[] = "research_source"; 
    $sql_columns[] = "research_title"; 
} else { 
    $all = true; 
    $sql_columns[] = "*"; 
} 

。加上調用mysql_fetch_assoc之前,最好是檢查傳入的參數是林資源,如果行數不爲0

if($result!==false && mysql_num_rows($result)>0){ 
    while($row = mysql_fetch_assoc($result)){ 
     ... 
    } 
} 

*********** UPDATE ***根據最近更改********

試試這個代碼:

<?php 
$all = false; 
$column_names = array('1' => '`authorss`', '2' => '`research_source`', '3' => '`research_title`'); 
if(isset($_POST['columns'])){ 
    $column_entries = $_POST['columns']; 
    $sql_columns = array(); 
    foreach($column_entries as $i) { 
     if(array_key_exists($i, $column_names)) { 
      $sql_columns[] = $column_names[$i]; 
     } 
    } 
} else { 
    $all = true; 
    $sql_columns[] = "authorss"; 
    $sql_columns[] = "research_source"; 
    $sql_columns[] = "research_title"; 
} 

global $wpdb; 

//DNI CHECKBOX + ALL 
$tmp = $wpdb->get_results("SELECT ".implode(",", $sql_columns)." FROM wp_participants_database"); 


echo "<table border='1' style='width:450px'> 
    <tr> 
    <th>authorss</th> 
    <th>research_source</th> 
    <th>research_title</th>"; 
foreach($column_names as $k => $v) { 
    if($all || (is_array($column_entries) && in_array($k, $column_entries))) 
     echo "<th>$v</th>"; 
} 
echo "</tr>"; 

if(count($tmp)>0){ 
    for($i=0;$i<count($tmp);$i++){ 
     echo "<tr>"; 
      foreach($tmp[$i] as $key=>$value){ 
       echo "<td>" . $value . "</td>"; 
      } 
      foreach($column_names as $k => $v) { 
       if($all || (is_array($column_entries) && in_array($k, $column_entries))) { 
        echo "<th>".$row[$v]."</th>"; 
       } 
      } 
     echo "</tr>"; 
    } 
} 

echo '</table>'; 
?> 
+0

謝謝您的回覆快Zeusarm!我添加了您的建議更改,但仍然存在一些問題。看到我的主要職位更新爲他們。再一次,謝謝你! – Nicolas 2014-08-27 14:20:39

+0

好的,那麼你應該完全刪除'foreach'後面的行 - 這將解決3列+ 1重複(我保留代碼的一部分,因爲不知道複選框傳遞的字段名) – Zeusarm 2014-08-27 14:25:23

+0

好吧,完全是我的壞。我沒有正確刷新導致相同輸出的頁面。但與3 $ sql_clomuns []和否則{...}刪除我收到一個新的錯誤:警告:implode()[function.implode]:傳入無效的參數。並且,列的字段值仍然丟失。 – Nicolas 2014-08-27 14:51:40

相關問題