Все верно объснили, но никто не написал, как сделать правильно.
Единственным правильным вариантом использования такой функции будет что-то вроде
function getСolumn( $db, $sql, $params = null) {
$stmnt = $db->prepare( $sql );
$stmnt->execute($params);
return $stmnt->fetchAll( PDO::FETCH_COLUMN);
}
print_r( getColumn( $db, 'SELECT category_name FROM categories') );
Или, в еще более генерализованном варианте,
function query( $db, $sql, $params = null) {
$stmt = $db->prepare( $sql );
$stmt->execute($params);
return $stmt;
}
print_r( query( $db, 'SELECT category_name FROM categories')->fetchAll( PDO::FETCH_COLUMN) );
Я
настоятельно не рекомендую заниматься экономией на спичках и пытаться скостить себе написание двух SQL операторов. Мало того, что надпись вида getNames( $db, 'categories', 'category_name' ) сторонний человек не поймет без того чтобы заглянуть в описание функции, мало того, что такое написание вызывает ложное чувство безопасности. Но, главное, запрос без параметров очень редко когда бывает нужен, и такая функция большую часть времени просто не будет использоваться.
SQL - это гениальное изобретение, позволяющее буквально в нескольких словах описать сложнейшие операции с данными. Не надо считать себя самым умным и пытаться "улучшить" SQL, сократив его до лексикона Эллочки-людоедки.
Код подключения также надо поменять, поскольку возвращать
строку из функуции, которая должна возвращать объект - это какая-то бессмыслица, чтобы не сказать еще хуже.
Вот допустим у нас подключение не удалось. Мы пытаемся использоватьс строку с ошибкой в качество объекта ПДО и... что?
Не нужно вообще ловить исключения PDO. Они прекрасно могут сообщить о себе сами.
function dbConnect($dsn, $user, $password) {
return new PDO( $dsn, $user, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] );
}