无法以oop方式将数据插入数据库

时间:2015-07-06 10:45:56

标签: php oop pdo

我尝试使用oop方式将汽车添加到数据库中。

有人可以在这里指出错误吗?如果我没有扩展连接类,我如何访问类中的方法?为什么对象pdo不能在类车中工作?

<?php
class connection
{
    public $servername = "localhost";
    public $username = "root";
    public $password = "mypassword";
    public $dbname = "carrental";
    public $port="3306";

    function addConnection()
    {
      try {
      $pdo = new PDO("mysql:host=$this->servername;port=$this->port;dbname=$this->dbname", $this->username, $this->password);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      } catch(PDOException $e) {
      echo 'ERROR: ' . $e->getMessage();
      }
      $pdo->query("use $this->dbname");
    }
}
class car extends connection
{
    public $name;
    public $maker;
    public $type;
    public $colour;
    public $passanger;

    function __construct($param1,$param2,$param3,$param4,$param5)
    {
        $this->name=$param1;
        $this->maker=$param2;
        $this->type=$param3;
        $this->colour=$param4;
        $this->passanger=$param5;
        echo "name is {$this->name}.Maker is {$this->maker}.";
    }
    function addCar()
    {

        $this->addConnection();
        echo $this->username;
        $sql="INSERT INTO car(car_name,car_maker,car_colour,num_passanger)VALUES(:$param1,:$param2, :$param3,:$param4,:$param5)";
        $stmt = $this->prepare($sql);
        $stmt->execute(array(
        ':param1'=>$this->name,
        ':param2'=>$this->maker,
        ':param3'=>$this->type,
        ':param4'=>$this->colour,
        ':param5'=>$this->passanger
        ));
        echo "affected rows ".$stmt->rowCount();
    }
}

$car1=new car("Honda Accord","Honda","4 wheeler","Red",5);
$car1->addCar();

?>

3 个答案:

答案 0 :(得分:0)

试试这个:

public $pdo;

function addConnection()
{
  try {
      $this->pdo = new PDO("mysql:host=$this->servername;port=$this->port;dbname=$this->dbname", $this->username, $this->password);
      $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  } catch(PDOException $e) {
      echo 'ERROR: ' . $e->getMessage();
  }

  $this->pdo->query("use $this->dbname");
}
function addCar()
{
    $sql="INSERT INTO car(car_name,car_maker,car_colour,num_passanger)VALUES(:$param1,:$param2, :$param3,:$param4,:$param5)";
    $stmt = $this->pdo->prepare($sql);
    $stmt->execute(array(
    ':param1'=>$this->name,
    ':param2'=>$this->maker,
    ':param3'=>$this->type,
    ':param4'=>$this->colour,
    ':param5'=>$this->passanger
    ));
    echo "affected rows ".$stmt->rowCount();
}

答案 1 :(得分:0)

就像Daniel建议的那样,将$pdo设为类connection的公共属性,并让方法addConnection()为此属性赋值:

public $pdo;

function addConnection()
{
  try {
      $this->pdo = new PDO("mysql:host=$this->servername;port=$this->port;dbname=$this->dbname", $this->username, $this->password);
      $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  } catch(PDOException $e) {
      echo 'ERROR: ' . $e->getMessage();
  } 
  $this->pdo->query("use $this->dbname");
}

现在在查询方法调用中访问此属性:

function addCar()
{
    if(!isset($this->pdo))
        $this->addConnection();
    $sql="INSERT INTO car(car_name,car_maker,car_colour,num_passanger)VALUES(:$param1,:$param2, :$param3,:$param4,:$param5)";
    $stmt = $this->pdo->prepare($sql);
    $stmt->execute(array(
    ':param1'=>$this->name,
    ':param2'=>$this->maker,
    ':param3'=>$this->type,
    ':param4'=>$this->colour,
    ':param5'=>$this->passanger
    ));
    echo "affected rows ".$stmt->rowCount();
}

另一种方法是使用单独的PHP文件设置global PDO对象,然后将此文件包含在任何其他必要文件中并使用公开的变量。

Connections.php

<?php
$servername = "localhost";
$username = "root";
$password = "mypassword";
$dbname = "carrental";
$port="3306";

$pdo=getConnected();

function getConnected(){
    try {
        $pdo = new PDO("mysql:host=$this>servername;port=$this>port;dbname=$this->dbname", $this->username, $this->password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } 
    catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage();
    }
    return $pdo;
}
?>

请注意,您可以进一步将凭据抽象为credentials.php文件,并将其包含在connections.php中。

car.php

<?php  
include_once('Connections.php');
class car
{
    public $name;
    public $maker;
    public $type;
    public $colour;
    public $passanger;

    function __construct($param1,$param2,$param3,$param4,$param5)
    {
        $this->name=$param1;
        $this->maker=$param2;
        $this->type=$param3;
        $this->colour=$param4;
        $this->passanger=$param5;
        echo "name is {$this->name}.Maker is {$this->maker}.";
    }
    function addCar()
    {
        $sql="INSERT INTO car(car_name,car_maker,car_colour,num_passanger)VALUES(:$param1,:$param2, :$param3,:$param4,:$param5)";
        $stmt = $GLOBALS['pdo']->prepare($sql);
        $stmt->execute(array(
        ':param1'=>$this->name,
        ':param2'=>$this->maker,
        ':param3'=>$this->type,
        ':param4'=>$this->colour,
        ':param5'=>$this->passanger
        ));
        echo "affected rows ".$stmt->rowCount();
    }
}
$car1=new car("Honda Accord","Honda","4 wheeler","Red",5);
$car1->addCar();
?>

答案 2 :(得分:-1)

$这 - &GT; addConnection(); 试试

  $this->conn = parent::addConnection();        

  $stmt = $this->conn->prepare($sql);