【发布时间】:2014-10-26 15:12:18
【问题描述】:
所以最近我一直在研究一种通过复选框选择从数据库中发布值的方法。感谢上一个问题:How to use checkboxes to retrieve specific data in a database,我设法让它工作了!
虽然我得到了它的工作,但我想让我的查询在选择多个复选框时更有效,而不是为每个复选框的可能性编写 if/else 查询。
通过对堆栈溢出的一些研究,特别是这个主题:Run a query based on multiple checkboxes,我为自己的项目创建了代码。虽然,由于某种原因,它只是无法正确输出数据,甚至根本不会输出任何东西。
所以我查看了我的代码,看看哪里出了问题。我传入了几个回显来获取数组信息等,但除了我回显查询结果的最后一个回显(返回 0)之外,一切似乎都很好。
所以我现在有点卡住了,因为我不知道出了什么问题。 注意:它适用于 wordpress,因此可以解释查询中的微小差异。*
代码如下: 显示复选框的 HTML 代码
<form method="post">
<div id="list1" class="dropdown-check-list">
<span class="anchor">Select Authors</span>
<ul class="items">
<li><input type="checkbox" name="columns[]" value="Barry" />Barry</li>
<li><input type="checkbox" name="columns[]" value="Henk" />Henk</li>
<li><input type="checkbox" name="columns[]" value="Nicolas" />Nicolas</li>
</ul>
</div>
<input type="submit" name="go" value="Submit"/>
</form>
ID 用于 Jquery 下拉效果。
PHP代码如下:
*下面的代码定义了在表格中显示/回显的列标题
$column_names = array(
"Authorss" => "Authorss",
"Research_Source" => "Research_Source",
"Research_Title" => "Research_Title"
);
$sql_columns = array();
foreach($column_names as $i) {
$sql_columns[] = $column_names[$i];
}
下一行代码检查选中的复选框值并查询选定的值:
if(!empty($_POST['columns'])) { // empty() checks if the value is set before checking if it's empty.
foreach($_POST['columns'] as $key=>$value){
// 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);
}
$tmp = $wpdb->get_results("
SELECT"
.implode(",", $sql_columns)."
FROM
wp_participants_database
WHERE
authorss IN ($criteria)
ORDER BY
authorss ASC
");
}
如果未选择,则查询选择所有可能的结果(这仍然必须创建,因为我希望特定的选择查询首先工作):
else {
echo 'still needs to be edit to show everything here';
//$tmp = $wpdb->get_results( "SELECT ".implode(",", $sql_columns)." FROM wp_participants_database;");
}
现在是查询数据显示/放入表格的部分:
echo "<table>
<tr>";
foreach($column_names as $k => $v) {
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>";
}
echo "</tr>";
}
}
echo '</table>';
*****更新***** 自己修好了!首先我删除了:
$column_names = array(
"Authorss" => "Authorss",
"Research_Source" => "Research_Source",
"Research_Title" => "Research_Title"
);
$sql_columns = array();
foreach($column_names as $i) {
$sql_columns[] = $column_names[$i];
}
上面的代码是不必要的,因为列都是预设的,所以我只是通过输入它们来回显它们。
问题如下:
$tmp = $wpdb->get_results("
SELECT"
.implode(",", $sql_columns)."
FROM
wp_participants_database
WHERE
authorss IN ($criteria)
ORDER BY
authorss ASC
");
$criteria 变量应该给 IN 一个字符串,尽管在我的代码中它被解析为文字(所以没有字符串)。看起来很简单,我只需要添加 '' 这样它就会被解析为字符串。结果:WHERE authorss IN ('$criteria')
【问题讨论】:
-
您是否通过打印检查了查询?
-
@senk 是的,print $tmp 打印出单词:Array
-
没有@Nicolas,只打印sql查询字符串并检查您是否正确形成了查询
-
@senk 我不是一个很好的 php'er/sql,它可能有点愚蠢,但我不知道你的意思。我已将查询中的 select implode 替换为特定的列名,并将 WHERE 中的 $criteria 替换为特定名称(即在数据库中)。当我这样做时,查询似乎有效,所以问题似乎出在 $criteria var 或 implode 行中。当我只添加内爆(并留下特定的 WHERE 名称)时它不起作用,但是当我只添加 $criteria 它仍然不起作用..所以我可以得出结论两者都不起作用?
-
@senk 没关系我把它修好了,检查更新。还是谢谢你!