使用PHP PDO根据先前的选择动态更新下拉列表

时间:2019-04-01 05:24:47

标签: php html mysql ajax pdo

这已经得到了回答,但是由于两个原因我再次询问:我找不到利用PDO的任何资源,并且无论如何,我发现的所有资源都包含没有任何注释或注释的代码。解释,这使得难以解释它们并使之适应我的用例。

我需要能够根据上一个选择的下拉列表来动态更新自身,如果我更改了该选择,它应该重新更新自身,而不必提交表单或重新加载页面。

我已经用到目前为止所学到的知识更新了代码,但是仍然无法正常工作。一切正常,直到第二个下拉菜单应开始加载值。

HTML:

<div class="form-group row">
    <label class="col-sm-2 form-control-label" onchange="productorInfo(this.value);">Codigo Productor (*)</label>
    <div class="col-sm-4">
        <select name="vendedor_codigo">
            <?php foreach ($dd_productor_result as $dd_productor_display) : ?>
            <option value="<?= $dd_productor_display['vendedor_codigo']; ?>">
                <?= $dd_productor_display['vendedor_codigo']; ?>
            </option>
            <?php endforeach; ?>
        </select>
    </div>
    <label class="col-sm-2 form-control-label">Nombre (*)</label>
    <div class="col-sm-4">
        <select id="ajax-vendedor" name="vendedor_nombre">
            <?php foreach ($ajax_productor_result as $dd_productor_display) : ?>
            <option placeholder="Seleccione codigo" value="<?= $dd_productor_display['vendedor_nombre']; ?>">
                <?= $dd_productor_display['vendedor_nombre']; ?>
            </option>
            <?php endforeach; ?>
        </select>
    </div>
</div>

Ajax脚本:

function productorInfo(id) {
    $.ajax({
        type: "GET",
        url: "/controller/produccion/db_ajax_update.php",
        data: "mainid =" + id,
        success: function (result) {
            $("#ajax-vendedor").html(result);
        }
    });
};

第一个下拉PHP代码:

$dd_productor = "SELECT vendedor_codigo FROM lista_productores";

$productor_stmt = $pdo->prepare($dd_productor);
$productor_stmt->execute();
$dd_productor_result = $productor_stmt->fetchAll();

第二个下拉菜单(ajax调用):

if(isset($_GET['mainid'])){
productorInfo($_GET['mainid']);
$prod_value = productorInfo($_GET['mainid']);
}
$ajax_productor = "SELECT vendedor_nombre FROM lista_productores WHERE vendedor_codigo = {$prod_value}";

$productor_stmt = $pdo->prepare($ajax_productor);
$productor_stmt->execute();
$ajax_productor_result = $productor_stmt->fetchAll();

1 个答案:

答案 0 :(得分:1)

onchange调用应该在select元素上而不是标签上

<label class="col-sm-2 form-control-label">Codigo Productor (*)</label>
<select name="vendedor_codigo onchange="productorInfo(this.value)">

但是对我来说,您可能还不太了解该过程。页面加载时不会触发您的ajax调用,因此请注意以下几点:

<select id="ajax-vendedor" name="vendedor_nombre">
            <?php foreach ($ajax_productor_result as $dd_productor_display) : ?>
            <option placeholder="Seleccione codigo" value="<?= $dd_productor_display['vendedor_nombre']; ?>">
                <?= $dd_productor_display['vendedor_nombre']; ?>
            </option>

我认为我会给您未定义的变量警告(除非您最初以某种方式设置了$ajax_productor_result

ajax的响应通常是通过.js函数成功通过.js绘制的:函数

(result) {
            $("#ajax-vendedor").html(result);
        }

尽管如此-除非已经发布了更多代码,否则您将.html()函数传递给数组或数据库行,因此它永远不会显示任何内容。

所以你需要 1)在页面加载中绘制一个没有选项的选择(如果有选择,则选择默认选项) 2)返回成功功能可以使用的响应,例如jQuery可以解析的json字符串 3)将jquery中的数据格式化为<options>,然后使用.html()函数更新选择 4)如果您希望在页面最初加载时发生这种情况,然后添加一个productorInfo(id)函数的文档就绪调用-如果您以某种方式设置初始选择值,那么这将是有意义的(因此可能不会与您相关)