我想知道是否有办法执行以下操作并不会给我一个错误。有人能够解释为什么以下是不可能的,以及我如何将它拉下来?
这是功能:
public function getTaxClass()
{
$arg = func_get_args();
$pid = array_shift($arg);
$imp = implode(',',$arg);
$stmt = _DB::init()->prepare("SELECT $imp
FROM tax_class a
INNER JOIN products_to_tax_class pa ON a.tid = pa.tid
WHERE pa.pid = ?"
);
if($stmt->execute(array($pid)))
return $stmt->fetch(PDO::FETCH_ASSOC);
}
我无法将变量插入预先准备好的声明中吗?我尝试在将其添加到准备之前构建字符串,但是仍然会收到以下警告:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'tid' in field list is ambiguous' in /class.php:89 Stack trace: #0 /class.php(89): PDOStatement->execute() #1 /class.php(98): _Class->getTaxClass(1, 'tid', 'name', 'rate') #2 {main} thrown in/class.php on line 89
答案 0 :(得分:2)
错误表明列tid
不明确,因为它包含在别名a
表和b
表中。要清除它,它需要在SELECT
列列表中显示为a.tid
或b.tid
。在implode()
后,它只会以tid
的形式进入选择列表。
解决这个问题的最简单方法是,当您将所有列作为函数参数传入时,将表和列指定为table.column
。
或者,在执行implode()
:
// Assuming all your columns belong to the `a` table alias...
$arg = func_get_args();
$pid = array_shift($arg);
$prepared_args = array();
// Loop over your remaining column name arguments and prepend `a.` to each
foreach($arg as $a) {
$prepared_args = "a.$a"
}
$imp = implode(",", $prepared_args);
// Finish up your PDO stuff...
答案 1 :(得分:2)
看起来$ imp包含“tid”。由于两个表都有名称为tid的列,因此SQL不太确定您想要返回哪一个。 (即使它们中的两个应该是相同的。)尝试在你的$ imp中加入“a.tid”。