【问题标题】:How can i fetch checkbox inserted data from my database with a query如何通过查询从我的数据库中获取复选框插入的数据
【发布时间】:2014-09-03 12:45:36
【问题描述】:

我正忙于复选框搜索和上传某些数据。我正在使用 wordpress 并且为了存储数据,我使用了一个简单的插件,该插件创建了一个数据库,并且可以在特定的表/列中插入数据。

我创建了一个自定义复选框搜索功能,允许用户使用复选框提交来获取数据。尽管该功能工作正常,但使用复选框上传的数据存在问题(因此这不是使用复选框进行搜索,而是上传)。问题是我的foreach($_POST['columns'] 函数获取了我用来查询的数据。但是,当使用复选框(因此可能有多个值)提交数据时,它在数据库中的字符串是一个非常奇怪的字符串,查询(WHERE)无法理解,因此它什么也不返回。

为了更清楚一点,请看下面的代码: HTML:

<form method="post">    
    <div id="list3" class="dropdown-check-list">
        <span class="anchor">Select theme of Living Lab</span>
        <ul class="items">
              <li><input type="checkbox" name="columns[]" value="Independent_living" />Independent living</li>
              <li><input type="checkbox" name="columns[]" value="Chronic_heart_failure" />Chronic heart failure</li>
              <li><input type="checkbox" name="columns[]" value="Dementia" />Dementia</li>    
              <li><input type="checkbox" name="columns[]" value="Prevention" />Prevention</li>
              <li><input type="checkbox" name="columns[]" value="Other" />Other</li>
        </ul>
    </div>  

    <div id="list4" class="dropdown-check-list">
        <span class="anchor">Select stage of Living Lab</span>
        <ul class="items">
              <li><input type="checkbox" name="columns[]" value="Starting_phase" />Starting phase</li>
              <li><input type="checkbox" name="columns[]" value="Running_phase" />Running phase</li>
              <li><input type="checkbox" name="columns[]" value="Completed" />Completed</li>      
        </ul>
    </div>  

<input type="submit" name="go" value="Submit"/>
</form>

第一个数据列表(生活实验室的主题)是通过复选框值提交的数据(这是因为可以有多种选择)。第二个数据列表(生活实验室阶段)是通过单选按钮提交的数据(因此只有一个选项是可能的)。无线电提交仅在数据库中创建一个普通字符串,例如:完成。然而,问题是复选框提交在数据库中返回一个奇怪的字符串值,如下所示:当我只提交预防: a:2:{i:0;s:0: "";i:1;s:10:"Prevention";},而这个当我同时提交预防和痴呆时: a:3:{i:0; s:0:"";i:1;s:8:"痴呆";i:2;s:10:"预防";}

用于生成查询将搜索的字段/过滤器的 php 代码如下:

if(!empty($_POST['columns'])) { // empty() checks if the value is set before checking if it's empty.

    foreach($_POST['columns'] as $key_post=>$value_post){ 
    // Runs mysql_real_escape_string() on every value encountered.
        $clean_criteria = array_map('mysql_real_escape_string', $_REQUEST['columns']);

        // Convert the array into a string.
        $criteria = implode("','",$clean_criteria);


    }

此代码非常适用于提交的单选按钮,例如完成的字符串。选择条件后,$criteria 将设置为字符串“已完成”,并且 $criteria var 将被提供给查询。
但是,这个 foreach 似乎不适用于前面提到的数据库中的复选框值。当我回显 $criteria 变量(在复选框字段的搜索选择中)时,它会返回应有的值,例如预防和/或痴呆字符串,但这些正确的字符串当然不能在数据库中找到,因为数据库中的复选框值非常奇怪(就像我之前提到的)。所以,我认为正在发生的事情如下: 1. 选中并提交了一个复选框。 2. foreach 循环将 $criteria 变量设置为提交的复选框值(因此选择了预防,它返回字符串“预防”)。 3. 查询在给定的数据库表和列中搜索单词“prevention”。 4. 因为数据库中的值有所有这些奇怪的标记 (a:2:{i:0;s:0:"";i:1;s:10:"Prevention";} ),没有找到字符串预防。

查询代码如下:

    $tmp = $wpdb->get_results("
        SELECT
            name_of_living_lab, location_of_living_lab, type_of_living_lab, theme_of_living_lab, stage_of_living_lab, living_lab_document           
        FROM           
            wp_participants_database            
        WHERE 
            theme_of_living_lab IN ('$criteria')    
        ORDER BY 
            name_of_living_lab ASC
    "); 

}
else {
//SOME ELSE ACTION - SHOW EVERYTHING
}

在查询示例中,我只为主题(痴呆症、预防等)添加了 where 语句以用于测试目的。

我认为下一段代码并不是真的需要,但下面的代码显示了查询的数据:

echo "<table>
    <tr>";     
        echo "<th>Name of Living Lab</th>";
        echo "<th>Location of Living Lab</th>"; 
        echo "<th>Type of Living Lab</th>"; 
        echo "<th>Theme of Living Lab</th>";
        echo "<th>Stage of Living Lab</th>";    
        echo "<th>Living Lab document</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>";                 
            }           
        echo "</tr>";
    }
}
echo '</table>';

