用PHP和AJAX实现链表

用PHP和AJAX实现链表,php,html,ajax,Php,Html,Ajax,我在用HTML制作链接列表时遇到问题,让我解释一下: 在HTML中,我有两个选择: <!-- This select WORKS and read the opened projects from de database --> <select name="project" id="project"> <option value="0">Select a project</option>

我在用HTML制作链接列表时遇到问题,让我解释一下:

在HTML中,我有两个选择:

<!-- This select WORKS and read the opened projects from de database  -->
            <select name="project" id="project">
                <option value="0">Select a project</option>
                <?php if (isset($result2)): ?>
                    <?php foreach ($result2 as $res): ?>
                        <option value=<?php echo $res['c_project_id'] ?>><?php echo $res['d_name'] ?></option>
                    <?php endforeach ?>
                <?php endif ?>

            </select>

<!-- This doesn't work, but I want: When I select a project, the project's categories go here -->
                <select name="category" id="category">

                </select>
表格类别(与表格项目相关)

我在html中有一个SELECT,它采用项目名称和ID,它在SELECT nº1中工作

$statement2 = $conexion->prepare("SELECT c_project_id, d_name FROM project WHERE d_state= 'Open'");
$statement2->execute();
$resultado2 = $statement2->fetchAll();
现在我想:当我在第一个选择中“单击”时,第二个选择会做出声明并完成第二个选择。对于测试,我只编写了一个简单的选项。我尝试使用AJAX和PHP,但第二个选项为空:

阿贾克斯:

$( "#project" ).change(function() {
      var select = $( "#project option:selected" ).val();
      console.log(select); //just for testing that I took the value.
      $.ajax({
            type: "POST",
            url: "phpPage.php",
            data: { selectedProject : select } 
        }).done(function(data){
            console.log("Done");
            $("#category").html(data);
        });
    });
和PHP:

if(isset($_POST["selectedProject"])){
        $proy = $_POST["selectedProject"];
        $output = "<option value='100'> Select your category </option>";

        if($proy != 0){
            $output.= "<option>" . $proy . "</option>"; 
        }

        echo $output;   
    }
if(设置($\u POST[“selectedProject”])){
$proy=$\u POST[“selectedProject”];
$output=“选择您的类别”;
如果($proy!=0){
$output.=''.$proy.'';
}
echo$输出;
}
但这一回我一无所获,一切都是空的

最后,当我尝试调试时,我注意到在一个PHP响应中,HTML代码()被写在页面的开头(在响应中):

选择您的类别1
...
很抱歉问了这么大的问题,但我在这上面浪费了很多时间,我不知道会发生什么。
谢谢你

让我们看看你所拥有和想要做的事情的分类。首先,您有一个空的
select
元素:

<select name="category" id="category">
    // empty
</select>
您的PHP是在输出上创建太多信息的地方。这通常是将“ajax php脚本”与正常的完整html构建php脚本隔离开来的好主意。因此,您只输出特定ajax调用所需的内容

在上述PHP中,您有:

if(isset($_POST["selectedProject"])){
    $proy = $_POST["selectedProject"];
    $output = "<option value='100'> Select your category </option>";
    if($proy != 0){
        $output.= "<option>" . $proy . "</option>"; 
    }
    echo $output;
}
// you must have more page generation below this based on your Q (?)

由于您只需要
选项
标记的基本html,因此不再需要html。因此,添加一个
退出紧接着
echo$输出
有关
.success
(或success:option)与
.done
的更多信息@那完全错了。done()是请求成功时要调用的jQuery Deferred/Promise接口($.ajax()返回一个Deferred对象)的正确方法。毫无疑问,您会想到“success”回调,它是作为对$.ajax()的调用中的一个选项提供的。延迟接口不公开任何名为“success()”的方法。检查文档。。。在写作之前。OP代码的这一特定方面并没有什么问题。不管怎样,关于你的问题…“你能解释一下原因吗?”见最近发布的难以置信的答案。您使用相同的PHP脚本来输出ajax调用和主页所需的位。把它们混在一起通常是一个糟糕的设计,但是如果你小心的话,你可以做到。更改之所以有效,是因为exit停止了脚本的运行,从而停止了脚本的输出,因为它会输出大量其他HTML,这些HTML用于加载主页,而不是作为ajax调用输出的一部分。我倾向于在子目录中填充用于ajax调用的“小脚本”。但有时当我有点懒(或走得太快)时,我会将ajax反应代码放在我正在编写的某个大脚本的尖端附近(只是为了让事情顺利进行)。。。然后,当我把事情搞定时,把上面的一点扯到它自己的档案里。要掌握的主要内容是,ajax通常用于“操纵当前html文档”。。。因此,您只需要使用json数据,或者使用html块来插入/替换部分。非常感谢,我想您已经理解了。太神了
<option value='100'> Select your category </option><option>1</option> 
<!DOCTYPE html>
<html lang="es">
    <head>
        <title>
...
<select name="category" id="category">
    // empty
</select>
$("#category").html(data);
if(isset($_POST["selectedProject"])){
    $proy = $_POST["selectedProject"];
    $output = "<option value='100'> Select your category </option>";
    if($proy != 0){
        $output.= "<option>" . $proy . "</option>"; 
    }
    echo $output;
}
// you must have more page generation below this based on your Q (?)
if(isset($_POST["selectedProject"])){
    $proy = $_POST["selectedProject"];
    $output = "<option value='100'> Select your category </option>";
    if($proy != 0){
        $output.= "<option>" . $proy . "</option>"; 
    }
    echo $output;
    exit; // <-- halt so none of the other following html spills out
}