鱼C论坛

 找回密码
 立即注册
查看: 266|回复: 15

[已解决]PHP中引入的JS无效

[复制链接]
发表于 2024-2-14 20:34:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我想在student.php文件中实现点击selectStu.php展示出来的按钮,调用deleteStu.php,从而实现删除数据库中相应id的学生信息。但是点击按钮,JS代码并没有如期运作。
student.php
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.     <title>学生</title>
  7.     <link rel="stylesheet" href="style/public.css">
  8.     <link rel="stylesheet" href="style/select.css">
  9.     <script src="script/deleteStu.js" async></script>
  10. </head>
  11. <body>
  12.     <?php include "header.php";?>
  13.     <main>
  14.         <?php include 'addStu.php';?>
  15.         <button><a href="index.php">返回</a></button>
  16.         <?php include "selectStu.php";?>
  17.     </main>
  18.     <?php include "footer.php";?>
  19. </body>
  20. </html>
复制代码

selectStu.php
  1. <?php
  2.     //读取配置文件
  3.     $configFile = 'config.json';
  4.     $configMsg = file_get_contents($configFile);
  5.     //解析为数组
  6.     $config = json_decode($configMsg,true);

  7.     //连接数据库参数
  8.     $servername = $config['host'];
  9.     $username = $config['username'];
  10.     $password = $config['password'];
  11.     $database = $config['database'];

  12.     //创建连接
  13.     $conn = new mysqli($servername, $username, $password, $database);
  14.     //检测连接
  15.     if($conn->connect_error){
  16.         die("连接失败" . $conn->connect_error);
  17.     }
  18.     //echo "连接成功!";
  19.     //查询语句
  20.     $selectAll = "SELECT * FROM `student`";
  21.     $result = $conn->query($selectAll);

  22.     //输出数据
  23.     if($result->num_rows > 0){
  24.         
  25.         while($row = $result->fetch_assoc()){
  26.             //输出信息到页面
  27.             echo "<table>"
  28.                  . "<tr>"
  29.                  . "<td>" . $row["id"] . "</td>"
  30.                  . "<td>" . $row["name"] . "</td>"
  31.                  . "<td>" . $row["gender"] . "</td>"
  32.                  . "<td>" . $row["klass"] . "</td>"
  33.                  . "<td><button id=". $row["id"] ."class='update'>修改</button></td>"
  34.                  . "<td><button id=". $row["id"] ."class='delete'>删除</button></td>"
  35.                  . "</tr>"
  36.                  .  "</table>" ;
  37.         }
  38.     }
  39. ?>
复制代码

deleteStu.php
  1. //这是删除学生信息的PHP
  2. <?php
  3.     //读取配置文件
  4.     $configFile = 'config.json';
  5.     $configMsg = file_get_contents($configFile);
  6.     //解析为数组
  7.     $config = json_decode($configMsg,true);

  8.     //连接数据库参数
  9.     $servername = $config['host'];
  10.     $username = $config['username'];
  11.     $password = $config['password'];
  12.     $database = $config['database'];

  13.     //创建连接
  14.     $conn = new mysqli($servername, $username, $password, $database);
  15.     //检测连接
  16.     if($conn->connect_error){
  17.         die("连接失败" . $conn->connect_error);
  18.     }

  19.     //获取要删除信息的id
  20.     $id = $_GET["q"];
  21.     //预处理及绑定
  22.     $stmt = $conn->prepare("DELETE FROM student WHERE id = ?");
  23.     $stmt->bind_param("i",$id);

  24.     //执行
  25.     $stmt->execute();

  26.     //关闭
  27.     $stmt->close();
  28.     $conn->close();
  29. ?>
复制代码

deleteStu.js
  1. //删除学生信息的JS
  2. //获取元素
  3. let buttons = document.getElementsByClassName("delete");
  4. console.log(buttons[0]);

  5. //添加事件
  6. for(let i=0;i<buttons.length;i++){
  7.     buttons[i].addEventListener("click",deleteStu);
  8.     console.log(buttons[i]);
  9. }

  10. //传递学生id的函数
  11. function deleteStu(){
  12.     let xmlhttp = new XMLHttpRequest();
  13.     xmlhttp.onreadystatechange=function(){
  14.         if(xmlhttp.readyState==4 && xmlhttp.status==200){
  15.             console.log("传递成功!");
  16.         }
  17.     }
  18.     xmlhttp.open("GET","deleteStu.php?q="+this.id);
  19.     xmlhttp.send();
  20. }
复制代码
最佳答案
2024-2-14 20:57:23
gpt3.5 没这么智能的,还是要靠你自己啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-14 20:35:01 | 显示全部楼层
看起来你的代码有点问题。我来帮你看一下。

首先,你需要确保JS文件的路径是正确的,可以在浏览器的开发者工具中查看是否成功加载了deleteStu.js文件。

