Почему вы получили неопределенный ответ, что вы не используете присоединенную строку для выполнения.
$stmt = $pdo->prepare('SELECT * FROM Customer LEFT JOIN Address USING (AddressID)');
$stmt->execute();
Этот код, приведенный выше, позволяет получить ваш присоединенный код, а затем мгновенно перезаписать $ stmt новым, в котором нет объединенных данных.
Удалить эти 2 строки кода.
$stmt = $pdo -> prepare('SELECT * FROM Customer');
$stmt -> execute();
И это будет работать.
В качестве дополнительного примечания вы затрудняете чтение кода в методе CustomerRowOutput.
при использовании системы замены переменных в двойных кавычках вы можете использовать массивы. просто заверните их в фигурные скобки {}
Таким образом, ваш текущий синтаксис <tr><td>$cn</td>...</tr>
должен быть <tr><td>{$customerRow['CustomerName']}</td>...</tr>
фигурными скобками, обертывающими массив, подобный этому, который позволит ему выводиться. это также экономит память, так как вы не создаете указатели, чтобы облегчить эхо.
и PHP также поддерживает переводы строк в переменных строкового типа. так что вся функция может стать
function CustomerRowOutput($customerRow){
return "<tr>
<td>{$customerRow['CustomerName']}</td>
<td>{$customerRow['PhoneNo']}</td>
<td>{$customerRow['Email']}</td>
<td>{$customerRow['Street']}</td>
<td>{$customerRow['Postcode']}</td>
<td>{$customerRow['City']}</td>
<td>{$customerRow['Country']}</td>
</tr>";
}