PDO #1054 'where 子句中的未知列 'n'

PDO #1054 Unknown column 'n' in 'where clause

我有一个 class 有一个函数,可以从数据库中提取任何数据,无论标识列是什么,基本上看起来像这样

    use Database\DB;

class General extends DB
{   
    private $fooBar;

    public function getData($column, $table, $value) {
        $column = (array) $column;
        $column = implode(', ', $column);
        $test = $this->query("SELECT `$column` FROM `$table` WHERE $column[0] = :value", array("value" => $value));
    }

}

执行如下:

return $this->general->getData(['name'], 'people', 'John Anderson');

但是,我收到一个错误,它告诉我有一个不存在的列输入,其值为 'n'(这恰好是列名的第一个字符,无论列名是什么值为)

完全错误;

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'n' in 'where clause'' in a\long\path\DB.class.php on line 50

PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'n' in 'where clause' in a\long\path\DB.class.php on line 50

提前致谢, 约尔迪

摆脱线

$column = implode(', ', $column);

它正在用一个字符串替换数组,该字符串包含以逗号分隔的所有列名。那么$column[0]将是第一个列名的第一个字符,而不是第一个列名。

在这里写下您的完整查询..比这更容易!

编辑:

试试这个代码:

use Database\DB;

class General extends DB
{   
    private $fooBar;

    public function getData($column, $table, $value) {
        $columns = (array) $column;
        $column = implode(', ', $columns);
        $test = $this->query("SELECT `$column` FROM `$table` WHERE $columns[0] = :value", array("value" => $value));
    }

}

我更改了以下内容: $column = (array) $column;$columns = (array) $column;

SELECT `$column` FROM `$table` WHERE $column[0] = :value", array("value" => $value)

SELECT `$column` FROM `$table` WHERE $columns[0] = :value", array("value" => $value)

这应该可以解决它(另请参阅@Barmar 的回答):

(注意内爆语句的不同)。

use Database\DB;

class General extends DB
{   
    private $fooBar;

    public function getData($column, $table, $value) {
        $column = (array) $column;
        $whereCol = $column[0];
        $column = implode('`, `', $column);
        $test = $this->query("SELECT `$column` FROM `$table` WHERE $whereCol = :value", array("value" => $value));

        return $test;
    }

}