用于数据检索的变量变量?

时间:2015-07-24 08:19:34

标签: php mysql

首先,自从我大约一年前开始涉足php以来,一直是stackoverflow的狂热读者。通常可以找到大多数问题的答案,但我正在努力解决这个问题。

我已经阅读了很多帖子,这些帖子强烈反对在php中使用变量变量,以至于似乎普遍的共识就是像瘟疫一样避免它们。虽然我理解某些场景可能会打开安全漏洞,但我需要了解在以下MySQL数据检索环境中使用它们的含义(如果有的话)。

除此之外,我的网络应用程序处理大量问题处理大量不同的客户问卷。下面给出了数据库结构和问卷类的示例片段以说明我的问题(为清楚起见,删除了所有不相关的代码)。所有MySQL字段和类属性都具有相同的命名约定。

我的代码就像一个魅力,但我需要有人告诉我为什么我不应该使用它!

数据库:

CREATE TABLE `history` (
  `historyID` int(11) NOT NULL AUTO_INCREMENT,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `clientID` int(11) NOT NULL,
  `q1` varchar(500) DEFAULT NULL,
  `q2` varchar(500) DEFAULT NULL,
  `q3` varchar(500) DEFAULT NULL,
  `q4` varchar(500) DEFAULT NULL,

  //..all the way to..

  `q90` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`historyID`),
  KEY `clientID` (`clientID`),
  CONSTRAINT `childdevq_ibfk_1` FOREIGN KEY (`clientID`) REFERENCES `client` (`clientID`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=134 DEFAULT CHARSET=latin1

php类:

class history {

    private $db; // MySQL db object

    public $historyID;
    public $created;
    public $clientID;
    public $q1;
    public $q2;
    public $q3;
    public $q4;

    //..all the way to..

    public $q90;

    public function __construct($db){
        $this->db = $db;
    }

    private function populateFields($row){
        foreach ($row as $field=>$value){
            $this->{$field} = htmlspecialchars($value);
        }
    }

    public function getHistory($historyID){
        $sql = "SELECT * FROM history WHERE historyID = {$historyID};";
        $result = $this->db->query($sql);
        if ($result->num_rows){
            $row = $result->fetch_array();
            $this->populateFields($row);
            return 'success';
        } else {
            return 'no results';
        }
    }
}

替代方案是:

    private function populateFields($row){
        $this->historyID = htmlspecialchars($row['historyID']);
        $this->clientID = htmlspecialchars($row['clientID']);
        $this->q1 = htmlspecialchars($row['q1']);
        $this->q2 = htmlspecialchars($row['q2']);
        $this->q3 = htmlspecialchars($row['q3']);
        $this->q4 = htmlspecialchars($row['q4']);

        //..all the way to..

        $this->q90 = htmlspecialchars($row['q90']);
    }

......这似乎是很多不必要的代码。我只是懒惰吗?

无论如何,我不会假装成为一个完整的业余爱好者,所以请把我撕成碎片! : - )

1 个答案:

答案 0 :(得分:1)

正如我的评论(以及@ Random' s)中所建议的那样,为什么不将q存储为数组,这里有一些示例代码我为了给你一个想法而打动

private function populateFields($row)
{
    foreach ($row as $key => $value) {
        if(substr($key, 0, 1) === 'q')
            $index = substr($key, 1);
            $this->q[$index] = htmlspecialchars($value);
        } else {
            $this->$key = htmlspecialchars($value);
        }
    }
}

// Later when you want to see what is in q
foreach ($this->q as $index => $value) {
    // your q number
    echo $index;
}

作为旁注,如果您将数据库设计为这样,那么更好的方法是将表格保存在带有连接的问卷中。如果你没有设计表格,找到谁做了并拍摄它们;)