我正在尝试了解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。谢谢
答案 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代码相关的任何错误。