PHP连接MySQL报错:SQLSTATE[HY000] [2002] Can t connect to local

 更新时间:2016年11月25日 16:34  点击:2011
如果你在使用PHP连接MySQL报错:SQLSTATE[HY000] [2002] Cant connect to local MySQL server through socket MySQL (2)错误的话可以和小编一起来看如何处理这个连接错误问题。

如下所示,PHP连接MySQL报错:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket 'MySQL' (2)

测试代码如下:

<?php
try
{
 $dsn = 'mysql:dbname=php-note;host=localhost;port=3306;charset=utf8';
 $username = 'root';
 $password = 'root';
 new PDO( $dsn, $username, $password);
}
catch (\PDOException $e)
{
 echo $e->getMessage();
}

【解决方案】

把 host=localhost 改为 host=127.0.0.1 即可!
 
 
连接Mysql提示Can’t connect to local MySQL server through socket的解决方法
 
mysql,Mysqldump,Mysqladmin,php连接mysql服务常会提示下面错误:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
这是由于修改mysql服务的了socket文件mysql.sock位置,而导致无法通过mysql socket文件连接到mysql服务引起的,具体解决办法如下:

1、查看mysql服务的socket文件位置:

mysql socket文件的位置是在/etc/my.cnf中设置的,cat /etc/my.cnf内容如下:
[mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
user=mysql
其中socket等于的路径就是socket文件的位置,我们只要修改my.cnf文件,告诉mysql,mysqldump,mysqladmin mysql服务的socket位置在哪里就可以。

2、修改my.cnf文件:

在/etc/my.cnf文件中添加如下内容,并重启mysqls服务,即可解决mysql,mysqldump,mysqladmin的“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”问题:
[mysqld]
datadir=/storage/db/mysql
socket=/storage/db/mysql/mysql.sock
[mysql]
socket=/storage/db/mysql/mysql.sock
[mysqldump]
socket=/storage/db/mysql/mysql.sock
[mysqladmin]
socket=/storage/db/mysql/mysql.sock

3、php连接mysql服务提示"Can't connect to local MySQL server through socket..."的解决方法

有时候mysql服务正常运行,用户名密码也完全正确,使用php的mysql_connect函数却连接不了mysql,调用php的mysql_error()函数提示“Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'”,这是我们需要修改/etc/php.ini文件。
在/etc/php.ini文件中"[MySQL]"项下找到"mysql.default_socket",并设置其值指向正确的mysql服务socket文件即可,如:
[MySQL]
...省略n行...
mysql.default_socket = "/storage/db/mysql/mysql.sock"

4、python连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:

在连接mysql数据库函数中指定socket文件,如下:
#!/usr/bin/python
from MySQLdb import connect
conn = connect(db="pzy", user="root", host="localhost", unix_socket="/storage/db/mysql/mysql.sock")
cur = conn.cursor()
count=cur.execute("show databases")
print 'there has %s dbs' % count
conn.commit()
conn.close()

5、php pdo连接mysql提示"Can't connect to local MySQL server through socket..."的解决方法:


同样在连接字符串添加mysql socket文件的位置即可,如下:
<?php
$dsn = "mysql:host=localhost;dbname=pzy;unix_socket=/storage/db/mysql/mysql.sock";
$db = new PDO($dsn, 'root', '');
$rs = $db->query("SELECT * FROM qrtest");
while($row = $rs->fetch()){
    print_r($row);
}
?>

本文章来为各位介绍一篇关于 Eloquent ORM 概述、模型定义及基本查询详解,希望此文章能够给各位带来帮助哦。

1、引子

在正式进入本节的之前,让我们先来看看什么是ORM。

ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可。

ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper,ActiveRecord 尤其流行,在很多框架中都能看到它的身影。两者的区别主要在于 ActiveRecord 中模型与数据表一一对应,而 DataMapper 中模型与数据表是完全分离的。

Laravel 中的 Eloquent ORM 使用的也是 ActiveRecord 实现方式,每一个 Eloquent 模型类对应着数据库中的一张表,我们通过调用模型类的相应方法实现对数据库的增删改查。

2、定义模型

2.1 创建模型

我们使用Artisan命令make:model生成模型类,模型类默认位于app目录下,我们也可以在创建时指定生成目录:

php artisan make:model Models/Post

这样就会在app目录下生成一个Models目录,并且在Models目录下生成一个Post模型类。Laravel 中所有模型类继承自Illuminate\Database\Eloquent\Model类。

2.2 指定表名

如果不手动指定,默认Post对应的数据表为posts,以此类推。也可以通过设置$table属性自定义表名:

public $table = 'posts';

2.3 指定主键

Eloquent默认数据表主键为id,当然也可以通过设置$primaryKey属性来自定义主键:

public $primaryKey = 'id';

2.4 时间戳设置

默认情况下,Eloquent模型类会自动管理时间戳列create_at和update_at(如果定义迁移时设置了这两列的话),如果要取消自动管理,可以设置$timestamps属性为false:

public $timestamps = false;

还有,如果你想要设置时间戳的格式,可以使用$dateFormat属性,该属性决定了日期时间以何种格式存入数据库,以及以何种格式显示:

//设置日期时间格式为Unix时间戳
protected $dateFormat = 'U';

更多关于日期时间格式设置,请参考php官方函数date中format部分。

3、查询数据

3.1 获取多个模型

我们可以使用Eloquent模型上的all方法获取所有模型实例,比如我们通过如下方法获取所有文章:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use App\Models\Post;

class TestController extends Controller
{

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {

        //获取多个Eloquent模型
        $posts = Post::all();
        dd($posts);

    }
}

可见输出结果是模型数组集合,每一个$items元素对应一个Post模型实例。

此外,需要了解的是每一个Eloquent模型本身都是一个查询构建器,所有我们可以调用所有查询构建器上的方法,只不过第一个方法调用都要使用静态方法调用:

$posts = Post::where('id','<',3)->orderBy('id','desc')->take(1)->get();
dd($posts);

 

也许你已经注意到了,模型查询返回结果都是Illuminate\Database\Eloquent\Collection的一个实例,该类实现了ArrayAccess接口,所以我们可以像访问数组一样访问该实例,此外,该Collection类还提供了很多其它有用的方法对查询结果进行处理,详见源码。

既然Eloquent模型是查询构建器,自然也支持分组块获取数据:

Post::chunk(2,function($posts){
    foreach ($posts as $post) {
        echo $post->title.'<br>';
    }
});

输出结果如下:

test 1
test 2
test 3

3.2 获取单个模型

可以使用查询构建器方法获取单个模型实例:

$post = Post::where('id',1)->first();
dd($post);

当然也可以通过Eloquent模型类提供的快捷方法find:

$post = Post::find(1);

 

如果没有找到对应的表记录,会输出null,如果我们想要捕获查询结果为空的异常并进行处理,比如跳转到404页面,可以使用findOrFail或者firstOrFail方法,如果表记录存在,两者返回获取到的第一条记录,否则抛出Illuminate\Database\Eloquent\ModelNotFoundException异常。

3.3 聚合函数查询

如果要对查询结果进行计数、统计、最大值/最小值、平均数等聚合运算,可以使用查询构建器上的对应方法,我们我们查询文章总数:

$count = Post::where('id','>',0)->count();
echo $count;
输出结果为3,又或者我们想要获取文章最大阅读数:

$views = Post::where('id','>',0)->max('views');
echo $views;
输出结果为800。

本文章来为各位介绍一篇关于Laravel使用查询构建器实现对数据库(分组 联合 分页 排序)的例子,希望此例子能够对各位带来帮助。


1、连接查询(join)

连接查询指的是将两张表或多张表关联到一起进行查询,获取一个表的行与另一个表的行匹配的数据。常见的连接查询包括内连接(等值连接)、左(外)连接、右(外)连接和交叉连接(完全连接)等。下面这张图形象的展示了这几种连接查询所获取的结果集:

SQL连接查询

下面我们简单演示下内连接和左连接。我们将用户表users和文章表posts关联到一起进行查询,在此之前,我们先创建posts表,其字段及初始值如下:

文章表posts

其中user_id对应users表中的用户id。

1.1 内连接

内连接用于获取两张表结果集的交集部分,我们可以使用查询构建器的join方法进行内连接查询:

$users = DB::table('users')->join('posts','users.id','=','posts.user_id')->get();
dd($users);


1.2 左连接

左连接的结果集指定的左表的所有行,如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。我们使用查询构建器的leftJoin方法进行左连接查询:

$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get();
dd($users);

对应的输出结果为:

left join 查询结果

1.3 更加复杂的连接查询

很多时候,连接查询的查询条件往往更为复杂,并不是一个简单的join/leftJoin方法就能搞定的,那么我们如何添加更加复杂的查询条件呢?使用JoinClause代替条件参数:

$users = DB::table('users')->join('posts',function($join){
    $join->on('users.id','=','posts.user_id')
         ->where('posts.id','>',1);
})->get();
dd($users);

 

2、联合查询(union)

联合查询用于将两个或更多查询的结果集组合为单个结果集,该结果集包含联合查询中所有查询的全部行。UNION的结果集列名与UNION运算符中第一个Select语句的结果集的列名相同,另一个Select语句的结果集列名将被忽略,且其他查询字段数必须和第一个相同。Laravel查询构建器中我们使用union方法进行联合查询:

$users = DB::table('users')->where('id','<',3);
$users = DB::table('users')->where('id','>',2)->union($users)->get();
dd($users);


3、where子句

使用查询构建器上的where方法可以添加自定义查询条件,调用该方法需要传入三个参数:第一个列名,第二个是操作符,第三个是比较值:

$user = DB::table('users')->where('name','=','Laravel')->get();
dd($user);

如果操作符为“=”,该语句也可简化为:

$user = DB::table('users')->where('name','Laravel')->get();

 

需要注意的是查询构建器支持方法链,这意味着如果有多个查询条件且这个多个条件是AND连接,可以在get之前使用多个where方法。如果多个条件使用OR连接,可以使用orWhere方法:

$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();


更多where子句查询条件可查看Illuminate\Database\Query\Builder源码。

4、排序

查询构建器使用orderBy方法对查询结果进行排序:

$users = DB::table('users')->orderBy('id','desc')->get();
dd($users);

根据代码可以看到orderBy方法需要传入两个参数,第一个是排序字段,第二个是排序方向,asc代表升序,desc代表倒序,上述代码输出为:


5、分组

为了更好地演示分组,我们给数据表posts新增两个字段:cat_id和views,代表分类ID和浏览数:

posts表新增分类ID和浏览数

分组一般用于聚合查询,接下来我们使用groupBy方法对查询结果进行分组,比如我们可以统计每个分类下有几篇文章:

$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get();
dd($posts);

 

我们还可以使用having方法为分组加上条件,比如我们可以统计总浏览数大于500的分类:

$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get();
dd($posts);

输出结果为:

加条件的分组查询结果

注意:having中的条件字段必须出现在select查询字段中,否则会报错。

6、分页

查询构建器中使用skip和take对查询结果进行分页,相当于SQL语句中的limit语句:

$posts = DB::table('posts')->skip(0)->take(2)->get();
dd($posts);

本文章来为各位介绍一篇Laravel对数据库增删改查的例子了,这个是基于查询构建器来实现了,具体的如下所示。

获取查询构建器很简单,还是要依赖DB门面,我们使用DB门面的table方法,传入表名,即可获取该表的查询构建器:

$users = DB::table('users');

这样我们就获取到了$users表的查询构建器,实际上,底层返回的是Illuminate\Database\Query\Builder的实例,我们对查询构建器的所有操作都是调用该实例对应类上的方法。下面我们就列举查询构建器的一些常用方法,我们还是沿用上一节创建的$users表做演示说明 。

1、新增数据

使用查询构建器的insert方法即可插入一条/多条数据:

DB::table('users')->insert([
    ['id'=>1,'name'=>'Laravel','email'=>'laravel@test.com','password'=>'123'],
    ['id'=>2,'name'=>'Academy','email'=>'academy@test.com','password'=>'123'],
    ['id'=>3,'name'=>'LaravelAcademy','email'=>'laravel-academy@test.com','password'=>'123']
]);

执行成功后即可在数据表$users中插入三条记录。有时候,我们需要插入记录后获取自增ID,可以使用insertGetId方法:

$insertId = DB::table('users')->insertGetId(
    ['name'=>'Laravel-Academy','email'=>'laravelacademy@test.com','password'=>'456']
);

2、更新数据


更新表记录很简单,使用查询构建器的update方法即可:

$affected = DB::table('users')->where('name','Laravel-Academy')->update(['password'=>'123']);
该方法返回受影响的函数。

3、删除数据

使用delete方法删除表记录,删除方法和更新方法类似,返回被删除的行数:

$deleted = DB::table('users')->where('id', '>', 3)->delete();

如果我们是要删除整个数据表数据,则略去where条件,如果是要清空数据表还要将自增ID置为0,可以使用truncate方法:

DB::table('users')->truncate();

4、基本查询

4.1 获取所有表记录

使用get方法即可获取一张表的所有记录:

$users = DB::table('users')->get();
dd($users);

 

如果是获取指定列的数据,则需要加上select条件:

$users = DB::table('users')->select('name','email')->get();
dd($users);

 

4.2 获取单条记录

获取单条记录需要在查询基础上加上first方法:

$user = DB::table('users')->where('name','Laravel')->first();
dd($user);

 

4.3 分组块获取数据

如果数据库包含多条数据,则一次性获取会极大影响性能,对应地,我们可以调用chunk方法分组块获取数据:

DB::table('users')->chunk(2,function($users){
    foreach($users as $user){
        // if($user->name=='LaravelAcademy')
            // return false;
        echo $user->name.'<br>';
    }
});

这里我们指定每次取两条记录。注释部分的意思是我们可以设定查询退出条件,当达到该条件时,查询退出,不再往下执行。

4.4 获取单列的值

上述方法获取的查询结果都是对象实例/对象实例数组,有时候,我们只是想简单获取单列的值,遍历数组获取指定列的值太麻烦,可以使用lists方法获取列值数组:

$users = DB::table('users')->lists('name');
dd($users);

 

这样我们就可以免去遍历对象数组的麻烦。

4.5 原生表达式

此外,查询构建器还支持原生表达式,我们需要调用DB门面的raw方法来实现:

$users = DB::table('users')->select(DB::raw('name,email'))->where('id','<',3)->get();
dd($users);

如何使用查询构建器实现对数据库的高级查询?比如join、union、添加自定义where条件、排序、分组、分页后面会有介绍。

[!--infotagslink--]

相关文章