Я получаю Call to a member function prepare() on a non-object
ошибке Call to a member function prepare() on a non-object
в моем PHP при использовании PDO для выбора данных, которые были отправлены с помощью вызова AJAX.
Поиск по StackOverflow я нашел много ответов на эту ошибку, но никто не работает, чтобы исправить мою проблему.
Странная часть состоит в том, что другие PHP-файлы используют одни и те же вызовы PDO и работают успешно, но это дает мне только ошибку, отличную от объекта.
Отметим, что соединение PDO идентично другим страницам, где оно работает, поэтому я знаю, что это не вызывает проблемы.
Кроме того, я тестировал, что отправленные данные AJAX принимаются, и это тоже работает.
PHP-код
$mysql_user = "NotTelling"; $mysql_password = "DefinatelyNotThis"; try { $dbh = new PDO("mysql:host=somehost;dbname=somename", $mysql_user, $mysql_password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $username = $_POST['username']; $inPword = $_POST['password']; $lat = $_POST['lat']; $lon = $_POST['lon']; $loggedin = ""; $password_hash = ""; $loggedinstatus = ""; $pts = ""; function getLoginInfo() { $sth = $dbh -> prepare('SELECT pword, loggedin, points FROM login WHERE uname = :uname'); $sth->bindParam(':uname', $username, PDO::PARAM_STR); while($row = $sth->fetch(PDO::FETCH_ASSOC)) { echo $row['pword']; echo $row['loggedin']; echo $row['points']; } $password_hash = $fetch['pword']; $loggedinstatus = $fetch['loggedin']; $pts = $fetch["points"]; if($password_hash === null || $loggedinstatus === null || $pts === null) { die(json_encode(array("message" => "none"))); } else { return "more"; } } function checkLoginCreds() { if(crypt($inPword, $password_hash) === $password_hash) { switch($loggedinstatus) { case "no": $sel = $dbh->prepare("UPDATE login SET loggedin='yes' WHERE uname = ?"); $sel->execute(array($username)); return "AllGood"; break; defaut: return "alreadyin"; break; } } else { return "BadLogin"; } } if(getLoginInfo() === "more") { echo json_encode(array("message" => checkLoginCreds())); } getLoginInfo(); } catch(PDOException $e) { echo $e->getMessage(); file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); }
Наконец, вот вывод, когда я var_dump()
соединение PDO.
object(PDO)#1 (0) {}
Чтобы это сработало, вам нужно использовать глобальную область переменных, описанную здесь: http://php.net/manual/en/language.variables.scope.php
$mysql_user = "NotTelling"; $mysql_password = "DefinatelyNotThis"; try { $dbh = new PDO("mysql:host=somehost;dbname=somename", $mysql_user, $mysql_password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $username = $_POST['username']; $inPword = $_POST['password']; $lat = $_POST['lat']; $lon = $_POST['lon']; $loggedin = ""; $password_hash = ""; $loggedinstatus = ""; $pts = ""; function getLoginInfo() { global $dbh, $username, $password_hash, $loggedinstatus, $pts; $sth = $dbh -> prepare('SELECT pword, loggedin, points FROM login WHERE uname = :uname'); $sth->bindParam(':uname', $username, PDO::PARAM_STR); while($row = $sth->fetch(PDO::FETCH_ASSOC)) { echo $row['pword']; echo $row['loggedin']; echo $row['points']; } $password_hash = $fetch['pword']; $loggedinstatus = $fetch['loggedin']; $pts = $fetch["points"]; if($password_hash === null || $loggedinstatus === null || $pts === null) { die(json_encode(array("message" => "none"))); } else { return "more"; } } function checkLoginCreds() { global $dbh, $inPword, $password_hash, $loggedinstatus, $username; if(crypt($inPword, $password_hash) === $password_hash) { switch($loggedinstatus) { case "no": $sel = $dbh->prepare("UPDATE login SET loggedin='yes' WHERE uname = ?"); $sel->execute(array($username)); return "AllGood"; break; defaut: return "alreadyin"; break; } } else { return "BadLogin"; } } if(getLoginInfo() === "more") { echo json_encode(array("message" => checkLoginCreds())); } getLoginInfo(); } catch(PDOException $e) { echo $e->getMessage(); file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); }
Но это может стать очень грязным.
Я предлагаю вам поместить переменные в массив или использовать ООП для более надежного решения: http://php.net/manual/en/language.oop5.php
Так вы можете определить его в классе.
class someClass { private $db; public function __construct(){ $this->dbconnect(); } private function dbconnect() { try { //try connection $dbh = new PDO('mysql:host=localhost;dbname=somenane', 'usernane', 'pass'); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->dbh = $dbh; } catch (Exception $e) { //connection failed die("Oh no! It seems we took too long to respond"); } } public function getLoginInfo() { $sth = $this->dbh->prepare('SELECT pword, loggedin, points FROM login WHERE uname = :uname'); $sth->bindParam(':uname', $username, PDO::PARAM_STR); //cont the code } }
Не уверен, что это достаточно хорошо. Но это сработает.