это мой текущий класс базы данных:
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
Любая идея, что случилось? благодаря
Послушай, ты даже испортил себе эту самую функцию. Как вы предполагаете, что он будет использоваться для ежедневного кодирования? По сути, эта функция делает ваш опыт сложнее, чем с необработанным 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];