Задать вопрос
vertello77
@vertello77
Боже…

Почему PDO возвращает булеву(false)?

Всем привет! Из интереса занялся PHP, придумал себе проект и пишу, попутно учась.

Есть класс, в нём объявлены публичные переменные ($what, $id и $owner), функции класса и его объекты.
Хочется функцию, чтоб доставала нужную строку из БД по запросу $объект->функция(аргументы). Написал:
spoiler

function getData(string $what, int $id, int $owner) {
			$query = $qpdo->prepare("SELECT :what FROM `table` WHERE `id` = :id AND `owner` = :owner");
			$query->execute(array(':what' => $what, ':id' => $id, ':owner' => $owner));
			$result = $query->fetch(PDO::FETCH_COLUMN);

			return $result;
		}


Для теста вывожу на экран $object->getData('id', 1, 1), а оно выдаёт данные переменной $what (в данном случае это "name").

Примечательно, что если не использовать подготовленные выражения PDO, а внаглую писать переменные прямо в SQL-запросе, то всё работает как надо. Пример работающего кода:
spoiler

function getData(string $what, int $id, int $owner) {
			$query = $qpdo->query("SELECT " . $what . " FROM `table` WHERE `id` = " . $id . " AND `owner` = " . $owner . "");
			$result = $query->fetch(PDO::FETCH_COLUMN);

			return $result;
		}



Как это понимать и что с этим делать?
  • Вопрос задан
  • 124 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Плейсхолдерами можно заменять только значения. Ключевые слова SQL, названия баз, таблиц и колонок плейсхолдерами не заменяются.
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
function getData(string $what, int $id, int $owner) {
      $query = $qpdo->prepare("SELECT * FROM `table` WHERE `id` = :id AND `owner` = :owner");
      $query->execute(array(, ':id' => $id, ':owner' => $owner));
      return $query->fetch()[$what] ?? null;
}


И всегда включать режим выброса исключений в пдо. чтобы потом не стоять в непонятках, "ой мне false возвратило"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы