我正在尝试使用PDO.Connection成功建立数据到数据库,但准备功能不起作用。它给了我一个错误:
致命错误:在null上调用成员函数query() 第8行的E:\ xammp \ htdocs \ OOP \ Project \ classes \ insert.php
我的 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();
}
}
类/ database.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();
}
}
类/ insert.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();
}
}
答案 0 :(得分:1)
insert
不应该是database
的孩子。如果您为每个操作执行此操作,您最终将拥有许多每个都有自己的数据库连接的类。您应该让它们将连接作为参数,因此它们都可以使用相同的连接。
此外,您的函数正在使用变量$name
,$email
和$ph
,但它们并未作为参数传递给函数。你不应该在construtor中执行插入,这应该以正常方法完成。构造函数仅用于初始化类对象。
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();
}
}