简单插入oop PHP

时间:2016-10-21 03:04:20

标签: php mysql oop

我正在尝试了解oop php最佳做法并且调试很困难,我知道这可能是一个重复的问题,我希望不要得到很多负面投票,所以让我们来看看。得到了问题:

我在Product

中有Products.php个班级
class Product {

    public $id;
    public $name;
    public $price;    
    public $description;

    function __construct($id, $name, $price, $description)
    {
        $this->$id = $id; 
        $this->$name = $name;
        $this->$price = $price;
        $this->$description = $description;

    }  
} 

ProductManger

中的ProductsManager.php课程
include('Products.php');
include('config.php');

class ProductManager {


function addProduct($conn,Products $p)
{

  $query="INSERT INTO `products`( `name`, `description`, `price`) VALUES    ('".$name."','".$price."','".$description."')";
    $c->exec($query);

}   
 }

config

中的config.php班级
class config {

    function connect() {

        $serverName="localhost";
        $dbName="phppoo";
        $user="root";
        $pass="";

        return $conn = new PDO("mysql:host=$serverName;dbname=$dbName",$user,$pass);
    }   
} 
//to be clear i think there are no issue related to connection 

Html页面我提交表格

 <!DOCTYPE html>
 <html>
    <head>
  <meta charset="utf-8">

</head>

 <body>
 <form action="AddProduct.php" method="POST">
 <table border="3">
 <tr>
    <td>Reference<td>
    <td><input type="text" name="name"></td>
   </tr>
   <tr>
    <td>Nom<td>
    <td><input type="text" name="desc"></td>
   </tr>

   <tr>
    <td>date de création <td>
    <td><input type="number" name="price"></td>
    </tr>


    <tr>
    <td> <td>
     <td><input type="submit" name="ajouter" value="ajouter"></td>
   </tr>


 </form>
 </table>   


 </body>
 </html>

最后是AddProduct.php我在哪里实例化产品经理并发送数据,以便我可以执行query

include('ProductsManager.php');

$co = new config();
$c=$co->connect();


if(isset($_POST['name']) and isset($_POST['desc'])and isset($_POST['price']) ) {
    $p=new ProductManager($_POST['name'],$_POST['desc'],$_POST['price']); 
    $p->addProduct($c,$p);
}

现在如果我尝试从form页面提交html,我会被重定向到空白页面AddProduct.php,而且正常原因是我没有返回值。< / p>

这里的问题是,我没有在我的Database中插入新的值。

感谢任何帮助,PS:如果您认为这不是最佳做法,请提及更好的方法或tuto。谢谢

2 个答案:

答案 0 :(得分:2)

以这种方式修改insert语句。因为您可以通过引用访问产品属性。<​​/ p>

$query="INSERT INTO `products`( `name`, `description`, `price`) VALUES  
('".$p['name']."','".$p['description']."','".$p['price']."')";

答案 1 :(得分:1)

要修改类中的属性,请执行以下操作:

$this->price = $price;

不是这个:

$this->$price = $price;

以上所做的是根据$ price的价值尝试该属性。因此,如果价格为5.0,则会查找$this->5.0的属性。

您更新的课程如下:

class Product {

    public $id;
    public $name;
    public $price;    
    public $description;

    function __construct($id, $name, $price, $description)
    {
        $this->id = $id; 
        $this->name = $name;
        $this->price = $price;
        $this->description = $description;

    }  
} 

您的添加产品方法如下所示:

function addProduct($conn,Products $p) {

    $query="INSERT INTO `products`( `name`, `description`, `price`) VALUES    ('".$p->name."','".$p->description."','".$p->price."')";
    $conn->exec($query);

}

$p变量上的属性未被访问,必须像$p->yourProperty一样访问。描述和价格也在错误的位置。

还有一些与SQL注入相关的问题,这些问题在本答案中没有涉及,但至少这将有助于您了解OOP本身的问题。

最后一个错误是您要从ProductManager类的实例(addProduct)调用$p并将Product变量的实例传递给addProduct方法:

$p = new ProductManager(); 
$product = new Product(-1, $POST['name'],$POST['desc'],$POST['price']);
$p->addProduct($c, $product);

我为$ id参数设置-1,因为尚未插入行。在插入之后,您可能希望获取最后一行插入ID并将其分配给实例属性,例如$this->id = $lastInsertId;

并且,您需要修复if声明:

if(isset($_POST['name']) and isset($_POST['desc'])and isset($_POST['price']) ) {

$_POST而不是$POST_ ...我们没有看到声明的结果,因此我们没有看到与OO代码相关的任何错误。