我正在创建一个内容类,它将通过 PDO 从数据库中提取所有内容,然后通过一种将结果转换为对象的方法运行结果,并循环遍历对象,并将对象回显到网页的特定模块。
预期的结果
当类被激活时,将通过 PDO 创建一个实例,该实例将从 mysql 数据库中检索所需的数据。那么这个信息就会回显出来,显示在网页上。
发生了什么
我最终没有错误,内容应该是 boolean 值“1”。起初我以为这是一个sql错误。如果我使用 print_r($query_result),我会得到相同的结果“1”。请参阅下面的测试。
我的类(class)代码在下面
<?php
class Content {
// --- START OF ACTIVE RECORD CODE ---
public $n_id;
public $n_name;
public $n_text;
public $n_photo;
// Instantiating a STATIC Database Connection for the class to use
static protected $dbconnect;
static public function database($dbconnect) {
self::$dbconnect = $dbconnect;
}
// constructing arguments
public function __construct($args=[]) {
$this->n_id = $args['n_id'] ?? '';
$this->n_name = $args['n_name'] ?? '';
$this->n_text = $args['n_text'] ?? '';
$this->n_photo = $args['n_photo'] ?? '';
}
// Multi use method to pass in sql that will execute the PDO only two parameters are bound ID and contentText.
static public function find_by_sql($sql) {
// -------------BEGIN PDO-----------
// preparing PDO by loading sql, calling db connection, and storing in variable $stmt
$stmt = self::$dbconnect->prepare($sql);
// Binding Parameters for sql
$stmt->bindParam(':nid', $n_id, PDO::PARAM_INT);
$stmt->bindParam(':nall', $n_name, PDO::PARAM_STR);
$stmt->bindParam(':ntext', $n_text, PDO::PARAM_STR);
$stmt->bindParam(':nphoto', $n_photo, PDO::PARAM_INT);
// executing $stmt PDO and storing the result in $stmt
$query_result = $stmt->execute();
return $query_result;
// clearing the PDO after information is stored in $record
$stmt->closeCursor();
// ------------END PDO ----------
// Checking to see if a result exist. If nop result is stored in $stmt, then it will echo "Database query failed."
if(!$query_result) {
exit("Query doesn't exist.");
}
// -------- BEGIN TURNING RESULTS INTO OBJECTS --------
$object_array = [];
// The result $stmt will be stored in the variable $record
while($record = $query_result->fetchAll()) {
// Taking $record and passing it to the static method instantiate() - see below. This method will return the $object_array.
$object_array[] = self::instantiate($record);
}
return $object_array;
// ------------ END TURNING RESULTS INTO OBJECTS --------
}
// method to test passing $sql to method find_all_sql();
static public function find_all(){
$sql = "SELECT * FROM nmain WHERE nid = :id AND nall = :nall AND ntext = :ntext AND nphoto = :nphoto";
return self::find_by_sql($sql);
}
// --- BEGIN INSTANTIATE METHOD TO CREATE OBJECTS ---
static protected function instantiate($record) {
$object = new self;
// Auto assign values
foreach($record as $property => $value) {
if(property_exists($object, $property)){
$object->$property = $value;
}
}
return $object;
}
// ----- END INSTANTIATE OF RECORD TO CREATE OBJECTS ---
// ---END OF ACTIVE RECORD CODE---
}
?>
**On my html webpage:**
$contents = Content::find_all();
foreach ((array) $contents as $content) {
echo $content;
}
我测试了什么
这是我运行 var_dump($stmt) 时得到的输出;
object(PDOStatement)#3 (1) { ["queryString"]=> string(119) "SELECT * FROM ndb WHERE id = :id AND nall = :nall AND ntext = :ntext AND nphoto = :nphoto" }
如果我复制查询并将其粘贴到 myphpadmin 中,查询将运行绑定(bind)参数。
如果我运行 var_dump($query_result),这是输出:
bool(true) if I use print_r($query_result) I get "1"
这通过了我的 if(!$query_result) 测试
如果我运行 var_dump($record) 或 var_dump($query_result),我什么也得不到。好像$query_result,因为是bool,没有数组传给$record,所以没有什么可以转成对象的,我这里很茫然。是我的 PDO 绑定(bind)吗?
最佳答案
你的 fetch 应该在语句上而不是执行的结果(这只是说执行成功或失败),而且 fetchAll
将尝试返回所有记录,你最可能想要的是 fetch
一次处理 1 条记录。所以你应该有类似...
while($record = $stmt->fetch()) {
您现在可以删除停止进一步处理的较早的 return
。
关于php - PDO 期望数组在网页上不只返回 1 的 boolean 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55047121/