【问题标题】:Button has to be pressed to activate php code? [closed]必须按下按钮才能激活 php 代码? [关闭]
【发布时间】:2020-01-16 21:50:22
【问题描述】:

所以这个网站的想法是,当你按下按钮时,它会从数据库中删除相应的行。但是,我的代码的问题是,在第一次按下按钮后会填充 id 变量,然后在下一次按下时执行 php。我怎样才能避免这种情况并让他在第一次按下按钮时适应并执行 php?

包括嵌入了 php 的 HTML 页面:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
<title>Untitled Document</title>
    <style>
table {
  font-family: arial, sans-serif;
  border-collapse: collapse;
  width: 100%;
}

td, th {
  border: 1px solid #dddddd;
  text-align: left;
  padding: 8px;
}

tr:nth-child(even) {
  background-color: #dddddd;
}
</style>
</head>

<body>
    <div class="container-fluid">
    <h2 style"text-align:center";>Please enter the item you want to add to the list below </h2>

<?php



$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";
$sql = "CREATE DATABASE myDB";

$conn = new mysqli($servername, $username, $password, $dbname);


if ($conn->connect_error) {

    die("Connection failed: " . $conn->connect_error);
} 



$sql = "CREATE TABLE freezerinventory (
id INT AUTO_INCREMENT PRIMARY KEY, 
item VARCHAR(30) NOT NULL,
reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)";

if(isset($_POST['itemx'])) 

{

$itemvar = $_POST["itemx"];
$sql = "INSERT INTO freezerinventory (item)
VALUES ('$itemvar')";
    $add =  mysqli_query($conn, $sql);
}
else {
    $sql = "";
}




mysqli_close($conn);


?>

<form action="<?=$_SERVER['PHP_SELF'];?>" class="needs-validation" novalidate method="post">

    <div class="form-group">
      <label for="uname"></label>

      <input type="text" class="form-control" id="itemx" placeholder="Enter an item for the freezer here" name="itemx" required>

      <div class="valid-feedback">Valid.</div>

      <div class="invalid-feedback">Please fill out this field.</div>

    </div>

    <button id = "SubmitButton" name = "SubmitButton" type="button submit" class="btn btn-primary">Add to list</button>
</form>
    </div>








<?php

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "myDB";
$aVar = mysqli_connect('localhost','root','','myDB');


$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "SELECT * FROM freezerinventory";
$result = mysqli_query($aVar, $sql);



echo "<table><tr>
    <th>Item name</th>
    <th>Date added</th> 
    <th>remove</th>
  </tr>    "; 


while($row = mysqli_fetch_array($result))   {

echo "      <tr><td>" . $row['item'] . "</td><td>" . $row['reg_date'] . "</td><td><form action='

' method='POST'>
<div class= 'input-group' > <div class='input-group-append'>


                <button class='btn btn-danger'  onclick='deleteitem()'  id = 'delete' type='submit'>Remove</button>

                <input type='hidden' name='id' value=".$row['id']." />

            </div></div>

</form></td></tr>";



}
    echo "</table>";
?>

 <script>

function deleteitem (e) {

            e.preventDefault();

    <?php 



    $id = $_POST['id'];

    $delete = "DELETE FROM freezerinventory WHERE id=$id";
   $del =  mysqli_query($conn, $delete);

        ?>
        }
        else {
    }
    </script> 

<script>

function myFunction() {
  confirm("I am an alert box!");
}

</script>

<script>

(function() {
  'use strict';
  window.addEventListener('load', function() {

    // Get the forms we want to add validation styles to

    var forms = document.getElementsByClassName('needs-validation');

    // Loop over them and prevent submission

    var validation = Array.prototype.filter.call(forms, function(form) {
      form.addEventListener('submit', function(event) {
        if (form.checkValidity() === false) {
          event.preventDefault();
          event.stopPropagation();
        }
        form.classList.add('was-validated');
      }, false);
    });
  }, false);
})();
</script>




</body>
</html>

【问题讨论】:

  • 你尝试过使用 ajax 吗?
  • 你用错了ajax代码!您的代码都在同一页面中,因此,如果您不介意重新加载页面,则不需要 ajax 或 javascript,摆脱所有仅保留 php 的代码,命名要删除的按钮并检查是否使用 if 语句单击了按钮。如果单击删除按钮,则进行查询。看这里的例子:stackoverflow.com/questions/28915637/… 重要的是你对 sql 注入很开放,使用准备好的语句来防止 sql 注入
  • 我一直在使用嵌入式 php,否则 GET 或 POST 函数会将我重定向到 php 页面。如何在不重定向到 php 页面的情况下执行 php?

标签: javascript php html mysql


【解决方案1】:

您可以创建单独的处理脚本并将表单提交到按钮的 URL 路径“onClick”。 JS代码不能直接调用PHP函数。

