如何使用复选框检索数据库中的特定数据

时间:2014-08-27 13:04:59

标签: php mysql database wordpress checkbox

最近我一直在处理一个表单,用户可以使用该表单选择一个复选框,作为选择的结果,它会在表格中显示数据库信息。

我浏览了stackoverflow问题,发现了一个几乎相同的问题,即:Retrieve data from sql database and display in tables - Display certain data according to checkboxes checked

因此,通过这些信息以及来自网络的其他信息,我开始创建我的代码。虽然在完成后我有几个错误,即我的数据库字段在输出上是重复的,但是该字段所输出的数据没有输出,并且有两个警告。经过大量的搜索和编辑/尝试,我无法找到正确的解决方案,因此我在这里提出这个问题。

在我显示我的代码之前,我首先提供一些关于复选框,数据库和表/字段的信息(以及一个(小)注释:它是一个wordpress数据库)。

我有一个名为xxx_wp1的数据库。这个数据库包含各种(wordpress)表,但是我想从中检索信息的表叫做:wp_participants_database。

此表包含各种列(大约15个)。但是,对于这个测试示例,我只使用了15个名称中的3个列:authorss,research_source和research_title。我在这3列中插入了一些随机信息(3行)。 我创建的表单显然有每个列的3个复选框(因此作者,研究来源和标题为1)。

基于之前的链接和一些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();
?>

正如您所看到的,问题有点不同,因为它必须连接到Wordpress数据库(全局$ wpdb和$ wpdb-&gt; 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列仍然显示(无论如何)以及所选的一列,所以我如果我选择第一个选项,那就得到这个: 作者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个复制品(即“作者&#39;”)。虽然当我只点击第二个复选框,研究源(列research_source),然后该列的数据只显示(什么是正确的)但是数据正在第一作者列中输出,并且再次使用正确的列重复1次名称是&#39; research_source&#39;。

但是因为一张照片说的超过1000个单词,我添加了一些图像来清除它。 (对不起图片的链接,但缺少2个声望直接发布图片)

起始栏/页面(未触及):

The starting columns/page (untouched)

仅选择并提交作者:

留下这个,因为我也只能上传2个链接,少于10个代表......

仅选择并提交了研究来源:

enter image description here

1 个答案:

答案 0 :(得分:1)

我在代码中看到至少2个错误。

  1. $ column_names关联数组值应该作为字段名称传递,所以我假设它们不正确,因为它们中有空格(并且我知道wordpress默认情况下没有这样的字段名称

  2. 如果用户提供了一些选择,则会向用户传递一次额外的字段名称,并且在它们之后有一个冒号,因此会产生错误。

  3. 我会像这样重写代码

    <?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[] = "*";
    }
    

    另外正如你所说的那样$ wpdb-&gt; get_results已经返回结果 - 数组,这就是你得到错误的原因。在调用mysql_fetch_assoc之前,最好检查传递的参数是否为recource,以及行数是否为0。

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

    *********** 更新 ***********

    根据上次更改尝试此代码:

    <?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>';
    ?>