Skip to content

Commit e831a6a

Browse files
committed
phpunit tests for secure PDO connection under mySqli, tests and fixes for create and drop table methods for all SQL drivers
1 parent 61be5fa commit e831a6a

File tree

8 files changed

+199
-31
lines changed

8 files changed

+199
-31
lines changed

lib/ez_sql_pdo.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,19 @@ class ezSQL_pdo extends ezSQLcore
4545

4646
private static $isSecure = false;
4747
private static $secure = null;
48+
private $dbh;
4849

4950
/**
5051
* Show errors
5152
* @var boolean Default is true
5253
*/
5354
public $show_errors = true;
5455

55-
protected $preparedValues = array();
56+
protected $preparedValues = array();
5657

5758
/**
58-
* Constructor - allow the user to perform a qucik connect at the same time
59-
* as initialising the ezSQL_sqlite class
59+
* Constructor - allow the user to perform a quick connect at the same time
60+
* as initializing the ezSQL_sqlite class
6061
*
6162
* @param string $dsn The connection parameter string
6263
* Default is empty string
@@ -454,4 +455,12 @@ public function disconnect()
454455
}
455456
} // disconnect
456457

458+
/**
459+
* Get connection handle
460+
*/
461+
public function connection()
462+
{
463+
return $this->dbh;
464+
}
465+
457466
} // ezSQL_pdo

shared/ezFunctions.php

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595

9696
// String SQL data types
9797
const CHAR = 'CHAR';
98-
const VARC = 'VARCHAR';
98+
const VARS = 'VARCHAR';
9999
const VARCHAR = 'VARCHAR';
100100
const TEXT = 'TEXT';
101101
const TINY = 'TINYTEXT';
@@ -127,7 +127,6 @@
127127
const TINYINT = 'TINYINT';
128128
const SMALLINT = 'SMALLINT';
129129
const MEDIUMINT = 'MEDIUMINT';
130-
const LARGE = 'BIGINT';
131130
const BIGINT = 'BIGINT';
132131
const DEC = 'DEC';
133132
const FIXED = 'FIXED';
@@ -138,9 +137,6 @@
138137
const BOOLEANS = 'BOOLEAN';
139138
const SMALLMONEY = 'SMALLMONEY';
140139
const MONEY = 'MONEY';
141-
const SMALLSERIAL = 'SMALLSERIAL';
142-
const SERIAL = 'SERIAL';
143-
const BIGSERIAL = 'BIGSERIAL';
144140

145141
// Date/Time SQL data types
146142
const DATES = 'DATE';
@@ -167,12 +163,17 @@
167163
const INDEX = 'INDEX';
168164
const REFERENCES = 'REFERENCES';
169165

170-
const AUTO = 'AUTO_INCREMENT';
171-
const IDENTITY = 'IDENTITY(1,1)';
166+
const AUTO = '__autoNumbers__';
167+
const AUTO_INCREMENT = 'AUTO_INCREMENT';
168+
const AUTOINCREMENT = 'AUTOINCREMENT';
169+
const IDENTITY = 'IDENTITY';
170+
const SERIAL = 'SERIAL';
171+
const SMALLSERIAL = 'SMALLSERIAL';
172+
const BIGSERIAL = 'BIGSERIAL';
172173

173174
const ADD = 'ADD';
174175
const DROP = 'DROP COLUMN';
175-
const CHANGE = 'CHANGE';
176+
const CHANGE = '__modifyColumn__';
176177

177178
const _DS = \DIRECTORY_SEPARATOR;
178179

shared/ezSchema.php

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ class ezSchema
2626

2727
const NUMERICS = [
2828
'common' => ['NUMERIC', 'DECIMAL'],
29-
'mysql' => ['DEC', 'FIXED', 'FLOAT', 'DOUBLE', 'DOUBLE PRECISION', 'REAL'],
30-
'postgresql' => [],
29+
'mysql' => ['IDENTITY','DEC', 'FIXED', 'FLOAT', 'DOUBLE', 'DOUBLE PRECISION', 'REAL'],
3130
'sqlserver' => ['DEC'],
31+
'postgresql' => [],
3232
'sqlite3' => []
3333
];
3434

@@ -52,10 +52,17 @@ class ezSchema
5252

