使用AJAX和PHP在点击时填充<select> - php

我有一个只有一个选项的<select>,我想使用PHP从数据库中获取其余选项,然后使用AJAX用PHP结果填充所说的<select>

不幸的是,我的代码无法正常工作,作为AJAX和jQuery的新手,我并不感到惊讶,但我没有得到任何错误来指导自己解决问题。

PHP可以按预期工作,因为它已在网站的另一部分中使用,并且我对此没有任何问题,因此我的错误一定是在AJAX中出现的(这里没有大的惊喜)。

在我的HTML下面:

<select class="custom-select my-1 mr-sm-2" id="producto" name="producto" required>
    <option disabled selected value>Elegir...</option>
</select>

在我的AJAX代码下面:

<script type="text/javascript">
$(document).ready(function() {
    $("#producto").click(function() {
        $.ajax({
            url: 'fetch_lista_productos_compra.php',
            type: 'get',
            success: function(data) {
                $("#producto").append(data);
            }
        });
    });
});
</script>

在我的PHP代码下面:

<?php 

require $_SERVER['DOCUMENT_ROOT'].'/testground/php/db_key.php';

$conn = mysqli_connect($servername, $username, $password, $dbname);

$sql_query = mysqli_query($conn, "SELECT * FROM productos WHERE disponibilidad = 'disponible'");

while ($row = mysqli_fetch_assoc($sql_query)) {
    $titulo = $row['titulo'];
    echo <<<EOT
    <option value="$titulo">$titulo</option>\n
EOT;
}
?>

与往常一样,非常感谢您的帮助。

重要编辑

<select>有一个重复的ID,也许我应该从一开始就说明这一点,因为我知道那是什么导致了我的问题。

事实是,在此<form>中,选择是根据用户请求动态创建的。他们单击添加产品,并创建一个具有可用产品的新选择,我知道输入的ID /名称必须具有[](id="producto[]")才能转换为数组,但我不知道如何制作AJAX处理此动态创建的重复选择问题。对于这一迟来的声明,我深表歉意,现在我意识到这是至关重要的。

参考方案

请不要在服务器上构造html,尝试只发送原始数据,然后构造html客户端,这样更好,它为以后更改视图留出了空间,而无需太多耦合。

就是说,而不是做:

while ($row = mysqli_fetch_assoc($sql_query)) {
    $titulo = $row['titulo'];
    echo <<<EOT
    <option value="$titulo">$titulo</option>\n
EOT;
}

做就是了

$rows = [];
while ($row = mysqli_fetch_assoc($sql_query)) {
    $rows[] = $row;
}

//this is your best bet when sending data from PHP to JS,
//it sends the rows as JSON-like string,
//which you'll parse to an array in the client
echo json_encode($rows); 

然后在客户端

$.ajax({
    url: 'fetch_lista_productos_compra.php',
    type: 'get',
    success: (data /*json-like string*/) => {
        const dataAsArray = JSON.parse(data);

        $.each(dataAsArray, (index, row) => {
             //now HERE you construct your html structure, which is so much easier using jQuery
            let option = $('<option>');
            option.val(row.titulo).text(row.titulo);
            $("#producto").append(option);
        });
    }
});

关于您对几个select的编辑

我当然无权访问您的服务器,所以我使用的是返回JSON的模拟服务。单击该按钮后,将动态生成ID,并且所有数据加载均会异步发生。
尝试使用您的url并根据html修改成功函数。

$(document).ready(function() {
    $('#add').click(() => {
      //how many so far...?
      let selectCount = $('select.producto').length;
      
      const select = $('<select class="producto">');
      select.attr('id', `producto${selectCount + 1}`);
      
      //then we fetch from the server and populate select
      $.ajax({
        url: 'https://jsonplaceholder.typicode.com/posts',
        type: 'get',
        success: function(data) {
          data.forEach((d) => {
            const option = $('<option>');
            option.val(d.id).text(d.title);
            select.append(option);
          });
        }
      });
      
      document.body.appendChild(select[0]);
    });
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button id='add'>Add product</button><br>
<!--<select class="custom-select my-1 mr-sm-2" id="producto" name="producto" required>
    <option disabled selected value>Elegir...</option>
</select>-->

HIH

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

通过>和<运算符比较日期 - php

在我的所有php代码中,我都在UTC中存储日期和时间,但是我也在使用mysql存储日期时间(也在utc中)。大于和小于运算符会导致日期比较失败吗? $curdate=date('Y-m-d H:i:s'); if($start_datetime>$curdate) 参考方案 不。他们没有办法失败。为此,特意制作了MySQL日期格式。…

使用jquery计算<id>中的总图像 - php

我有一个div,里面有一些图像,例如<img src= etc我想计算该div中的图像总数。我也想使用PHP将这些图像ID保存到mysql中...谢谢 参考方案 要计算它们,您可以执行以下操作:alert($('#myDiv img').length); 要将所有id捕获到数组中,可以执行以下操作:var ids = []; $(&…

在单击时显示特定行的SQL数据 - php

我目前有2张桌子,顶部和底部。最上面的是我从SQL数据库调出的数据行。至于底部,数据来自与顶部表相同的数据库,但显示不同的字段。这些字段都在我的SQL数据库的同一行中。基本上,单击顶部表中的任何行,底部表将显示更多信息,这些信息也在SQL数据库的同一行内。我不确定如何显示特定行的数据,现在,当我单击顶部表中的任何行时,它将显示SQL中的所有行。表格代码:&l…