2015-01-01 2 views
-1

У меня проблема с INNER JOIN и PDO. Мой запрос работает отлично, когда не используется INNER JOIN. При добавлении INNER JOIN к запросу ничего не отображается.Внутреннее соединение и PDO

Действительно ли это путь, или я совершенно неправ?

Любые предложения?

public function search($searchterm) 
{ 
    $query = $this->db->prepare(" 
     SELECT 
      ad.id AS idet, 
      ad.lid, 
      ad.firstname AS firstnamer, 
      ad.surname AS surnamer, 
      ad.socialnr AS socialnumber, 
      ba.class AS classes 
     FROM `everybody` ad 
     INNER JOIN `students` ba 
     ON idet = ba.id 
     WHERE (`firstname` LIKE :search OR `surname` LIKE :search OR `classes` LIKE :search)"); 

    $searchterm = '%' . $searchterm . '%'; 
    $query->bindParam(':search', $searchterm, PDO::PARAM_STR); 

    $query->execute(); 

    while($row = $query->fetch(PDO::FETCH_ASSOC)) { 
     echo $row['idet']. ' : '. $row['firstnamer']. ' '. $row['surnamer']. ' - '. $row['socialnumber']. ' Class: '. $row['classes']. '<br />'; 
    } 

} 
+4

Никаких результатов, возвращенных из 'INNER JOIN', не указывает, что объединенная таблица не имела строк, соответствующих условию' ON', или все совпадения были отфильтрованы в разделе 'WHERE'. Если вам нужны строки, возвращенные из первой таблицы, независимо от совпадений во втором, вы должны использовать 'LEFT JOIN'. –

+0

'ON idet = ba.id' ваше состояние не соответствует вашим псевдонимам, где« объявление »? вам нужно 'ON ad.id = ba.id' – Mihai

+0

Включены ли исключения для ошибок PDO? – Barmar

ответ

1

Вы не можете использовать псевдоним столбца в ON или WHERE. Он должен быть

ON ad.id = ba.id 

В случае, если есть другие ошибки SQL, вы должны включить исключения PDO:

$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
0

Try путем изменения

INNER JOIN `students` ba 
    ON ad.id = ba.id 
     /*^^^^*/ 
WHERE (ad.firstname LIKE :search OR ad.surname LIKE :search OR ad.class LIKE :search)"); 
    /*^^*/      /*^^*/      /*^^*/ 
+0

idet - это псевдоним в select, все еще не работает – Mihai

+0

он должен быть 'ad.id', а не' ad.idet' – MH2K9

0

Спасибо всем за вашу помощь.

Да Я включил исключения для ошибок PDO. Ошибка не регистрируется. Я пробовал ваши предложения, как указано выше. Ничего не работает.

Когда не используется INNER JOIN, этот код работает как шарм:

public function search($searchterm) 
{ 

    $query = $this->db->prepare(" 
     SELECT 
      id, 
      lid, 
      firstname, 
      surname, 
      socialnr 
     FROM `everybody` 
     WHERE (`firstname` LIKE :search OR `surname` LIKE :search)"); 

    $searchterm = '%' . $searchterm . '%'; 
    $query->bindParam(':search', $searchterm, PDO::PARAM_STR); 

    $query->execute(); 

    while($row = $query->fetch(PDO::FETCH_ASSOC)) { 
     echo $row['id']. ' : '. $row['firstname']. ' '. $row['surname']. ' - '. $row['socialnr']. '<br />'; 
    } 

} 

Разница между кодом в мой первый пост и этот, является отсутствие INNER JOIN. Надеюсь, это поможет кому-нибудь помочь мне понять, почему.

Это правильный подход? Нужно ли мне переосмыслить это и переписать мою функцию? Пожалуйста, консультируйтесь в любом направлении, чтобы помочь мне на правильном пути. Вы очень полезны. Благодарю.

+1

, возможно, обе таблицы имеют столбец firstname или фамилию или классы, поэтому theres ambiguity.Try, указав таблицу name также – Mihai

+1

Я запустил SQL, и он работает. – Per76

Смежные вопросы