【问题标题】:Selected value in dropdown list generated using MySQL query does not pass to variable使用 MySQL 查询生成的下拉列表中的选定值不会传递给变量
【发布时间】:2019-01-29 19:45:08
【问题描述】:

我的 Wordpress 页面上有一个下拉列表,它使用 MySQL 查询将值从 MySQL 填充到下拉列表中

这是我的 Wordpress 页面上的代码

<form method="POST" action="">
[wpse_233034_shortcode]
<br>
<input type="submit" name="submit">
[wpse_233036_shortcode]
</form>

用于生成动态 MySQL 查询的代码是我在 functions.php 文件中定义的 [wpse_233034_shortcode]

add_shortcode('wpse_233034_shortcode', function(){
global $wpdb;
$results1 = $wpdb->get_results ("SELECT `Compound` FROM PNaphtha ORDER BY 
`SrNo`");
echo '<td><select id="Compound" name="Compound">';
echo '<option value="">Select Compound</option>';
foreach ( $results1 as $result1 ) {
echo '<option>'.$result1->Compound.'</option>';
}
echo '</select></td>';
});

到目前为止,它似乎工作正常。当我下拉列表时,从 PNaphtha 表中选择 Compounds 的值并填充到屏幕上。

接下来我想要将此下拉列表中的选定值传递到另一个短代码/MySQL 查询中,该查询将获取更多与 Compound 关联的数据

这是我目前所拥有的,但它似乎无法将上述下拉列表中的值“拉”到下一个 MySQL 查询中

add_shortcode('wpse_233036_shortcode', function(){
global $wpdb;
$Compound = filter_input( INPUT_POST, 'Compound' );
$Compound = $Compound ? $Compound : 'acetone';
$query = $wpdb->prepare( "SELECT * FROM PNaphtha WHERE `Compound` = %s", 
$Compound );
$myrows1 = $wpdb->get_results( $query, ARRAY_A );
ob_start();
foreach ( $myrows1 as $row1) {
echo "Compound: ".$row1['Compound'].", "."Formula: ".$row1['Formula'].", 
"."Molecular Weight: ".$row1['MW']."<br>";
}
return ob_get_clean();
});

现在,短代码“wpse_233036_shortcode”似乎正在“工作”,因为指定的默认/静态值“丙酮”总是在页面上被查询和回显,即使在我从下拉列表中选择任何值之前也是如此。这是我在页面加载时得到的

Compound: acetone, Formula: C3H6O, Molecular Weight: 58.08

我想要的是像现在一样使用第一个 MySQL 查询填充下拉列表

"SELECT `Compound` FROM PNaphtha ORDER BY `SrNo`"

接下来,当我从这个下拉列表中选择一个值时,选择的值应该传递给

,而不是默认的“丙酮”
"SELECT * FROM PNaphtha WHERE `Compound` = %s", $Compound

根据 Sally 的回答 here,我能够使用静态/非 SQL 查询下拉列表使其工作,如下所示

<form method="POST" action="">
<select name="C_Option">
<option value=""></option>
<option value="abietic acid">abietic acid</option>
<option value="acenaphthene">acenaphthene</option>
...
<option value="acetone">acetone</option>
</select>
<input type="Submit">
[wpse_233032_shortcode]
</form> 

【问题讨论】:

  • 这两个语句之间和之后的$Compound是什么??? $Compound = filter_input( INPUT_POST, 'Compound' ); $Compound = $Compound ? $Compound : 'acetone';
  • $Compound = filter_input( INPUT_POST, 'Compound' ); Compound 也是
  • 我说你应该 echo 它并验证它在不同位置的实际情况。
  • 谢谢AbraCadaver,它在第一个之后返回一个空白,第二个之后默认为丙酮。如果我将默认值更改为丙酮以外的其他值,它会查询该化合物的数据库并显示分子式和分子量。问题似乎在于 $Compound 没有从下拉列表中获取值。
  • 在第一页加载时它将是空白的,默认为丙酮。您说即使在您提交表单后它也会这样做?

标签: php mysql wordpress


【解决方案1】:

问题是因为您的短代码回调/函数(即wpse_233034_shortcode()返回任何输出,尽管它确实echo 预期的输出。

或者更准确地说,wpse_233034_shortcode() 函数中的 select 字段在输出 HTML 表单之前输出到浏览器。这意味着表单没有具有select 字段,因此当您提交表单时,键Compound 在超全局$_POST 中不可用。

因此,请确保您的简码返回正确的输出,但如果您需要在简码回调中 echo 它,请使用输出缓冲,就像您在 wpse_233036_shortcode() 函数中所做的那样。

add_shortcode('wpse_233034_shortcode', function(){
    global $wpdb;
    $results1 = $wpdb->get_results ("SELECT `Compound` FROM PNaphtha ORDER BY `SrNo`");

    ob_start(); // turn on output buffering
    echo '<td><select id="Compound" name="Compound">';
    echo '<option value="">Select Compound</option>';
    foreach ( $results1 as $result1 ) {
        echo '<option>'.$result1->Compound.'</option>';
    }
    echo '</select></td>';

    return ob_get_clean(); // return the output
});

但在可能的情况下,请避免使用输出缓冲,而是将输出分配给变量,如下所示:

add_shortcode('wpse_233034_shortcode', function(){
    global $wpdb;
    $results1 = $wpdb->get_results ("SELECT `Compound` FROM PNaphtha ORDER BY `SrNo`");

    $output = ''; // save the output to this variable
    $output .= '<td><select id="Compound" name="Compound">';
    $output .= '<option value="">Select Compound</option>';
    foreach ( $results1 as $result1 ) {
        $output .= '<option>'.$result1->Compound.'</option>';
    }
    $output .= '</select></td>';

    return $output; // return the output
});

【讨论】:

  • 非常感谢莎莉。我真的很感谢你的帮助。我会在几个小时内审核您的建议,并在需要更多帮助时通知您。
  • 太棒了。这两种解决方案都能完美运行,我还阅读了有关输出缓冲的信息。
  • 一如既往,我很高兴能帮上忙! :)
  • 嗨@Sally CJ。我希望一切都好。很抱歉再次打扰您,我有一个与此问题类似的 PHP 问题,希望您能看一下here 并提出建议。
  • 嗨夸克。我很高兴你把它整理好了,你也度过了愉快的一天! :)
猜你喜欢
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多