【问题标题】:php/jQuery get primary key for selected valuephp/jQuery 获取所选值的主键
【发布时间】:2017-04-10 04:02:03
【问题描述】:

我正在尝试获取表单中选定值的键(主键),因此我可以将键添加到连接表中。我将表单从下拉列表更改为自动完成。但不知道如何用 jquery 做地图。

这是我用于自动完成的 php

<?php
if (isset($_POST['type']) && $_POST['type'] == 'faculty_id') {

    $type = $_POST['type'];
    $name = $_POST['name_startsWith'];
    $nameID = $_POST['nameID'];


    $query = "SELECT FirstName, LastName, FacultyId FROM Test.Faculty where UPPER(FirstName) LIKE '" . strtoupper($name) . "%'";
    $result = mysqli_query($con, $query);
    $data = array();
    while ($row = mysqli_fetch_assoc($result)) {
        $name = $row['FirstName'] . ' ' . $row['LastName'];
        $nameID = $row['FacultyId'];
        array_push($data, $name);
    }
    mysqli_close($con);


    echo json_encode($data);
    exit;
}
?>

这是表单和 jQuery 页面

<form action="Form.php" method="post">
    <input type='text'  id="faculty_id" placeholder="Instructor" name="faculty_id" value='' />

    <input type="submit" value="submit" name="submit" />
</form>
<script type="text/javascript">

    $('#faculty_id').autocomplete({
        source: function (request, response) {
            $.ajax({
                url: 'Form.php',
                dataType: "json",
                method: 'post',
                data: {
                    name_startsWith: request.term,
                    nameID: request.term,
                    type: 'faculty_id'
                },
                success: function (data) {
                    response($.map(data, function (item) {
                        console.log(item);
                        //var code = item.split("|");
                        return {
                            label: item,
                            value: item,
                            data: item
                        }
                    }));
                }
            });
        },
        autoFocus: true,
        minLength: 1,

    });
</script>

和php插入查询

<?php
if (isset($_POST)) {
    $faculty_id = $_POST['faculty_id'];
    try {
        $stat = $db->prepare("Insert into ATCTest.Schedule
                      (Faculty ) 
                      VALUE (':faculty_id' )");
        $stat->bindParam(":faculty_id", $faculty_id);

        if ($stat->execute()) {
            echo "<h5>Faculty-js: " . $faculty_id . "</h5>";
        } else {
            echo "Problem!!!";
        }
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
}

【问题讨论】:

    标签: javascript php jquery mysql ajax


    【解决方案1】:
    1. 保持一致。选择PDOMySQLi。不是都。您的自动完成脚本使用 MySQLi,但是在您的插入脚本中,您使用 PDO。选择一个并坚持下去。

    我将使用 PDO,因为我发现它比 MySQLi 更容易使用。

    1. 使用适当的请求方法。如果你得到一些东西,使用 GET 而不是 POST。如果您要添加或更新,请使用 POST。

    让我们重写您的自动完成脚本以使用 PDO:

        if (isset($_GET['type']) && $_GET['type'] == 'faculty_id') {
            // this will hold your response that gets sent back
            $data = null;
            $name = trim($_GET['name']);
    
            try {
                // because you are passed untrusted data, use prepared statement 
                $sth = $db->prepare("
                    SELECT FirstName, LastName, FacultyId 
                    FROM Test.Faculty 
                    WHERE UPPER(FirstName) LIKE UPPER(?)
                ");
                $sth->execute(array($name . '%'));
                // set the results (array of objects) as your JSON response
                $data['faculties'] = $sth->fetchAll(PDO::FETCH_OBJ);
            } catch(PDOException $e){
                echo $e->getMessage();
            }
            // send the results i.e. response
            header('Content-Type: application/json');
            echo json_encode($data);
            exit;
        }
    
    1. 我以前从未使用过自动完成插件,但我会根据我看到的其他答案对其进行破解。

      $('#faculty_id').autocomplete({
          source: function (request, response) {
              // short syntax for .ajax() using GET method that expects a JSON response
              $.getJSON('Form.php', { type: 'faculty_id', name: request.term }, function (data) {
                  // data.faculties (your AJAX script's response) should now be an array of objects
                  console.log(data.faculties);
                  response($.map(data.faculties, function (faculty) {
                      console.log(faculty);
                      return {
                          label: faculty.FirstName + ' ' + faculty.LastName,
                          value: faculty.FacultyId
                      }
                  }));
              });
          },
          autoFocus: true,
          minLength: 1,
      });
      
    2. 最后,当你插入时

      // check if form was POSTed
      if ($_SERVER['REQUEST_METHOD'] === 'POST') {
          $faculty_id = $_POST['faculty_id'];
          try {
              // VALUES not VALUE
              // don't wrap your placeholders with quotes in your prepared statement
              // simplified
              $sth = $db->prepare("INSERT INTO ATCTest.Schedule(Faculty) VALUES(?)");
              // simplified way to bind parameters
              $sth->execute(array($faculty_id));
              // use rowCount() not execute() to determine if the operation was successful or not
              if ($sth->rowCount()){
                  echo "<h5>Faculty-js: $faculty_id</h5>";
              } else {
                  echo "Problem!!!";
              }
          } catch (PDOException $e) {
              echo $e->getMessage();
          }
      }
      

    【讨论】:

    • 感谢@Mikey 的回复,但自动完成功能不起作用。它也没有给出任何错误。
    • 检查我上次的编辑是否有错字。 Turn on your PHP errors 如果您还没有这样做。查明问题究竟发生在哪里:“是 JS 还是 PHP 或两者兼而有之?”通过打开浏览器的开发工具(Chrome 有一个漂亮的界面)从 JS 开始:检查控制台日志是否有任何输出;检查网络选项卡 (XHR) 并查看当您输入数据时发送的请求和响应。完成所有这些后,请澄清 自动完成功能不起作用 的含义。
    • 它正在工作,但在选择标签(名称)后显示值(facultyId)。及其JS错误。我不知道打开错误php.ini,将寻找更多的JS自动完成。
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多