Php PDO致命错误:对非对象(使用类)调用成员函数prepare()

Php PDO致命错误:对非对象(使用类)调用成员函数prepare(),php,mysql,pdo,mamp,unix-socket,Php,Mysql,Pdo,Mamp,Unix Socket,加载索引页时,我收到以下错误: 致命错误:在第32行的/Applications/MAMP/htdocs/parse/helloworld/helloworld/libraries/Database.php中对非对象调用成员函数prepare() 我将把所有相关的代码放在下面,很抱歉篇幅太长,但阅读起来应该相当直接。简短的版本是我正在练习PDO和PHP类,所以我正在重新制作一个我在另一台机器上的现有项目。(这就是为什么索引文件中有很多调用,它们更像控制器) 我在这里把头发拔出来,因为它在我的另一

加载索引页时,我收到以下错误:

致命错误:在第32行的/Applications/MAMP/htdocs/parse/helloworld/helloworld/libraries/Database.php中对非对象调用成员函数prepare()

我将把所有相关的代码放在下面,很抱歉篇幅太长,但阅读起来应该相当直接。简短的版本是我正在练习PDO和PHP类,所以我正在重新制作一个我在另一台机器上的现有项目。(这就是为什么索引文件中有很多调用,它们更像控制器)

我在这里把头发拔出来,因为它在我的另一台机器上工作,从我可以看出这两个项目是相同的。。。我刚刚得到这个错误。我在以前的项目中有这个,但那是因为我在配置文件中拼错了数据库。。。我100%肯定我没有再这样做了,但我不知道我还错过了什么——很明显,如果我var_dump它返回null,就不会生成PDO类。。。任何和所有的帮助都将不胜感激(特别是如果是关于我的PDO课程风格,我只是在关注一个博客,当它起作用时似乎是有意义的)

编辑: 经过一些调试后,很明显数据库类中的try块失败了,因为无法建立连接。运行返回的
$This->error=$e->getMessage()
后,这一点很清楚:

字符串(119)“SQLSTATE[HY000][2002]无法通过socket'/Applications/MAMP/tmp/MySQL/MySQL.sock'(2)连接到本地MySQL服务器”

正如下面已接受的答案所述,该错误表示localhost试图通过unix套接字进行连接,而mysqld无法接受unix套接字连接

因此,最初的错误导致了一个终极问题:当mysqld不接受unix套接字连接和/或为什么mysqld不接受unix套接字连接时,如何连接到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);
}
为了简洁起见(这一点可能远远不够,我将只显示我加载的一个类,以证明我正在构建db(类型、post、组、跟随者、模板…)


mysql库似乎将
localhost
解释为您希望通过unix套接字进行连接。您的错误表明您的mysqld未设置为接受unix套接字连接


要改为通过tcp/ip连接,请将
define(“DB_主机”、“localhost”)
更改为
define(“DB_主机”、“127.0.0.1”)
mysql库似乎将
localhost
解释为您希望通过unix套接字连接。您的错误表明您的mysqld未设置为接受unix套接字连接


要改为通过tcp/ip连接,请将
define(“DB\U主机”、“本地主机”);
更改为
define(“DB\U主机”、“127.0.0.1”)发生这种情况时,
$this->error
中是否有任何内容?
可能重复@Barmar,它只是从catch块中吐出NULL,因此与该错误相关的问题很多:连接到“127.0.0.1”而不是“localhost”
$this->error
中是否有任何内容发生这种情况?可能重复@Barmar it只是spits out NULL从catch blockSO有很多问题与该错误相关:连接到“127.0.0.1”而不是“localhost”,谢谢你的工作!你能解释一下为什么/你的逻辑吗?从错误中你知道mysqld没有设置为接受unix套接字连接…你怎么知道转到tcp/ip?两者之间的区别是什么two?MySQL实际上只有两个选项—unix套接字或tcp/ip。现在的默认安装只侦听tcp/ip。当您指定
localhost
作为地址时,PHP库默认尝试通过unix套接字进行连接,并且您使用的是unix类型的操作系统(您似乎在OSX上)。至于区别-套接字是同一台机器上的进程间连接,tcp/ip允许通过网络进行连接。套接字可能有一点速度优势,但我怀疑您是否注意到了。非常感谢您的帮助!您能解释一下为什么/您的逻辑吗?从错误中您知道mysqld没有设置为接受unix套接字c连接…你怎么知道使用tcp/ip?两者之间有什么区别?MySQL实际上只有两个选项-unix套接字,或tcp/ip。现在默认安装只侦听tcp/ip。当你指定
localhost
作为地址时,PHP库默认尝试通过unix套接字连接,然后你就打开了unix类型的操作系统(你似乎在OSX上)。至于区别——套接字是同一台机器上的进程间连接,tcp/ip允许通过网络进行连接。套接字可能有一点速度优势,但我怀疑你是否注意到了这一点。
<?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;
}