我正在尝试使用PDO将数据从数据库中提取到当前对象中。代码:
class Voucher {
//Database and object have EXACTLY the same fields/properties/columns
protected $voucher_id;
protected $voucher_code;
protected $voucher_value;
protected $voucher_product_type;
protected $voucher_status;
// still in the class declaration
public function load_voucher($voucher_code){
global $conn; //load database connection info
$stmt = $conn->prepare('select * from cart_voucher_table where voucher_code = :voucher_code');
$stmt->execute(array('transaction_id' => $this_transaction_id));
I HAVE NO IDEA, NO PDO statement works
// Current object (which existed but was empty) now contains values from first row of returned data from db
}
}
//使用
$this_voucher = new voucher(); //creates new voucher object
$this_voucher->load_voucher($voucher_code); //loads data from database into the current voucher object.
我搜索了很长时间,没有结果。我见过的所有解决方案都具有类外的功能,或者它们返回一个新对象,而不是当前的对象。
答案 0 :(得分:1)
在模型/值对象中使用PDO来填充对象的属性是可怕的设计决策。我不是说要敲你的代码,而是鼓励你使用不同的技术。您在可维护性方面所避免的痛苦将值得选择新设计。解决后我有一个建议。
<强>解强>
此问题之前已在此处理过:“PDO's FETCH_INTO $this class does not working”。使用该技术应该解决您的问题。
<强> SUGGESTION 强>
我的建议是完全走另一条路。考虑创建一个看起来像这样的凭证DAO:
class VoucherDao
{
private $db;
public function __construct(\PDO $db)
{
$this->db = $db;
}
public function findVoucher($voucher_code)
{
$stmt = $this->db->prepare('select * from cart_voucher_table where voucher_code = :voucher_code');
$stmt->bindValue(':voucher_code', $voucher_code);
$stmt->setFetchMode(\PDO::FETCH_CLASS, 'Voucher');
$stmt->execute();
return $stmt->fetch();
}
}
您可以使用DAO创建已填充数据的凭证,而不是创建新的凭证然后加载它。
$dao = new VoucherDao($conn);
$voucher = $dao->findVoucher(12345);
当然,由于我没有完整的优惠券代码,我无法测试。如果我没记错的话,您需要在您的凭证类中创建设置器以允许PDO::FETCH_CLASS
正常工作。如果你试试我的建议,可以使用和不使用。
答案 1 :(得分:0)
“input_parameters中的键必须与SQL中声明的键匹配。在PHP 5.2.0之前,这是默认忽略的。”
来自:http://www.php.net/manual/de/pdostatement.execute.php
在你的MySQL中,在准备语句时,你有命名参数“:voucher_code”,但是数组中用于执行的键是“transaction_id” - 所以这可能是你的问题我猜,因为你写了一个关于获取的评论有关参数的错误消息。
另外,我在代码中的任何地方都看不到$ stmt-&gt; fetch()?