接着,你需要确保JS代码在DOM元素加载完成后执行。可以将你的JS代码放在HTML文件的最底部,或者使用window.onload事件,确保所有的元素都已经加载完毕。

  1. window.onload = function() {
  2.   // 删除学生信息的JS
  3.   // 获取元素
  4.   let buttons = document.getElementsByClassName("delete");
  5.   console.log(buttons);

  6.   // 添加事件
  7.   for(let i=0; i<buttons.length; i++) {
  8.     buttons[i].addEventListener("click", function() {
  9.       // 点击按钮的操作
  10.       // 调用deleteStu.php删除学生信息
  11.     });
  12.   }
  13. }
复制代码


最后,你需要在点击按钮的操作中调用deleteStu.php删除学生信息。你可以使用AJAX向deleteStu.php发送POST请求,传递学生的ID作为参数。

  1. buttons[i].addEventListener("click", function() {
  2.   let studentId = this.getAttribute("data-id"); // 假设每个按钮上都有一个data-id属性存储了学生的ID

  3.   let xhr = new XMLHttpRequest();
  4.   xhr.open("POST", "deleteStu.php", true);
  5.   xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  6.   xhr.onreadystatechange = function() {
  7.     if (xhr.readyState == 4 && xhr.status == 200) {
  8.       // 请求成功后的操作
  9.       // 可以根据服务器返回的结果来判断是否删除成功
  10.     }
  11.   };
  12.   xhr.send("id=" + studentId); // 将学生的ID作为参数发送到deleteStu.php
  13. });
复制代码


希望这些解释对你有帮助!记得检查路径和确保JS代码在DOM加载完成后执行。祝你成功!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-14 20:44:00 | 显示全部楼层
FishC 发表于 2024-2-14 20:35
看起来你的代码有点问题。我来帮你看一下。

首先,你需要确保JS文件的路径是正确的,可以在浏览器的开发 ...

console.log(buttons[0]);无法返回类型是为定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-14 20:44:09 | 显示全部楼层
ZhihanXing 发表于 2024-02-14 20:44
console.log(buttons);无法返回类型是为定义


