【问题标题】:Unable to insert data into database in oop way无法以oop方式将数据插入数据库
【发布时间】:2015-09-23 11:34:59
【问题描述】:

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

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

<?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();

?>

【问题讨论】:

  • 创建$pdo 变量时没有任何反应。您应该将$pdo 设为属性并访问它以进行查询。
  • 实现了这样的逻辑,我宁愿把connection做成一个static class而不扩展它。您拥有的其他解决方案是在您的连接类中创建一个$pdo object(但您很可能会在每次创建扩展类对象时重新调用并重新加载它),或者您可以设置addConnection() 返回 pdo object 的函数。另外,我建议您对此类范围使用接口(或抽象类),因为您需要为查询创建某种“规则”。

标签: php oop pdo


【解决方案1】:

试试这个:

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();
}

【讨论】:

  • 我收到此错误:致命错误:在第 53 行对 C:\wamp\www\carRental\index.php 中的非对象调用成员函数 prepare()
  • 你没有忘记添加'public $pdo;'进入“连接”类?
  • 将此添加到汽车构造器中:$this->addConnection();
【解决方案2】:

就像 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 对象,然后将此文件包含在任何其他必要的文件中并使用公开的变量。

连接.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 中。

汽车.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();
?>

【讨论】:

    【解决方案3】:

    $this->addConnection(); 试试

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

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 2014-10-06
      • 1970-01-01
      • 2013-03-02
      • 2021-07-23
      • 2017-10-24
      相关资源
      最近更新 更多