PHP和PDO问题

时间:2011-06-13 20:45:35

标签: php pdo

我想知道是否有办法执行以下操作并不会给我一个错误。有人能够解释为什么以下是不可能的,以及我如何将它拉下来?

这是功能:

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

2 个答案:

答案 0 :(得分:2)

错误表明列tid不明确,因为它包含在别名a表和b表中。要清除它,它需要在SELECT列列表中显示为a.tidb.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”。