如果`console.log(buttons)`显示`buttons`未定义,那么可能是因为你的代码在DOM元素加载之前执行。在代码中,可以使用`window.onload`事件确保所有的元素都已经加载完毕,然后再执行JS代码。例如:
  1. .onload = function() {    // 删除学生信息的JS    // 获取元素    let buttons = document.getElementsByClassName("delete");    console.log(buttons);    // 添加事件    for(let i=0; i<buttons.length; i++) {        buttons[i].addEventListener('click', function() {            // 处理删除学生的逻辑            // 调用deleteStu.php            // ...        });    }}
复制代码
请确保将这段JS代码放在`<script>`标签里,并且放在HTML文件的`<body>`标签的底部。这样可以保证JS代码在DOM元素加载完成后才会执行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-14 20:46:01 | 显示全部楼层
FishC 发表于 2024-2-14 20:44
如果`console.log(buttons)`显示`buttons`未定义,那么可能是因为你的代码在DOM元素加载之前执行。在代 ...

我照你说的做了,可是仍无法达成预期效果,我猜测这和PHP嵌套有关
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-14 20:46:15 | 显示全部楼层
ZhihanXing 发表于 2024-02-14 20:46
我照你说的做了,可是仍无法达成预期效果,我猜测这和 ...


如果你的代码依赖于通过PHP嵌套生成的元素,那么确保在执行JS代码之前,这些元素已经被正确生成和插入到DOM中是很重要的。你可以使用`window.onload`事件或者将JS代码放置在页面底部来确保这一点。另外,请检查一下你的PHP代码是否正确生成了包含相关class的按钮元素。
例如,你的selectStu.php文件应该类似于这样:
  1. <!-- selectStu.php -->
  2. <!-- ... 生成其他HTML内容 -->

  3. <button class="delete">删除</button>

  4. <!-- ... 继续生成其他HTML内容 -->
复制代码


然后,在student.php文件中引入deleteStu.js,并确保以下代码放在页面底部:
  1. window.onload = function() {
  2.     // 删除学生信息的JS
  3.     // 获取元素
  4.     let buttons = document.getElementsByClassName("delete");
  5.     console.log(buttons);
  6.     // 添加事件
  7.     for(let i=0; i < buttons.length; i++) {
  8.         buttons[i].addEventListener("click", function() {
  9.             // 调用deleteStu.php删除相应id的学生信息
  10.             // 这里可以使用Ajax异步请求或者直接提交表单来实现
  11.             // ...
  12.         });
  13.     }
  14. }
复制代码

确保将上述代码中的注释部分替换为实际删除学生信息的代码。如果你可以提供更多代码或错误信息,我可以帮你进一步排查问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-14 20:48:38 | 显示全部楼层
FishC 发表于 2024-2-14 20:46
如果你的代码依赖于通过PHP嵌套生成的元素,那么确保在执行JS代码之前,这些元素已经被正确生成和插入 ...

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>学生</title>
    <link rel="stylesheet" href="style/public.css">
    <link rel="stylesheet" href="style/select.css">
    <script src="script/deleteStu.js" async></script>
</head>
<body>
    <?php include "header.php";?>
    <main>
        <?php include 'addStu.php';?>
        <button><a href="index.php">返回</a></button>
        <?php include "selectStu.php";?>
    </main>
    <?php include "footer.php";?>
</body>
</html>
delete按钮在selectStu.php中,但是JS无法正确触发它的事件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-14 20:48:51 | 显示全部楼层
ZhihanXing 发表于 2024-02-14 20:48
学生
   
   
   


   
   
        
...


如果你的delete按钮在selectStu.php中,那么确保在student.php文件中引入的deleteStu.js文件可以正确找到这些按钮元素。由于JS是在浏览器端执行的,它需要能够找到相应的DOM元素才能为其添加事件监听器。

确保你在deleteStu.js中使用合适的选择器来选择delete按钮。你可以尝试使用`document.querySelectorAll`方法,并指定一个适当的CSS选择器,以确保能够找到这些按钮。例如:

  1. // 删除学生信息的JS
  2. // 获取元素
  3. let buttons = document.querySelectorAll(".delete");
  4. console.log(buttons);

  5. // 添加事件
  6. for (let i = 0; i < buttons.length; i++) {
  7.   buttons[i].addEventListener("click", function() {
  8.     // 调用deleteStu.php删除相应id的学生信息
  9.     // 这里可以使用Ajax异步请求或者直接提交表单来实现
  10.     // ...
  11.   });
  12. }
复制代码


上述代码使用了`querySelectorAll`方法,并传入了类选择器`.delete`,其中`.`代表选择class为"delete"的元素。

请确保在student.php中正确引入deleteStu.js文件并检查浏览器的控制台输出,确保buttons变量能够正确获取到delete按钮的集合。如果还是无法解决问题,请提供更多的相关代码和错误信息,我将尽力帮助你排查问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-14 20:52:40 | 显示全部楼层
FishC 发表于 2024-2-14 20:48
如果你的delete按钮在selectStu.php中,那么确保在student.php文件中引入的deleteStu.js文件可以正确找 ...

                 . "<td><button id=". $row["id"] ."class='delete'>删除</button></td>"
我想这可能是代码错误的原因,我并没有正确设置id和class,而是只设置了一个属性id,请帮我修正它
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-14 20:52:50 | 显示全部楼层
ZhihanXing 发表于 2024-02-14 20:52
. "删除"
我想这可能是代码错误的原因,我并没有正确 ...


没问题,我来帮你修正一下。假设你的删除按钮是一个`<button>`元素,并且你想为它设置一个id并添加一个class。你可以将代码修改如下:在selectStu.php中的删除按钮:<button id="deleteBtn" class="delete">删除</button>在deleteStu.js中的代码:// 删除学生信息的JS// 获取元素let buttons = document.querySelectorAll(".delete");console.log(buttons);// 添加事件for (let i = 0; i < buttons.length; i++) {  buttons.addEventListener("click", function() {    // 调用deleteStu.php删除相应id的学生信息    // 这里可以使用Ajax异步请求或者直接提交表单来实现    // ...  });}这样,你就为删除按钮设置了一个id为"deleteBtn",同时添加了一个class为"delete"。确保在student.php中引入了正确的deleteStu.js文件,并检查控制台输出,看看是否成功获取到了按钮元素。希望这次修改能够解决你的问题。如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-14 20:57:23 | 显示全部楼层    本楼为最佳答案   
gpt3.5 没这么智能的,还是要靠你自己啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-2-14 20:59:39 | 显示全部楼层
sfqxx 发表于 2024-2-14 20:57
gpt3.5 没这么智能的,还是要靠你自己啊

我还以为fishbot是4.0呢等做完这个练手项目就去看node,PHP太繁琐了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-2-14 21:04:56 | 显示全部楼层
终于搞定了
  1.                  . "<td><button id=". $row["id"] ." class='delete'>删除</button></td>"
复制代码
问题在于class前面少了一个空格,结果把class='delete'写到id属性里面去了,怪不得识别不到delete类的按钮
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-14 21:16:28 | 显示全部楼层
部分代码被识别成latex了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-14 21:16:58 | 显示全部楼层
ZhihanXing 发表于 2024-2-14 21:04
终于搞定了问题在于class前面少了一个空格,结果把class='delete'写到id属性里面去了,怪不得识别不到delet ...

对gpt来说空不空格都一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-2-15 13:24:13 | 显示全部楼层
ZhihanXing 发表于 2024-2-14 20:59
我还以为fishbot是4.0呢等做完这个练手项目就去看node,PHP太繁琐了

4.0收费很高的,要是论坛每个人都用的话,开销很大的,gpt3.5收费相对便宜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 19:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表