最近我一直在处理一个表单,用户可以使用该表单选择一个复选框,作为选择的结果,它会在表格中显示数据库信息。
我浏览了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个声望直接发布图片)
起始栏/页面(未触及):
仅选择并提交作者:
留下这个,因为我也只能上传2个链接,少于10个代表......
仅选择并提交了研究来源:
答案 0 :(得分:1)
我在代码中看到至少2个错误。
$ column_names关联数组值应该作为字段名称传递,所以我假设它们不正确,因为它们中有空格(并且我知道wordpress默认情况下没有这样的字段名称
如果用户提供了一些选择,则会向用户传递一次额外的字段名称,并且在它们之后有一个冒号,因此会产生错误。
我会像这样重写代码
<?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>';
?>