【问题标题】:PHP data insertion not working using PDOPHP数据插入无法使用PDO
【发布时间】:2016-09-03 07:41:31
【问题描述】:

我正在尝试使用 PDO 将数据插入数据库。连接建立成功,但 prepare 功能不起作用。它给了我一个错误:

致命错误:在 null 上调用成员函数 query() E:\xammp\htdocs\OOP\Project\classes\insert.php 在第 8 行

我的 index.php 页面:

<?php

    function __autoload($cl){

        require_once "classes/$cl.php";

    }

    $connection = new database();

    if(isset($_POST['submit']))
    {
         $name = $_POST['name'];
         $email = $_POST['email'];
         $ph = $_POST['phone'];

        try
        {
            $ins = new insert();

        }
        catch(PDOEXCEPTION $e)
        {
            echo $this->con_error . $e->getmessage();
        }
    }

类/数据库.php:

<?php

class database{

    public $db;
    public $con_error;

    protected function connection(){

        try
        {
            $this->db = new PDO("mysql:host=localhost;dbname=oop","root","");
        }
        catch(PDOException $e)
        {
            echo $this->con_error="An error in connection" . $e->getmessage();
        }

    }
    public function __construct(){

        return $this->connection();

    }



}

类/插入.php:

<?php

class insert extends database{
    public $stmt; 

    public function __construct(){

        $stmt = $this->db->prepare("INSERT INTO `users` (`name`,`email`,`phone`) VALUES (:name,:email,:phone)");
        $stmt->bindParam(":name",$name);
        $stmt->bindParam(":email",$email);
        $stmt->bindParam(":phone",$ph);
        $stmt->execute();

    }

}

【问题讨论】:

  • 需要从子类的构造函数中调用父类的构造函数。它不会自动发生。
  • 请使用spl_autoload_register()

标签: php pdo


【解决方案1】:

insert 不应该是database 的子代。如果你对每个操作都这样做,你最终会得到很多类,每个类都有自己的数据库连接。您应该让它们将连接作为参数,以便它们都可以使用相同的连接。

此外,您的函数正在使用变量 $name$email$ph,但它们没有作为参数传递给函数。您不应该在构造函数中执行插入,应该以正常方法完成。构造函数只是用于初始化类对象。

class insert {
    private $db;

    public function __construct($db) {
        $this->db = $db;
    }

    public function insertUser($name, $email, $ph) {
        $stmt = $this->db->db->prepare("INSERT INTO `users` (`name`,`email`,`phone`) VALUES (:name,:email,:phone)");
        $stmt->bindParam(":name",$name);
        $stmt->bindParam(":email",$email);
        $stmt->bindParam(":phone",$ph);
        $stmt->execute();

    }

}          

那么你的主要代码是这样的:

$database = new database;

if(isset($_POST['submit']))
{
     $name = $_POST['name'];
     $email = $_POST['email'];
     $ph = $_POST['phone'];

    try
    {
        $ins = new insert($database);
        $ins->insertUser($name, $email, $ph);

    }
    catch(PDOEXCEPTION $e)
    {
        echo $this->con_error . $e->getmessage();
    }
}  

【讨论】:

  • !为什么你放 $db ????我的意思是这是为了什么..它给了我一个错误
  • 注意:未定义变量:数据库在 E:\xammp\htdocs\OOP\Project\index.php 第 67 行
  • @Barmar !请帮助我
  • 我无法将保存连接对象的变量作为参数传递给插入类..
  • @Anonoymous 我在您的另一个问题中发表了评论。我不知道你为什么会收到关于$database 的错误,因为它在if (isset($_POST['submit'])) 之前的那一行中已明确定义。
猜你喜欢
  • 2014-11-25
  • 2012-11-11
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
相关资源
最近更新 更多