【问题标题】:Data from form submit fail to insert in database row来自表单提交的数据无法插入数据库行
【发布时间】:2019-02-16 17:14:55
【问题描述】:

我正在尝试使用 ajax php 和 mysql、pdo 在我的产品数据库中插入一个新产品。该表单位于不同的 html 文件中,并在我按下添加产品按钮后立即以引导模式加载。

下面是表格

<div class="container">
     <form class="form" id="insert-product" method="POST">
              <div class="form-group">
                  <label class="form-label" for="name">Product Title</label>
                  <input type="text" class="form-control" id="title" name="ptitle"  tabindex="1" required>
              </div>              
               <div class="form-group">
                  <label class="form-label" for="message">Product Description</label>
                  <input type="text" class="form-control" id="desc" name="description" tabindex="2" required>                               
              </div>
              <div class="form-group">
                  <label class="form-label" for="email"> Price</label>
                  <input type="text" class="form-control" id="price" name="price" tabindex="2" required>
              </div>                            
              <div class="form-group">
                  <label class="form-label" for="subject">Picture of Product</label>
                  <input type="text" class="form-control" id="subject" name="picture"  tabindex="3">
              </div>                            

              <div class="text-center">
                  <button type="submit" name="submit" class="btn btn-start-order">SAVE</button>
              </div>
          </form>
      </div>
  </div>

这是使用 ajax 联系 php 文件的脚本。 readProducts() 是一个从数据库中获取数据的简单函数。

   $('#insert-product').on('submit', function(event) {
           event.preventDefault();
           $.ajax({
                    url: 'insertPro.php',
                    type: 'POST',
                    data: $('#insert-product').serialize(),
                    success: function(data) {

                        readProducts();
                    }

                 });
       })

这是将数据插入数据库的 php 文件。 connect.php 已经过测试并且工作正常。

<?php 
require_once('connect.php');

if (!empty($_POST)) {
    $response = array();

    $query = "insert into products(id,name,description,img_file,price) values(:title, :description, :picture, :price)";
    $stmt = $DBcon->prepare( $query );

    $stmt->bindParam(':title', $title);
    $stmt->bindParam(':description', $description);
    $stmt->bindParam(':picture', $picture);
    $stmt->bindParam(':price', $price);

    $title = $_POST["ptitle"];
    $description = $_POST["description"];
    $price = $_POST["price"];
    $picture = $_POST["picture"];

    $stmt->execute();

    if ($stmt) {
        $response['status']  = 'success';
        $response['message'] = 'Product Deleted Successfully ...';
    } else {
        $response['status']  = 'error';
        $response['message'] = 'Unable to delete product ...';
    }
}

这是我的连接文件。

<?php

    $DBhost = "localhost";
    $DBuser = "root";
    $DBpass = "";
    $DBname = "test";

    try{

        $DBcon = new PDO("mysql:host=$DBhost;dbname=$DBname",$DBuser,$DBpass);
        $DBcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    }catch(PDOException $ex){

        die($ex->getMessage());
    }

?>

当我按下按钮提交数据时,ajax 会按原样刷新,但记录不会添加到我的数据库表中。

【问题讨论】:

  • $title等的设置移动到您的PHP中,在您调用绑定数据之前插入数据。
  • 您的“id”字段似乎没有正确填充。如果它是自动递增的,则不应将其包含在查询中,或在 values() 中为其添加值
  • @Dave bindParam() 将 PHP 变量绑定到用于准备语句的 SQL 语句中的相应命名或问号占位符。与 PDOStatement::bindValue() 不同,该变量被绑定为引用,并且只会在调用 PDOStatement::execute() 时进行评估。
  • 一旦有答案,请不要修改问题中的错误
  • 你是对的@RiggsFolly ...不知道我在想什么。感谢您直截了当。以这种顺序编写代码似乎总是很奇怪,所以在我看来它仍然是“错误的”,即使它不是。

标签: javascript php ajax


【解决方案1】:

我假设products 表的id 列是自动增量列。

在这种情况下,您要么将其保留在列列表之外,要么将其设置为 NULL

所以

$query = "insert into products(name,description,img_file,price) 
                        values(:title, :description, :picture, :price)";

或者

$query = "insert into products(id,name,description,img_file,price) 
                        values(NULL, :title, :description, :picture, :price)";

此外,在此脚本的末尾,您构建了一个响应,但您从未真正将其发送回 AJAX 调用

$stmt->execute();

if ($stmt) {
    $response['status']  = 'success';
    $response['message'] = 'Product Deleted Successfully ...';
} else {
    $response['status']  = 'error';
    $response['message'] = 'Unable to delete product ...';
}
// add this line
echo $json_encode($response);

那你是不是给你的AJAX参数加上dataType: 'JSON',,你就可以把data中的结果当作javascritp对象处理

    $.ajax({
        url: 'insertPro.php',
        type: 'POST',
        data: $('#insert-product').serialize(),
        dataType: 'JSON',

【讨论】:

  • 确实 id 是 AI 但不幸的是这并不能解决问题。
  • readProducts(); 是做什么的,因为这就是你在 success 上所做的一切
  • readProducts 是一个调用文件来加载表记录的函数。据我所知工作正常,因为我可以看到记录分为列等。
  • 修复id 位后,是否会在数据库中创建一行
  • 没有。除了我手动添加的记录之外,phpmyadmin 不显示任何记录。我现在也不想使用回复。
猜你喜欢
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2019-01-19
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多