最近,我一直在處理用戶可以選擇複選框的窗體,並根據選擇結果顯示錶中的數據庫信息。如何使用複選框檢索數據庫中的特定數據
我瀏覽了計算器的問題,發現一個問題,幾乎是相同的,即: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信譽直接張貼圖片)
起始列/頁(不變):選擇
只有作者和提交:
留下這一個,因爲我也可以只上傳2個鏈接withh少於10個代表...
只有研究資料來源選擇並提交:
謝謝您的回覆快Zeusarm!我添加了您的建議更改,但仍然存在一些問題。看到我的主要職位更新爲他們。再一次,謝謝你! – Nicolas 2014-08-27 14:20:39
好的,那麼你應該完全刪除'foreach'後面的行 - 這將解決3列+ 1重複(我保留代碼的一部分,因爲不知道複選框傳遞的字段名) – Zeusarm 2014-08-27 14:25:23
好吧,完全是我的壞。我沒有正確刷新導致相同輸出的頁面。但與3 $ sql_clomuns []和否則{...}刪除我收到一個新的錯誤:警告:implode()[function.implode]:傳入無效的參數。並且,列的字段值仍然丟失。 – Nicolas 2014-08-27 14:51:40