5353
const OPTIONS = ['CONSTRAINT', 'PRIMARY KEY', 'FOREIGN KEY', 'UNIQUE', 'INDEX', 'REFERENCES'];
5454
const CHANGES = [
55-
'mysql' => ['MODIFY'],
56-
'postgresql' => ['ALTER COLUMN'],
57-
'sqlserver' => ['ALTER COLUMN'],
58-
'sqlite3' => []
55+
'mysql' => 'MODIFY',
56+
'postgresql' => 'ALTER COLUMN',
57+
'sqlserver' => 'ALTER COLUMN',
58+
'sqlite3' => ''
59+
];
60+
61+
const autoNUMBERS = [
62+
'mysql' => 'AUTO_INCREMENT',
63+
'postgresql' => 'SERIAL',
64+
'sqlserver' => 'IDENTITY(1,1)',
65+
'sqlite3' => 'AUTOINCREMENT'
5966
];
6067

6168
private $arguments = null;
@@ -151,13 +158,14 @@ public static function vendor()
151158
elseif ($dbMssql === \getInstance() && !empty($dbMssql))
152159
$type = 'sqlserver';
153160
elseif ($dbPdo === \getInstance() && !empty($dbPdo)) {
154-
if (strpos($dbPdo->getAttribute(\PDO::ATTR_CLIENT_VERSION), 'mysql') !== false)
161+
$dbh = $dbPdo->connection();
162+
if (strpos($dbh->getAttribute(\PDO::ATTR_CLIENT_VERSION), 'mysql') !== false)
155163
$type = 'mysql';
156-
elseif (strpos($dbPdo->getAttribute(\PDO::ATTR_CLIENT_VERSION), 'pgsql') !== false)
164+
elseif (strpos($dbh->getAttribute(\PDO::ATTR_CLIENT_VERSION), 'pgsql') !== false)
157165
$type = 'postgresql';
158-
elseif (strpos($dbPdo->getAttribute(\PDO::ATTR_CLIENT_VERSION), 'sqlite') !== false)
166+
elseif (strpos($dbh->getAttribute(\PDO::ATTR_CLIENT_VERSION), 'sqlite') !== false)
159167
$type = 'sqlite3';
160-
elseif (strpos($dbPdo->getAttribute(\PDO::ATTR_CLIENT_VERSION), 'sqlsrv') !== false)
168+
elseif (strpos($dbh->getAttribute(\PDO::ATTR_CLIENT_VERSION), 'sqlsrv') !== false)
161169
$type = 'sqlserver';
162170
}
163171