回顾一下上面的内容:如何将数据库复选框值传递给 $criteria 变量,我可以使用它来查询特定数据。不过,$criteria 变量还需要能够查询普通字符串数据(例如单选按钮提交的数据,它只有 1 个字符串)。

提前感谢您!

更新

经过更多研究,只需使用 LIKE %'$criteria%',似乎很容易解决我的问题。不过,查询结果现在在我的前端表中显示了一个序列化数据,该表显示了数据。所以现在唯一要做的就是反序列化查询结果。

【问题讨论】:

    标签: php mysql checkbox filter


    【解决方案1】:

    也许您正在尝试这样做:

            foreach($_POST['columns'] as $key_post=>$value_post){ 
                // Runs mysql_real_escape_string() on every value encountered.
                // $clean_criteria = array_map('mysql_real_escape_string', $_REQUEST['columns']);
                   $clean_criteria[] = mysql_real_escape_string($value_post); // <---
    
                // Convert the array into a string.
                // $criteria = implode("','",$clean_criteria);
        }   
    
    $criteria = implode("','",$clean_criteria);
    

    【讨论】:

    • @bultforce 这将返回以下错误:警告:array_map() [function.array-map]:参数 #2 应该是第 167 行 /home/~~ 中的一个数组 警告:implode() [function.implode]:在第 169 行的 /home/deb11421/domains/marceldepender.nl/public_html/Recap/wp-content/themes/radiate/templates/pdb-search-new.php 中传递的参数无效。也许对请注意,主要是复选框上传在数据库中给出了奇怪的值,并且 $criteria 被设置为复选框的正常搜索字符串。
    • 对不起,没太注意。由于 foreach 循环而感到困惑。像这样尝试 $clean_criteria[] = mysql_real_escape_string($value_post);
    • @bultforce 现在错误消失了,但是 $criteria var 仍然是普通字符串,但是数据库字符串是带有奇怪字符的字符串(所以它不会工作),因为它不搜索相同。现在我读了一些关于 wordpress 添加这些奇怪字符的内容,你可以通过反序列化来解决这个问题 ($string = 'a:1:{i:0;a:2:{i:0;s:10:"02/17/ 2014";i:1;s:10:"Thom Stark";}}'; $array = unserialize(trim($string));) 虽然我认为这需要在上传代码中完成......或者是否也可以使函数工作,以便它选择数据库中的数据并反序列化它
    • @bultforce 似乎很容易通过使用 LIKE %'$criteria%' 来解决我的问题。不过,查询结果现在在我的前端表中显示了一个序列化数据,该表显示了数据。所以现在唯一要做的就是反序列化查询结果。
    猜你喜欢
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2014-08-17
    • 2012-04-23
    • 1970-01-01
    相关资源
    最近更新 更多