Создание класса базы данных PHP PDO, проблемы с ООП

это мой текущий класс базы данных:

class Database { private $db; function Connect() { $db_host = "localhost"; $db_name = "database1"; $db_user = "root"; $db_pass = "root"; try { $this->db = new PDO("mysql:host=" . $db_host . ";dbname=" . $db_name, $db_user, $db_pass); } catch(PDOException $e) { die($e); } } public function getColumn($tableName, $unknownColumnName, $columnOneName, $columnOneValue, $columnTwoName = "1", $columnTwoValue = "1") { $stmt = $this->db->query("SELECT $tableName FROM $unknownColumnName WHERE $columnOneName='$columnOneValue' AND $columnTwoName='$columnTwoValue'"); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); return $results[0][$unknownColumnName]; } } 

Я пытаюсь запустить его, используя следующий код:

 $db = new Database(); $db->Connect(); echo $db->getColumn("Sessions", "token", "uid", 1); 

И я получаю следующую ошибку:

PHP Неустранимая ошибка: вызов функции-члена fetchAll () для не-объекта в /Users/RETRACTED/RETRACTED/root/includes/Database.php в строке 19

Любая идея, что случилось? благодаря

  1. Эта функция подвержена SQL-инъекции .
  2. Эта функция не позволит вам получить столбец, используя даже простейшее условие ИЛИ .
  3. Эта функция делает нечитаемую тарабарщину из почти естественного английского языка SQL .

Послушай, ты даже испортил себе эту самую функцию. Как вы предполагаете, что он будет использоваться для ежедневного кодирования? По сути, эта функция делает ваш опыт сложнее, чем с необработанным PDO – вам нужно изучить все новые синтаксисы, многочисленные исключения и исправления в последнюю минуту.

Пожалуйста, вернитесь к необработанному PDO!

Позвольте мне показать вам правильный путь

 public function getColumn($sql, $params) { $stmt = $this->db->prepare($sql); $stmt->execute($params); return $stmt->fetchColumn(); } 

используется так

 echo $db->getColumn("SELECT token FROM Sessions WHERE uid = ?", array(1)); 

Таким образом, вы сможете использовать всю мощь SQL, не ограничиваясь глупым подмножеством, а также безопасность подготовленных операторов , но при этом сохраняйте свой код понятным.
Показывая его по-прежнему в одной строке – это было ваше первоначальное (и очень правильное!) Намерение.

это означает, что ваша переменная $ stmt не возвращает объект PDOStatement. ваш запрос терпит неудачу, поскольку PDO :: query возвращает PDOStatement или False при ошибке.

Используйте fetch вместо fetchAll .., это будет легко в вашем случае

 $results = $stmt->fetchAll(PDO::FETCH_ASSOC); return $results[0][$unknownColumnName]; 

Это будет

 $results = $stmt->fetch(PDO::FETCH_ASSOC); return $results[$unknownColumnName];