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;
		}



Как это понимать и что с этим делать?
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Плейсхолдерами можно заменять только значения. Ключевые слова SQL, названия баз, таблиц и колонок плейсхолдерами не заменяются.
Ответ написан
Poznakomlus
@Poznakomlus
Программист: php, js, go
https://www.php.net/manual/ru/pdo.prepare.php
Псевдопеременные должны представлять только единичный объем данных. Не часть значения, ни служебное слово, ни имя поля, ни какую либо произвольную часть запроса. К примеру, вы не можете связать псевдопеременную с несколькими значениями для вставки в конструкцию IN().
Ответ написан
@FanatPHP
Чебуратор тега PHP
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 возвратило"
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
23 окт. 2020, в 11:53
240000 руб./за проект
23 окт. 2020, в 11:50
3000 руб./за проект
23 окт. 2020, в 11:48
3000 руб./за проект