【问题标题】:How do you take content in a div that is within a form and put it into a database along with other form data如何获取表单内 div 中的内容并将其与其他表单数据一起放入数据库
【发布时间】:2017-08-25 15:06:47
【问题描述】:

我已经详尽地搜索了完成这项任务的方法。我在将 div 中的内容转换为能够处理为 php 语句的变量时遇到问题。我尝试过使用 AjaxForm 我尝试过 AJax。

这是我的表单代码,标题为“library.php”。在这里,我有一个 ID 为“输入”的 div。我正在尝试获取此 div 中的数据,该数据将是“公共”或“私人”选项。然后我将继续使用按钮 create 将数据提交到 database.php

<form method="post" action="library.php" id="form3">
 <a id="libOptPP" class="select">                       
  **<div id="input" class="input" name="Privacy">               
  </div>**
  <div id="libOptPP2" class="select-options">
   <ul> 
    <li id="pub" value="1"><span>Public</span> (logo) </li>
    <li id="priv" value="2" class="selected"><span>Private</span></li>
   </ul>                    
  </div>
 </a>
 <div class="libOptCS">
  <span class="bbCT"> 
   <button type="submit" name="create"> Create </button>
  </span>
 </div>
</form>

这是位于 Library.php 头部的脚本,我将尝试使用 ajax 将变量“privacy”发送到 Database.php。此变量将包含上一个代码块中所述的 div 的文本。这将是“公共”或“私人”选项。我没有使用 div 的 ID 名称,而是使用类来选择它,即“.select .input”。

<script>
 $(document).ready(function main() { 
  $("create").click(function() {    

  var privacy = $(.select .input).text();                       
  .ajax({
    type: "POST",
    url: ../../database/database.php,
    data: "privacy="+privacy,
    dataType: "html",   
    async: false,
    success: function(data) {
     alert(data);
    }   
   });
  });
 });
</script>

这是将表单数据输入我的数据库的 php 代码。一旦我们单击前面代码中所述的创建按钮,这将激活将数据传输到适当的表和后续行中。

if (isset($_POST["create"])) {
 $Privacy = mysqli_real_escape_string($db, $_POST['privacy']);
 $ETH = mysqli_real_escape_string($db, $_POST['ETH']);
 $Email_Phone_Number = $_SESSION['Email_Phone_Number'];

 if ($Privacy === "Public") {
  $sql = "INSERT INTO library (Title, Privacy, Bio, User_iD)
         VALUES ('$ETH', '$Privacy', 'testbio', (SELECT User_iD FROM logstart WHERE Email_Phone_Number='$Email_Phone_Number'))";
         mysqli_query($db, $sql);
 }
if ($Privacy === "Private") {
 $sql = "INSERT INTO library (Title, Privacy, Bio, User_iD)
        VALUES ('$ETH', '$Privacy', 'testbio', (SELECT User_iD FROM logstart WHERE Email_Phone_Number='$Email_Phone_Number'))";
         mysqli_query($db, $sql);
 }
 if (mysqli_query($db, $sql)) {
  echo "YES!";
  } else {
  echo "No!";
  }
}

某处未识别变量。当我按下“创建”按钮时,会创建“未识别索引:隐私”的弹出窗口。换句话说,$_POST['privacy'] 不包含我需要的数据,这些数据应该是 Public 或 Private,以便我可以识别它并进一步使用其余代码。

【问题讨论】:

  • 不懂 PHP 但是...你为什么不使用输入控件 - 无论是隐藏、文本还是文本区域?此外,您绑定到创建按钮的单击事件,但它是一个提交按钮,并且您没有调用 preventDefault 所以可能在您的代码运行之前提交表单?
  • 您的代码容易受到 SQL 注入攻击。您应该使用参数化查询和准备好的语句来帮助防止攻击者通过使用恶意输入值来破坏您的数据库。 bobby-tables.com 给出了风险解释,以及一些如何使用 PHP / mysqli 安全地编写查询的示例。

标签: php jquery json ajax form-data


【解决方案1】:

您的表单以正常方式回发而不是使用 ajax,原因有两个:

1) 您没有正确地将 click 事件绑定到按钮 - 您的选择器正在寻找像 &lt;create&gt; 这样的元素,这些元素当然不存在。

2) 一旦解决了这个问题,您就忘记了阻止按钮的默认回发行为。您可以使用标记或代码对其进行排序。标记更简单:

<button id="create" type="button" name="create"> Create </button>

注意id 属性来唯一标识按钮,以及type="button" 属性——除非类型是“提交”,否则它不会导致表单进行正常的回发。那么你的事件处理程序应该是:

$("#create").click(function() {

注意#,它告诉 jQuery 查找 ID 为“create”的元素。

另一个问题:您的 PHP 包含一个逻辑错误。您为同一个查询多次调用 mysqli_query,而不是检查先前查询的结果。您与 Privacy 值有关的 if 语句似乎也是多余的 - 因此您不会更改查询。你需要这样做:

if (isset($_POST["create"])) {
 $Privacy = mysqli_real_escape_string($db, $_POST['privacy']);
 $ETH = mysqli_real_escape_string($db, $_POST['ETH']);
 $Email_Phone_Number = $_SESSION['Email_Phone_Number'];

 $sql = "INSERT INTO library (Title, Privacy, Bio, User_iD)
         VALUES ('$ETH', '$Privacy', 'testbio', (SELECT User_iD FROM logstart WHERE Email_Phone_Number='$Email_Phone_Number'))";
 $result = mysqli_query($db, $sql); //return the result of the query for checking

 if ($result === true) {
  echo "YES!";
  } else {
  echo "No!";
  }
}

另请参阅我上面关于 SQL 注入漏洞的评论,这与您的问题没有直接关系,但确实需要您的紧急关注。

编辑 您的脚本还有许多其他问题,包括语法错误,这可能会阻止它工作。这是一个固定/改进的版本:

$(document).ready(function() {
  $("#create").click(function() {

    var privacy = $(".select .input").text();

    $.ajax({
      type: "POST",
      url: "../../database/database.php",
      data: { "privacy": privacy },
      dataType: "html",
      success: function(data) {
        alert(data);
      }
    });
  });
});

缺少语音标记轮变量,手动创建数据字符串(冒着编码问题的风险,如果你传递一个对象,jQuery 可以为你处理),不需要名称的闭包,以及不必要的使用async: false(它只是无缘无故地锁定了浏览器)。


【讨论】:

  • 这有所帮助,但我仍然遇到隐私索引不明的问题。换句话说,我的问题仍然是无法为这个 php 变量赋值。
  • 实际上更仔细地查看您的脚本,您的代码存在许多明显的问题,包括语法错误,这意味着脚本没有运行,因此可能仍在以正常方式回发。如果您检查浏览器的控制台,您可能会在运行代码时看到它们。稍后我将使用固定版本编辑问题
猜你喜欢
  • 1970-01-01
  • 2016-12-20
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 2015-07-10
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多