Я получаю следующую ошибку при загрузке моей страницы индекса:
Неустранимая ошибка: вызов функции-члена 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;
}
библиотеки mysql, кажется, интерпретируют localhost
Это означает, что вы хотите подключиться через сокет Unix. ваша ошибка указывает, что ваш mysqld не настроен на прием соединений с сокетом Unix.
вместо этого, чтобы подключиться через tcp / ip, измените define("DB_HOST", "localhost");
в define("DB_HOST", "127.0.0.1");
Других решений пока нет …