1 <?php
2 3 4 5 6 7
8
9 namespace Cross\DB\Connecter;
10
11 use Cross\Exception\CoreException;
12 use Exception;
13 use PDO;
14
15 16 17 18 19
20 class MySQLConnecter extends BaseConnecter
21 {
22 23 24 25 26
27 private static $instance;
28
29 30 31 32 33 34 35 36 37 38 39 40 41
42 private static $options = array(
43 PDO::ATTR_PERSISTENT => false,
44 PDO::ATTR_EMULATE_PREPARES => false,
45 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
46 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
47 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
48 );
49
50 51 52 53 54 55 56 57 58
59 private function __construct($dsn, $user, $password, array $options = array())
60 {
61 try {
62 $this->pdo = new PDO($dsn, $user, $password, parent::getOptions(self::$options, $options));
63 } catch (Exception $e) {
64 throw new CoreException($e->getMessage());
65 }
66 }
67
68 69 70 71 72 73 74 75 76 77
78 static function getInstance($dsn, $user, $password, array $option = array())
79 {
80
81 $key = md5($dsn);
82 if (!isset(self::$instance[$key])) {
83 self::$instance [$key] = new self($dsn, $user, $password, $option);
84 }
85
86 return self::$instance [$key];
87 }
88
89 90 91 92 93
94 public function getPDO()
95 {
96 return $this->pdo;
97 }
98
99 100 101 102 103 104
105 public function getPK($table)
106 {
107 $table_info = $this->getMetaData($table, false);
108 foreach ($table_info as $ti) {
109 if ($ti['Extra'] == 'auto_increment') {
110 return $ti['Field'];
111 }
112 }
113
114 return false;
115 }
116
117 118 119 120 121
122 function lastInsertId()
123 {
124 return $this->pdo->lastInsertId();
125 }
126
127 128 129 130 131 132 133
134 function getMetaData($table, $fields_map = true)
135 {
136 $data = $this->pdo->query("DESCRIBE {$table}");
137 try {
138 if ($fields_map) {
139 $result = array();
140 $data->fetchAll(PDO::FETCH_FUNC, function ($field, $type, $null, $key, $default, $extra) use (&$result) {
141 $result[$field] = array(
142 'primary' => $key == 'PRI',
143 'auto_increment' => $extra == 'auto_increment',
144 'default_value' => strval($default),
145 'not_null' => $null == 'NO',
146 );
147 });
148 return $result;
149 } else {
150 return $data->fetchAll(PDO::FETCH_ASSOC);
151 }
152 } catch (Exception $e) {
153 return array();
154 }
155 }
156 }
157