在对象循环期间构建变量以从预先存在的变量中检索数据

时间:2016-05-06 13:46:10

标签: php oop variables object foreach

序言

我正在从头开始构建一个新的应用程序,我正在努力尽可能地实现DRY原则。

我正在尝试使我的查询构建更加动态,因此我必须使用我当前使用的数据库表中的列名来动态定义变量。

问题

动态定义变量仅适用于我的一半代码。例如,UPDATE代码工作正常:

// Get the data.
$data = db::getInstance()->query("SELECT * FROM `{$table}` WHERE `ID` = {$id}")->firstResult();

// Build the SQL.
$sql  = "UPDATE `{$table}` SET ";

foreach($data as $key => $value) { 
    $sql .= "`$key` = '{${$key}}', "; 
}

$sql  = trimSQL($sql); // Removes the final ', '
$sql .= "WHERE `id` = {$id}";

但是,INSERT代码不是:

// Get the column names from the DB.
$data = db::getInstance()->query("SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_NAME` = '{$table}'")->results();

// Build the SQL.
$sql  = "INSERT INTO `{$table}` (";

foreach($data as $d) { 
    $sql .= ($d->COLUMN_NAME ? "'{$d->COLUMN_NAME}', " : $sql); 
}

$sql  = trimSQL($sql); // Removes the final ', '
$sql .= ') VALUES (';

// This is the problem loop.
foreach($data as $d) { 
    $sql .= ($d->COLUMN_NAME ? "`{${$d->COLUMN_NAME}}`, " : $sql); 
}

$sql  = trimSQL($sql); // Removes the final ', '
$sql .= ')';

return $sql;

以上是返回以下内容:

INSERT INTO `table` (`col1`, `col2`, `col3`) VALUES (``, ``, ``) 

因此,第一个foreach按预期工作,但第二个不是。

我试图定义的变量被呈现为好像它们是空的,当它们不是时。我使用相同的表单名称和变量名称作为DB列名称,以便我可以自动化该过程。

即使我在页面顶部明确定义了变量$col1,它仍然没有提取数据。

添加/编辑的概念几乎相同。但是,通过添加数据,我们还没有得到表结构,必须以不同的方式进行处理。

但是,我知道任何与DB相关的问题都没有问题,因为它正在按预期吐出第一个循环的列名。

这让我觉得问题必然在于从对象中即时定义变量,但我不知道......

2 个答案:

答案 0 :(得分:1)

如果你这样做,我当然不相信你必须打破你的誓言:

    <?php

        // Get the column names from the DB.
        $data = db::getInstance()->query("SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_NAME` = '{$table}'")->results();

        // Build the SQL.
        $sql  = "INSERT INTO `{$table}` (";

        foreach($data as $d) {
            $tblVal = ($tv=$d->COLUMN_NAME)? "`" . $tv . "`, " : $sql; 
            $sql .= $tblVal;
        }

        $sql  = trimSQL($sql); // Removes the final ', '
        $sql .= ') VALUES (';

        // This is the problem loop.
        foreach($data as $d) {
            $colVal = ($cn=$d->COLUMN_NAME)? "'" . $$cn . "', " : $sql; 
            $sql .= $colVal;   
        }

        $sql  = trimSQL($sql); // Removes the final ', '
        $sql .= ')';

        return $sql;

答案 1 :(得分:0)

插入的问题在于您使用`而不是foreach($data as $columnName) { $sql .= "'" . ${$columnName} . "', "; } (单引号)来包装值。此外,列选择的结果将是包含给定表的所有列的单个数组。

将您的代码更改为:

R 3.3.0 GUI 1.68 Mavericks build (7202)