序言
我正在从头开始构建一个新的应用程序,我正在努力尽可能地实现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相关的问题都没有问题,因为它正在按预期吐出第一个循环的列名。
这让我觉得问题必然在于从对象中即时定义变量,但我不知道......
答案 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)