Как работает левое соединение при использовании инициализированного подготовленного оператора для MySQLI? - PullRequest
0 голосов
/ 11 июня 2009

Пользователь заходит на эту страницу с другой страницы, где он щелкает ссылку, к ней добавляется ?photo_id=, а затем номер идентификатора. Я хочу, чтобы определенная информация была доступна зрителю, когда он прибудет на эту страницу.

Я хочу, чтобы они могли видеть фотографию, имя фотографии и имя фотографа. Первые два не проблема, потому что photo_id, photo_filename и photo_title находятся в одной таблице. Как только я пытаюсь получить информацию об этой фотографии, которая находится на другом столе под названием photographers, именно тогда у меня возникают проблемы.

Вот мой код:

$sql = 'SELECT photos.photo_id, photos.photo_title, photos.photo_filename, photos.photographer_id, photographers.photographer_id, photographers.photographer_name
       FROM photos
       LEFT JOIN photographers ON photos.photographer_id = photographers.photographer_id
       WHERE photo_id = ?';

//initialize prepared statement
$stmt = $conn->stmt_init(); 
if ($stmt->prepare($sql)) { 
  $stmt->bind_param('i', $_GET['photo_id']); 
  $stmt->bind_result($photo_id, $photo_title, $photo_filename, $photographer_id); 
  $OK = $stmt->execute(); 
  $stmt->fetch();
}

Первые три переменные ($photo_id, $photo_title и $photo_filename) работают нормально, и я могу отобразить их на своей странице, но другие переменные, которые я добавил из LEFTJOIN, такие как photographers.photographer_id и photographers.photographer_name из другой таблицы работать не будет. Как известно, страница полностью разрывается, когда я добавляю дополнительные имена столбцов в строке SELECT.

У меня такое ощущение, что это связано с количеством переменных в функции bind_result(). Я думаю, что они должны соответствовать количеству столбцов, упомянутых в строке SELECT, но я не хочу создавать переменную для каждого.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 11 июня 2009

Что сказал @BipedalShark, плюс ...: поскольку вы делаете LEFT JOIN, это должно означать, что вы готовы к фотографиям, фотограф которых неизвестен или отсутствует в таблице фотографа (*) - но в этом случае столбцы, которые вы SELECT извлекаете из этой таблицы будет NULL. Может быть, вы хотите COALESCE их в вашем SQL? Или, может быть, вы на самом деле имеете в виду INNER JOIN ...? Просто проверяю!

(*) это то, что LEFT JOIN означает - это внешнее соединение, гарантирующее получение всех строк из левой таблицы, которые соответствуют WHERE, даже когда нет соответствующая строка в правой таблице

0 голосов
/ 11 июня 2009

Как вы упомянули, вы выбираете шесть столбцов, но связываете только первые четыре. Если вам не нужны все шесть столбцов, не выбирайте их. Нет необходимости выбирать столбец, к которому вы присоединяетесь, если вы об этом думаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...