@@ -181,6 +189,7 @@ public static function column(string $column = null, string $type = null, ...$ar
181189
if (empty($column) || empty($type))
182190
return false;
183191

192+
$vendor = self::vendor();
184193
$columnData = '';
185194
if (($column == \CONSTRAINT) || ($column == \INDEX)) {
186195
if (empty($args[0]) || empty($args[1])) {
@@ -190,20 +199,25 @@ public static function column(string $column = null, string $type = null, ...$ar
190199
$keyType = ($column != \INDEX) ? \array_shift($args).' ' : ' ';
191200
$keys = $keyType.'('.\to_string($args).'), ';
192201
$columnData .= $column.' '.$type.' '.$keys;
193-
} elseif (($column == \ADD) || ($column == \DROP)) {
202+
} elseif (($column == \ADD) || ($column == \DROP) || ($column == \CHANGE)) {
194203
if ($column != \DROP) {
204+
// check for modify placeholder and replace with vendors
205+
$column = \str_replace(\CHANGE, self::CHANGES[$vendor], $column);
195206
$column = $column.' '.$type;
196207
$type2 = \array_shift($args);
197208
$data = self::datatype($type2, ...$args);
198-
} else
209+
} elseif ($vendor != 'sqlite3')
199210
$data = $type;
200211

201212
if (!empty($data))
202213
$columnData = $column.' '.$data.', ';
203214
} else {
204215
$data = self::datatype($type, ...$args);
205-
if (!empty($data))
216+
if (!empty($data)) {
217+
// check for sequence placeholder and replace with vendors
218+
$data = \str_replace(\AUTO, self::autoNUMBERS[$vendor], $data);
206219
$columnData = $column.' '.$data.', ';
220+
}
207221
}
208222

209223
$schemaColumns = !empty($columnData) ? $columnData : null;

tests/mysqli/ezSQL_mysqliTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -288,9 +288,9 @@ public function testCreate()
288288
$this->object->select(self::TEST_DB_NAME);
289289

290290
$this->assertEquals($this->object->create('new_create_test',
291-
\column('id', INT0, 11, notNULL, AUTO),
292-
\column('create_key', VARCHAR, 50),
293-
\primary('id_pk', 'id')),
291+
column('id', INTR, 11, notNULL, AUTO),
292+
column('create_key', VARCHAR, 50),
293+
primary('id_pk', 'id')),
294294
0);
295295

296296
$this->object->setPrepare(false);

tests/pdo/ezSQL_pdo_mysqlTest.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,64 @@ public function testMySQLQuery() {
163163

164164
$this->assertEquals(0, $this->object->query('DROP TABLE unit_test'));
165165
} // testMySQLQuery
166+
167+
/**
168+
* @covers ezSQL_pdo::securePDO
169+
*/
170+
public function testSecurePDO()
171+
{
172+
securePDO('mysqli');
173+
$this->assertTrue($this->object->connect('mysql:host=' . self::TEST_DB_HOST . ';dbname=' . self::TEST_DB_NAME . ';port=' . self::TEST_DB_PORT, self::TEST_DB_USER, self::TEST_DB_PASSWORD));
174+
175+
$this->assertEquals($this->object->drop('new_create_test2'), 0);
176+
$this->assertEquals($this->object->create('new_create_test2',
177+
column('id', INTR, 11, notNULL, AUTO),
178+
column('create_key', VARCHAR, 50),
179+
primary('id_pk', 'id')),
180+
0);
181+
182+
$this->object->setPrepare(false);
183+
$this->assertEquals($this->object->insert('new_create_test2',
184+
['create_key' => 'test 2']),
185+
1);
186+
187+
$conn = $this->object->connection();
188+
$res = $conn->query("SHOW STATUS LIKE 'Ssl_cipher';")->fetchAll();
189+
$this->assertEquals('Ssl_cipher', $res[0]['Variable_name']);
190+
191+
$this->object->setPrepare();
192+
$this->assertEquals($this->object->drop('new_create_test2'), 0);
193+
}
194+
195+
/**
196+
* @covers ezQuery::create
197+
*/
198+
public function testCreate()
199+
{
200+
$this->assertTrue($this->object->connect('mysql:host=' . self::TEST_DB_HOST . ';dbname=' . self::TEST_DB_NAME . ';port=' . self::TEST_DB_PORT, self::TEST_DB_USER, self::TEST_DB_PASSWORD));
201+
202+
$this->assertEquals($this->object->create('new_create_test',
203+
column('id', INTR, 11, notNULL, AUTO),
204+
column('create_key', VARCHAR, 50),
205+
primary('id_pk', 'id')),
206+
0);
207+
208+
$this->object->setPrepare(false);
209+
$this->assertEquals($this->object->insert('new_create_test',
210+
['create_key' => 'test 2']),
211+
1);
212+
$this->object->setPrepare();
213+
}
214+
215+
/**
216+
* @covers ezQuery::drop
217+
*/
218+
public function testDrop()
219+
{
220+
$this->assertTrue($this->object->connect('mysql:host=' . self::TEST_DB_HOST . ';dbname=' . self::TEST_DB_NAME . ';port=' . self::TEST_DB_PORT, self::TEST_DB_USER, self::TEST_DB_PASSWORD));
221+
222+
$this->assertEquals($this->object->drop('new_create_test'), 0);
223+
}
166224

167225
/**
168226
* @covers ezSQLcore::insert

tests/postgresql/ezSQL_postgresqlTest.php

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,37 @@ public function testQuery() {
181181

182182
$this->assertEquals(0, $this->object->query('DROP TABLE unit_test'));
183183
} // testQuery
184-
184+
185+
/**
186+
* @covers ezQuery::create
187+
*/
188+
public function testCreate()
189+
{
190+
$this->object->connect(self::TEST_DB_USER, self::TEST_DB_PASSWORD, self::TEST_DB_NAME, self::TEST_DB_HOST, self::TEST_DB_PORT);
191+
192+
$this->assertEquals($this->object->create('new_create_test',
193+
column('id', AUTO),
194+
column('create_key', VARCHAR, 50),
195+
primary('id_pk', 'id')),
196+
0);
197+
198+
$this->object->setPrepare(false);
199+
$this->assertEquals($this->object->insert('new_create_test',
200+
['create_key' => 'test 2']),
201+
1);
202+
$this->object->setPrepare();
203+
}
204+
205+
/**
206+
* @covers ezQuery::drop
207+
*/
208+
public function testDrop()
209+
{
210+
$this->object->connect(self::TEST_DB_USER, self::TEST_DB_PASSWORD, self::TEST_DB_NAME, self::TEST_DB_HOST, self::TEST_DB_PORT);
211+
212+
$this->assertEquals($this->object->drop('new_create_test'), 0);
213+
}
214+
185215
/**
186216
* @covers ezSQLcore::insert
187217
*/

tests/sqlite/ezSQL_sqlite3Test.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,33 @@ public function testQuery()
126126
// Get rid of the table we created..
127127
$this->object->query("DROP TABLE test_table;");
128128
}
129+
130+
/**
131+
* @covers ezQuery::create
132+
*/
133+
public function testCreate()
134+
{
135+
$this->assertEquals($this->object->create('new_create_test',
136+
column('id', INTEGERS, notNULL, AUTO),
137+
column('create_key', VARCHAR, 50),
138+
primary('id_pk', 'id')),
139+
0);
140+
141+
$this->object->setPrepare(false);
142+
$this->assertEquals($this->object->insert('new_create_test',
143+
['create_key' => 'test 2']),
144+
0);
145+
$this->object->setPrepare();
146+
}
147+
148+
/**
149+
* @covers ezQuery::drop
150+
*/
151+
public function testDrop()
152+
{
153+
$this->assertEquals($this->object->drop('new_create_test'), 0);
154+
}
155+
129156
/**
130157
* @covers ezQuery::insert
131158
*/
@@ -150,8 +177,8 @@ public function testUpdate()
150177
$test_table['test_key'] = 'the key string';
151178
$where="test_key = test 1";
152179
$this->assertEquals(1, $this->object->update('test_table', $test_table, $where));
153-
$this->assertEquals(1, $this->object->update('test_table', $test_table, eq('test_key','test 3', _AND),
154-
eq('test_value','testing string 3')));
180+
$this->assertEquals(1, $this->object->update(
181+
'test_table', $test_table, eq('test_key','test 3', _AND), eq('test_value','testing string 3')));
155182
$where=eq('test_value','testing string 4');
156183
$this->assertEquals(0, $this->object->update('test_table', $test_table, $where));
157184
$this->assertEquals(1, $this->object->update('test_table', $test_table, "test_key = test 2"));

