Неустранимая ошибка PDO: вызов функции-члена prepare () для необъекта (с использованием классов)

Я получаю следующую ошибку при загрузке моей страницы индекса:

Неустранимая ошибка: вызов функции-члена prepare () для необъекта в /Applications/MAMP/htdocs/parse/helloworld/helloworld/libraries/Database.php в строке 32

Я поместу весь соответствующий код ниже, извините за длину, но он должен быть довольно простым для чтения. Короткая версия — я практикую классы PDO и PHP, поэтому я переделываю существующий проект, который был у меня на другом компьютере. (именно поэтому в индексном файле много вызовов, которые больше похожи на контроллеры).

Я дергаю себя за волосы, потому что это работает на моей другой машине, и из того, что я могу сказать, два проекта идентичны … Я просто получаю эту ошибку. У меня было это в моем предыдущем проекте, но это было из-за того, что я неправильно написал базу данных в файле конфигурации … Я на 100% уверен, что я не сделал этого снова, но я не знаю, что еще я пропустил — ясно, PDO class не создается, если я var_dump возвращает null … Любая и вся помощь будет принята с благодарностью (особенно если это касается моего стиля класса PDO, я просто слежу за блогом, который, казалось, имел смысл, когда он работал).

РЕДАКТИРОВАТЬ:
После некоторой отладки стало ясно, что в блоке try в классе базы данных произошел сбой, поскольку не удалось установить соединение. Это было ясно после запуска $this->error = $e->getMessage() который вернулся:

string (119) «SQLSTATE [HY000] [2002] Не удается подключиться к локальному серверу MySQL через сокет ‘/Applications/MAMP/tmp/mysql/mysql.sock’ (2)»

Как показано в принятом ответе ниже, ошибка указывает на то, что localhost пытается подключиться через сокет unix, а mysqld не может принимать соединения через сокет unix.

Таким образом, исходная ошибка приводит к окончательному вопросу: как вы подключаетесь к сокету Unix, когда mysqld не принимает соединения с сокетом Unix и / или почему MySQL не принимает соединения с сокетом Unix?

Конец РЕДАКТИРОВАТЬ.

Это мой (соответствующий) класс PDO:

<?php
class Database {
private $host = DB_HOST;
private $user = DB_USER;
private $pass = DB_PASS;
private $dbname = DB_NAME;

private $dbh;
private $error;
private $stmt;

public function __construct() {
// Set DSN
$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
// Set options
$options = array (
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
// Create a new PDO instanace
try {
$this->dbh = new PDO ($dsn, $this->user, $this->pass, $options);
}       // Catch any errors
catch ( PDOException $e ) {
var_dump($dsn);
$this->error = $e->getMessage();
}
}public function query($query) {
$this->stmt = $this->dbh->prepare($query);
}

Это индексный файл, который вызывается

<?php
require('core/init.php');

//Create objects...
$type = new Type;
$post = new Post;
$group = new Group;
$follower = new Follower;

//Create template object
$template = new Template('templates/front.php');

$template->types = $type->getAllTypes();
$template->groups = $group->getAllGroups();
$template->posts = $post->getAllPosts();
$template->replies = $post->getReplies();
$template->followers = $follower->getAllFollowers();

echo $template;

и это другие соответствующие файлы:
конфиг —

<?php

//DB Params
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASS", "root");
define("DB_NAME", "dobbletwo");
define("SITE_TITLE", "Welcome To Dooble!");

в этом —

//include configuration
require_once('config/config.php');

//helper functions
require_once('helpers/photo_helper.php');
require_once('helpers/system_helper.php');//Autoload Classes
function __autoload($class_name){
require_once('libraries/'.$class_name . '.php');
}

для краткости (что может быть далеко зашло на этом этапе, я покажу только один из классов, которые я загружаю, чтобы доказать, что я создаю БД (тип, должность, группа, подписчик, шаблон …)

<?php

class Type {
//Initialize DB variable
public $db;

/*
*   Constructor
*/
public function __construct(){
$this->db = new Database;
}

0

Решение

библиотеки mysql, кажется, интерпретируют localhost Это означает, что вы хотите подключиться через сокет Unix. ваша ошибка указывает, что ваш mysqld не настроен на прием соединений с сокетом Unix.

вместо этого, чтобы подключиться через tcp / ip, измените define("DB_HOST", "localhost"); в define("DB_HOST", "127.0.0.1");

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]