【讨论】:

    【解决方案2】:

    PHP 是一种只在服务器端运行的语言。 它不同于在客户端(在浏览器上)运行的 javascript。

    如果您可能注意到,您将永远不会在其他网站上看到 PHP 代码,因为(如果该网站使用 PHP)它是在服务器端处理的,并且返回仅为 HTML+CSS。

    现在我们不会创建这样的页面。 我们将使用 PHP 创建我们所说的 API。我们会使用 REST-API 策略。

    假设我们将在此地址www.mywebsite.com/myapi/myfreezerendoint.php 上托管此 API

    我们将使用 JS 来请求或发布到这个端点,并使用名为 fetch("www.mywebsite.com/myapi/myfreezerendoint.php", { ... }) 的简单 javascript 函数。

    我发现了这个关于 PHP API 和 MySQL 作为数据库的有趣教程:https://webdamn.com/create-simple-rest-api-with-php-mysql/

    希望你喜欢!坚持下去

    【讨论】:

      【解决方案3】:

      我已经纠正和美化了所有代码,将其最小化,现在应该是这样了:

      <?php
      $servername = "localhost";
      $username = "root";
      $password = "";
      $dbname = "myDB";
      $sql = "CREATE DATABASE myDB";
      
      $conn = new mysqli($servername, $username, $password, $dbname);
      if ($conn->connect_error) {
      
          die("Connection failed: " . $conn->connect_error);
      } 
      $sql = "CREATE TABLE freezerinventory (
      id INT AUTO_INCREMENT PRIMARY KEY, 
      item VARCHAR(30) NOT NULL,
      reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)";
      
      if(isset($_POST['itemx'])) {
        $itemvar = $_POST["itemx"];
        $stmt = $conn->prepare("INSERT INTO freezerinventory (item) VALUES ('?')");
        $stmt->bind_param("s", $itemvar);
        $stmt->execute();
      } else {
          //the 'itemx' post parameter isn't set, make an alert or something
      }
      mysqli_close($conn);
      ?>
      <!doctype html>
      <html>
        <head>
          <meta charset="UTF-8">
          <meta name="viewport" content="width=device-width, initial-scale=1">
          <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
          <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
          <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
          <title>Untitled Document</title>
          <style>
            table {
              font-family: arial, sans-serif;
              border-collapse: collapse;
              width: 100%;
            }
      
            td, th {
              border: 1px solid #dddddd;
              text-align: left;
              padding: 8px;
            }
      
            tr:nth-child(even) {
              background-color: #dddddd;
            }
          </style>
        </head>
        <body>
          <div class="container-fluid">
          <h2 style"text-align:center";>Please enter the item you want to add to the list below </h2>
      <form action="<?php echo $_SERVER["PHP_SELF"];?>" class="needs-validation" novalidate method="post">
      
          <div class="form-group">
            <label for="uname"></label>
      
            <input type="text" class="form-control" id="itemx" placeholder="Enter an item for the freezer here" name="itemx" required>
      
            <div class="valid-feedback">Valid.</div>
      
            <div class="invalid-feedback">Please fill out this field.</div>
      
          </div>
      
          <button id = "SubmitButton" name = "SubmitButton" type="button submit" class="btn btn-primary">Add to list</button>
      </form>
          </div>
      <?php
      
      $servername = "localhost";
      $username = "root";
      $password = "";
      $dbname = "myDB";
      $aVar = mysqli_connect('localhost','root','','myDB');
      
      
      $conn = new mysqli($servername, $username, $password, $dbname);
      
      if ($conn->connect_error) {
          die("Connection failed: " . $conn->connect_error);
      } 
      
      if(isset($_POST['id'])) {
        $delete = $con->prepare("DELETE FROM freezerinventory WHERE id= ?");
        $delete->bind_param("s", $_POST['id']);
        $delete->execute();
      }
      
      $sql = "SELECT * FROM freezerinventory";
      $result = mysqli_query($aVar, $sql);
      echo "<table><tr>
          <th>Item name</th>
          <th>Date added</th> 
          <th>remove</th>
        </tr>    "; 
      
      while($row = mysqli_fetch_array($result))   {
        echo "      <tr><td>" . $row['item'] . "</td><td>" . $row['reg_date'] . "</td><td><form action='' method='POST'>
          <div class= 'input-group' > <div class='input-group-append'>
              <button class='btn btn-danger'  onclick='deleteitem(".$row['id'].")' id='delete'>Remove</button>
              <input type='hidden' name='id'/>
          </div></div>
          </form></td></tr>";
      }
          echo "</table>";
      ?>
      <script>
      function deleteitem (id_data) {
        $.post('<?php echo $_SERVER["PHP_SELF"];?>', {id: id_data}, function(data) {
          console.log(data);  //callback data
        });
      }
      
      function myFunction() {
        confirm("I am an alert box!");
      }
      
      (function() {
        'use strict';
        window.addEventListener('load', function() {
      
          // Get the forms we want to add validation styles to
      
          var forms = document.getElementsByClassName('needs-validation');
      
          // Loop over them and prevent submission
      
          var validation = Array.prototype.filter.call(forms, function(form) {
            form.addEventListener('submit', function(event) {
              if (form.checkValidity() === false) {
                event.preventDefault();
                event.stopPropagation();
              }
              form.classList.add('was-validated');
            }, false);
          });
        }, false);
      })();
      </script>
      </body>
      </html>
      

      它可能仍然需要一些修复,我在那里留下了一些未使用的 html 元素,但理论上这应该可以工作。它利用ajax 将数据发送到php。您不必使用ajax,但这在理论上应该可以解决您的问题。如果您遇到任何问题,请在我的回答下发表评论。

      注意:为了澄清,我没有尝试过,因此可能存在一些错误。

      【讨论】:

      • 我可以知道为什么我的回答被否决了吗?
      • 第 20 行出现错误 $stmt = $conn->prepare->("INSERT INTO freezerinventory (item) VALUES ('?')");我相信人们不赞成你,因为他们希望我在服务器端而不是在客户端使用 php。
      • 嗯 php 是一种服务器端语言,所以它不能在客户端使用,你只能向服务器端发送请求并得到响应。我会调查错误。错误到底说了什么?
      • @RichardStarZ 删除prepare(" 之间的-&gt;。那么你有:$stmt = $conn-&gt;prepare("INSERT INTO freezerinventory (item) VALUES ('?')");。我已经在我的回答中更正了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多