tests/sqlsrv/ezSQL_sqlsrvTest.php

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,36 @@ public function testConvertMySqlTosqlsrv() {
166166
$result = $this->object->ConvertMySqlTosqlsrv("SELECT `test` FROM `unit_test`;");
167167
$this->assertEquals("SELECT test FROM unit_test;", $result);
168168
} // testConvertMySqlTosqlsrv
169-
169+
170+
/**
171+
* @covers ezQuery::create
172+
*/
173+
public function testCreate()
174+
{
175+
$this->object->quick_connect(self::TEST_DB_USER, self::TEST_DB_PASSWORD, self::TEST_DB_NAME);
176+
177+
$this->assertEquals($this->object->create('new_create_test',
178+
column('id', AUTO),
179+
column('create_key', VARCHAR, 50),
180+
primary('id_pk', 'id')),
181+
0);
182+
183+
$this->object->setPrepare(false);
184+
$this->assertEquals($this->object->insert('new_create_test',
185+
['create_key' => 'test 2']),
186+
0);
187+
$this->object->setPrepare();
188+
}
189+
190+
/**
191+
* @covers ezQuery::drop
192+
*/
193+
public function testDrop()
194+
{
195+
$this->object->quick_connect(self::TEST_DB_USER, self::TEST_DB_PASSWORD, self::TEST_DB_NAME);
196+
$this->assertEquals($this->object->drop('new_create_test'), 0);
197+
}
198+
170199
/**
171200
* @covers ezSQLcore::insert
172201
*/

0 commit comments

Comments
 (0)