laravel connector.php,[李景山php]每天laravel-20161120|MySqlConnector.php

这篇博客详细解析了Laravel框架下MySQL数据库连接的内部实现。从`MySqlConnector`类的扩展和实现开始,讲解了如何通过`connect()`方法建立数据库连接,包括获取DSN、PDO选项、创建连接实例以及设置数据库名、字符集和时区。此外,还介绍了如何根据配置设置SQL模式,确保数据操作的正确性和一致性。
摘要由CSDN通过智能技术生成

namespace Illuminate\Database\Connectors;

use PDO;

// this is mysql connection class

class MySqlConnector extends Connector implements ConnectorInterface

{// extends adn implements make class become more powerful

// this is mysql connection

/**

* Establish a database connection.

*

* @param  array  $config

* @return \PDO

*/

public function connect(array $config)

{// Establish a database connection

$dsn = $this->getDsn($config);// first to get the dsn string

$options = $this->getOptions($config);// second ,get the options

// We need to grab the PDO options that should be used while making the brand

// new connection instance. The PDO options control various aspects of the

// connection‘s behavior, and some might be specified by the developers.

$connection = $this->createConnection($dsn, $config, $options);

// we need to grab the pdo options that should be bused while making the brand new connection instance.

// The PDO options control various aspects of connections‘s behavior,and some might be specified by the developers.

if (isset($config[‘unix_socket‘])) {

$connection->exec("use `{$config[‘database‘]}`;");

}// set the unix_socket

$collation = $config[‘collation‘];//set the collation

// Next we will set the "names" and "collation" on the clients connections so

// a correct character set will be used by this client. The collation also

// is set on the server but needs to be set here on this client objects.

$charset = $config[‘charset‘];

// Next we will set the "names" and "collation" on the clients connections so a correct char

$names = "set names ‘$charset‘".

(! is_null($collation) ? " collate ‘$collation‘" : ‘‘);

$connection->prepare($names)->execute();

// Next, we will check to see if a timezone has been specified in this config

// and if it has we will issue a statement to modify the timezone with the

// database. Setting this DB timezone is an optional configuration item.

if (isset($config[‘timezone‘])) {

$connection->prepare(

‘set time_zone="‘.$config[‘timezone‘].‘"‘

)->execute();

}// database name charset and timezone

$this->setModes($connection, $config);// set the mode

return $connection;

}// just return the connection

/**

* Create a DSN string from a configuration.

*

* Chooses socket or host/port based on the ‘unix_socket‘ config value.

*

* @param  array   $config

* @return string

*/

protected function getDsn(array $config)

{

return $this->configHasSocket($config) ? $this->getSocketDsn($config) : $this->getHostDsn($config);

}// create a dsn string from a configuration

/**

* Determine if the given configuration array has a UNIX socket value.

*

* @param  array  $config

* @return bool

*/

protected function configHasSocket(array $config)

{

return isset($config[‘unix_socket‘]) && ! empty($config[‘unix_socket‘]);

}

/**

* Get the DSN string for a socket configuration.

*

* @param  array  $config

* @return string

*/

protected function getSocketDsn(array $config)

{

return "mysql:unix_socket={$config[‘unix_socket‘]};dbname={$config[‘database‘]}";

}

/**

* Get the DSN string for a host / port configuration.

*

* @param  array  $config

* @return string

*/

protected function getHostDsn(array $config)

{

extract($config, EXTR_SKIP);

return isset($port)

? "mysql:host={$host};port={$port};dbname={$database}"

: "mysql:host={$host};dbname={$database}";

}

/**

* Set the modes for the connection.

*

* @param  \PDO  $connection

* @param  array  $config

* @return void

*/

protected function setModes(PDO $connection, array $config)

{// set te session sql_mode in this hash mode

if (isset($config[‘modes‘])) {

$modes = implode(‘,‘, $config[‘modes‘]);

$connection->prepare("set session sql_mode=‘".$modes."‘")->execute();

} elseif (isset($config[‘strict‘])) {

if ($config[‘strict‘]) {

$connection->prepare("set session sql_mode=‘ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION‘")->execute();

} else {

$connection->prepare("set session sql_mode=‘NO_ENGINE_SUBSTITUTION‘")->execute();

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值