Php PDO:使用变量选择特定字段

Php PDO:使用变量选择特定字段,php,pdo,Php,Pdo,我目前使用以下构造创建成员对象: class Member{ private $member_id = 0; private $name, $surname, $email; public function __construct(){} public function construct($conn, $param_select = '*', $param_member_id){ $query_rs_this = $conn->prepare('SELECT

我目前使用以下构造创建成员对象:

class Member{   
private $member_id = 0;
private $name, $surname, $email;

public function __construct(){} 
    
public function construct($conn, $param_select = '*', $param_member_id){
    $query_rs_this = $conn->prepare('SELECT :select FROM members WHERE 
                                            member_id = :member_id
                                        ORDER BY members.surname');
                                        
    $query_rs_this->execute(array(':select' => $param_select, ':member_id' => $param_member_id));
    $rs_this = $query_rs_this->fetch(PDO::FETCH_ASSOC);
    $query_rs_this->closeCursor();
    
    foreach($rs_this as $key => $value){
        $this->$key = $value;
    }
    unset($key);
}  
我想传递一个字符串,其中包含应从数据库中选择的列(字段名)。目前我使用的是:

$temp = new Member();
$select = "name, surname, email";
$temp->construct($db_conn, $select, 1);
其中$select是包含字段名称的字符串

目前,我得到以下输出:

成员id:0

姓名:

姓:

电邮:

?:姓名、姓氏、电子邮件

这应该是:

成员编号:1

姓名:约翰

姓:多伊

电邮:test@email.com


提前感谢您的帮助。

要完成基本相同的任务,您可以选择一个字段白名单,然后自己构建字段字符串

public function construct($conn, 
                          $param_select = array('name', 'surname', 'email'),
                          $param_member_id) 
{
    $available_fields = array('name', 'surname', 'email');
    $select_fields_array = array_intersect($param_select, $available_fields);
    $select_fields = implode(", ", $select_fields_array);
    $query_rs_this = $conn->prepare("SELECT $select_fields FROM members WHERE 
                                        member_id = :member_id
                                    ORDER BY members.surname");

    $query_rs_this->execute(array(':member_id' => $param_member_id));
    $rs_this = $query_rs_this->fetch(PDO::FETCH_ASSOC);
    $query_rs_this->closeCursor();

    foreach($rs_this as $key => $value){
        $this->$key = $value;
    }
    unset($key);
}  


首先,不能绑定表
SELECT:SELECT
Add
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION)连接打开后,您将收到错误警报。我明白了。。。因此,我需要手动检查并编译一个列列表,以从我的DB中提取?Yep/Yep和Yep;-)Hmpf。感谢您的即时回复!我很感激。现在有个主意了!杰出的然而,当我读几百行,有很多列时,这不是会导致不必要的内存使用(以及时间延迟)吗?可能-只是将其修改为一种安全的方式来构建字段以选择自己。如果您添加了一个字段,您将不得不更改代码以允许它,但是性能方面应该更快,这是完美的,亲爱的先生。硬编码的可用字段是罚款由我。非常感谢。
public function construct($conn, 
                          $param_select = array('name', 'surname', 'email'),
                          $param_member_id) 
{

    $query_rs_this = $conn->prepare("SELECT * FROM members WHERE 
                                        member_id = :member_id
                                    ORDER BY members.surname");

    $query_rs_this->execute(array(':member_id' => $param_member_id));
    $rs_this = $query_rs_this->fetch(PDO::FETCH_ASSOC);
    $query_rs_this->closeCursor();

    foreach($rs_this as $item){
        foreach($param_select as $field) {
             $this->$field = $item[$field];
        }
    }
    unset($key);
}