Проблемы с PHP и PDO - PullRequest
       0

Проблемы с PHP и PDO

1 голос
/ 14 июня 2011

Мне было интересно, есть ли способ сделать следующее, что не выдает мне ошибку. Кто-нибудь сможет объяснить, почему следующее невозможно, и как я могу это осуществить?

Вот функция:

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 ]

2 голосов
/ 14 июня 2011

Похоже, $ imp содержит "tid".Поскольку в двух таблицах есть столбцы с именем tid, SQL не совсем уверен, какую из них вы хотите вернуть.(Хотя они оба должны быть одинаковыми.) Попробуйте вставить «a.tid» в ваш $ imp.

2 голосов
/ 14 июня 2011

В сообщении об ошибке указывается, что столбец 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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...