使用PHP mysqli oops将记录插入数据库时出现问题



我使用PHP mysqli访问数据库并将记录插入数据库,还准备了语句,但在某个地方出现了我无法理解的错误。。指出错误将对非常有帮助

mailer.php

<?php 
class Submit {
    const DB = 'localhost',
          USER = 'test',
          PASS = '123456',
          DB_NAME = 'testing';

  private $mysql;

  public function __construct() {
      $this->mysql = new mysqli(self::DB , self::USER , self::PASS , self::DB_NAME);
      if ($this->mysql->connect_errno) {
          echo "Error: " . $this->mysql->connect_error;
          echo "<br>";
          echo "Error code: " . $this->mysql->connect_errno;
      }

    }
    public function addRecord($record) {
        $status = false;
        $query = "INSERT INTO mytable (name,message) VALUES (?,?)";
        $stmt = $this->mysql->prepare($query);
        if ( $stmt ) {
            $stmt->bind_param('ss', $record->name , $record->message);
            if ($stmt->execute()) {
                $status = ($stmt->affected_rows == 1) ? true : false;
                $stmt->fetch_object();
                $stmt->close();
            }
        }
        return $status;
    }
}

$submit = new Submit();
$result = null;
if (isset($_POST['submit']) ) {
    $name = isset($_POST['name']) ? trim($_POST['name']) : '';
    $message = isset($_POST['message']) ? trim($_POST['message']) : '';
    $result = $submit->addRecord($name,$message);
    if ($result) {
        echo "Message Saved";

    }
}

此外,我正在使用来自外部文件的ajax调用,该文件包含中的表单和脚本

index.php

<!DOCTYPE html>  
 <html>  
      <head>  
           <title>Contact Form | PHP, AJAX and MySQL</title>  
           <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />  
           <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>  
           <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>  
      </head>  
      <body>  
           <br /><br />  
           <div class="container" style="width:500px;">  
                <form id="submit_form">  
                    <label for="name">Name</label>  
                     <input type="text" name="name" id="name" class="form-control" />  
                     <br />  
                     <label for="message">Message</label>  
                     <textarea name="message" id="message" class="form-control"></textarea>  
                     <br />  
                     <input type="submit" name="submit" id="submit" class="btn btn-info" value="Submit" />  
                     <span id="error_message" class="text-danger"></span>  
                     <span id="success_message" class="text-success"></span>  
                </form>  
           </div>  
      </body>  
 </html>  
 <script> 
 jQuery(function($){  
        $('form#submit_form').submit(function(e){  
          e.preventDefault();
           var name = $(this).find('#name').val(),
               message = $(this).find('#message').val();  
           if(name == '' || message == '') {  
                $('#error_message').html("All Fields are required");  
           }  
           else {  
                $('#error_message').html('');  
                $.ajax({  
                     url:"mailer.php",  
                     method:"POST",  
                     data:{
                         name: name, 
                         message: message
                     },  
                     success:function(data){  
                          $("form").trigger("reset");  
                          $('#success_message').fadeIn().html(data).fadeOut(3000);  
                     }  
                });  
           }  
      });  
 });  
 </script>  

您为addRecord()方法提供了2个参数,但它只需要1个。但是,它似乎期望一个你没有初始化的对象,所以我调整了它,所以它采用了你给它的两个参数

public function addRecord($name, $message) {
    $status = false;
    $query = "INSERT INTO mytable (name,message) VALUES (?,?)";
    $stmt = $this->mysql->prepare($query);
    if ( $stmt ) {
        $stmt->bind_param('ss', $name , $message);
        if ($stmt->execute()) {
            $status = $stmt->affected_rows === 1;
        }
    }
    return $status;
}

此外,我删除了方法中一些不必要的步骤:

$status = ($stmt->affected_rows == 1) ? true : false;
$status = $stmt->affected_rows === 1; 

比较本身将返回布尔值,因此不需要使用显式结构。

$stmt->fetch_object();
$stmt->close();

在没有使用过的情况下获取对象是一种浪费。当离开方法的作用域时,垃圾收集器将取消设置stmt。

测试功能的代码:

class Submit {
const DB = 'localhost',
      USER = 'test',
      PASS = '123456',
      DB_NAME = 'testing';
  private $mysql;
  public function __construct() {
      $this->mysql = new mysqli(self::DB , self::USER , self::PASS , self::DB_NAME);
      if ($this->mysql->connect_errno) {
          echo "Error: " . $this->mysql->connect_error;
          echo "<br>";
          echo "Error code: " . $this->mysql->connect_errno;
      }
    }
    public function addRecord($name, $message) {
        $status = false;
        $query = "INSERT INTO mytable (name,message) VALUES (?,?)";
        $stmt = $this->mysql->prepare($query);
        if ( $stmt ) {
            $stmt->bind_param('ss', $name , $message);
            if ($stmt->execute()) {
                $status = $stmt->affected_rows === 1;
            }
        }
        return $status;
    }
}

$submit = new Submit();
$result = null;
$name = "dsfdsf";
$message = "message";
$result = $submit->addRecord($name,$message);
var_dump($result); // bool(true) 

最新更新