admin files updates
This commit is contained in:
@@ -141,14 +141,14 @@ var_dump($db->dbGetReturningExt());
|
|||||||
|
|
||||||
// same as above but use an EOM string
|
// same as above but use an EOM string
|
||||||
$some_time = time();
|
$some_time = time();
|
||||||
$query = <<<EOM
|
$query = <<<SQL
|
||||||
INSERT INTO test_foo (
|
INSERT INTO test_foo (
|
||||||
test, number_a
|
test, number_a
|
||||||
) VALUES (
|
) VALUES (
|
||||||
'EOM FOO TEST $some_time', 1
|
'EOM FOO TEST $some_time', 1
|
||||||
)
|
)
|
||||||
RETURNING test, number_a
|
RETURNING test, number_a
|
||||||
EOM;
|
SQL;
|
||||||
$status = $db->dbExec($query);
|
$status = $db->dbExec($query);
|
||||||
print "EOM STRING DIRECT INSERT STATUS: " . Support::printToString($status) . " |<br>"
|
print "EOM STRING DIRECT INSERT STATUS: " . Support::printToString($status) . " |<br>"
|
||||||
. "QUERY: " . $db->dbGetQuery() . " |<br>"
|
. "QUERY: " . $db->dbGetQuery() . " |<br>"
|
||||||
@@ -167,21 +167,21 @@ print "DIRECT INSERT PREVIOUS INSERTED: "
|
|||||||
. print_r($db->dbReturnRow("SELECT test_foo_id, test FROM test_foo "
|
. print_r($db->dbReturnRow("SELECT test_foo_id, test FROM test_foo "
|
||||||
. "WHERE test_foo_id = " . (int)$last_insert_pk), true) . "<br>";
|
. "WHERE test_foo_id = " . (int)$last_insert_pk), true) . "<br>";
|
||||||
$__last_insert_pk = (int)$last_insert_pk;
|
$__last_insert_pk = (int)$last_insert_pk;
|
||||||
$query = <<<EOM
|
$query = <<<SQL
|
||||||
SELECT
|
SELECT
|
||||||
test_foo_id, test
|
test_foo_id, test
|
||||||
FROM test_foo
|
FROM test_foo
|
||||||
WHERE test_foo_id = $__last_insert_pk;
|
WHERE test_foo_id = $__last_insert_pk;
|
||||||
EOM;
|
SQL;
|
||||||
print "EOM READ OF PREVIOUS INSERTED: " . print_r($db->dbReturnRow($query), true) . "<br>";
|
print "EOM READ OF PREVIOUS INSERTED: " . print_r($db->dbReturnRow($query), true) . "<br>";
|
||||||
print "LAST ERROR: " . $db->dbGetLastError() . "<br>";
|
print "LAST ERROR: " . $db->dbGetLastError() . "<br>";
|
||||||
print "<br>";
|
print "<br>";
|
||||||
$query = <<<EOM
|
$query = <<<SQL
|
||||||
SELECT
|
SELECT
|
||||||
test_foo_id, test
|
test_foo_id, test
|
||||||
FROM test_foo
|
FROM test_foo
|
||||||
WHERE test_foo_id = $1;
|
WHERE test_foo_id = $1;
|
||||||
EOM;
|
SQL;
|
||||||
print "RETURN ROW PARAMS: " . print_r(
|
print "RETURN ROW PARAMS: " . print_r(
|
||||||
$db->dbReturnRowParams(
|
$db->dbReturnRowParams(
|
||||||
$query,
|
$query,
|
||||||
@@ -208,7 +208,7 @@ foreach (['pk_name', 'count', 'query', 'returning_id'] as $key) {
|
|||||||
print "KEY: " . $key . ': ' . $db->dbGetPrepareCursorValue('ins_test_foo', $key) . "<br>";
|
print "KEY: " . $key . ': ' . $db->dbGetPrepareCursorValue('ins_test_foo', $key) . "<br>";
|
||||||
}
|
}
|
||||||
|
|
||||||
$query = <<<EOM
|
$query = <<<SQL
|
||||||
INSERT INTO
|
INSERT INTO
|
||||||
test_foo
|
test_foo
|
||||||
(
|
(
|
||||||
@@ -217,7 +217,7 @@ INSERT INTO
|
|||||||
$1, '$2'
|
$1, '$2'
|
||||||
)
|
)
|
||||||
RETURNING test, string_a
|
RETURNING test, string_a
|
||||||
EOM;
|
SQL;
|
||||||
$db->dbPrepare("ins_test_foo_eom", $query);
|
$db->dbPrepare("ins_test_foo_eom", $query);
|
||||||
$status = $db->dbExecute("ins_test_foo_eom", ['EOM BAR TEST ' . time()]);
|
$status = $db->dbExecute("ins_test_foo_eom", ['EOM BAR TEST ' . time()]);
|
||||||
print "EOM STRING PREPARE INSERT[ins_test_foo_eom] STATUS: " . Support::printToString($status) . " |<br>"
|
print "EOM STRING PREPARE INSERT[ins_test_foo_eom] STATUS: " . Support::printToString($status) . " |<br>"
|
||||||
@@ -235,7 +235,7 @@ print "EOM STRING EXEC PARAMS INSERT STATUS: " . Support::printToString($status)
|
|||||||
. "RETURNING RETURN: " . print_r($db->dbGetReturningArray(), true) . "<br>";
|
. "RETURNING RETURN: " . print_r($db->dbGetReturningArray(), true) . "<br>";
|
||||||
|
|
||||||
// I/S Query
|
// I/S Query
|
||||||
$query_insert = <<<EOM
|
$query_insert = <<<SQL
|
||||||
INSERT INTO
|
INSERT INTO
|
||||||
test_foo
|
test_foo
|
||||||
(
|
(
|
||||||
@@ -246,8 +246,8 @@ INSERT INTO
|
|||||||
$6, $7, $8
|
$6, $7, $8
|
||||||
)
|
)
|
||||||
RETURNING test
|
RETURNING test
|
||||||
EOM;
|
SQL;
|
||||||
$query_select = <<<EOM
|
$query_select = <<<SQL
|
||||||
SELECT
|
SELECT
|
||||||
test, some_bool, string_a, number_a, number_a_numeric,
|
test, some_bool, string_a, number_a, number_a_numeric,
|
||||||
some_time, some_time, some_timestamp, json_string
|
some_time, some_time, some_timestamp, json_string
|
||||||
@@ -255,7 +255,7 @@ FROM
|
|||||||
test_foo
|
test_foo
|
||||||
WHERE
|
WHERE
|
||||||
test_foo_id = $1
|
test_foo_id = $1
|
||||||
EOM;
|
SQL;
|
||||||
// A
|
// A
|
||||||
$status = $db->dbExecParams(
|
$status = $db->dbExecParams(
|
||||||
$query_insert,
|
$query_insert,
|
||||||
@@ -313,18 +313,51 @@ print "EOM STRING EXEC RETURN TEST: " . print_r(
|
|||||||
[$__last_insert_id]
|
[$__last_insert_id]
|
||||||
)
|
)
|
||||||
) . "<br>";
|
) . "<br>";
|
||||||
|
// params > 10 for debug
|
||||||
|
// error catcher
|
||||||
|
$query_insert = <<<SQL
|
||||||
|
INSERT INTO many_columns (
|
||||||
|
col_01_int,
|
||||||
|
col_01, col_02, col_03, col_04, col_05, col_06, col_07, col_08, col_09,
|
||||||
|
col_10, col_11, col_12, col_02_int
|
||||||
|
) VALUES (
|
||||||
|
1,
|
||||||
|
$1, $2, $3, $4, $5, $6, $7, $8, $9,
|
||||||
|
$10, $11, $12, $13
|
||||||
|
)
|
||||||
|
RETURNING
|
||||||
|
many_columns_id,
|
||||||
|
col_01_int,
|
||||||
|
col_01, col_02, col_03, col_04, col_05, col_06, col_07, col_08, col_09,
|
||||||
|
col_10, col_11, col_12, col_02_int
|
||||||
|
SQL;
|
||||||
|
// will fail with "NULL" string on int
|
||||||
|
$query_params = [
|
||||||
|
'col 1', 'col 2', 'col 3', 'col 4', 'col 5', 'col 6', 'col 7', 'col 8',
|
||||||
|
'col 9',
|
||||||
|
'col 10', 'col 11', 'col 12', "NULL"
|
||||||
|
];
|
||||||
|
$status = $db->dbExecParams($query_insert, $query_params);
|
||||||
|
echo "<b>*</b><br>";
|
||||||
|
echo "EOM STRING WITH MORE THAN 10 PARAMETERS: "
|
||||||
|
. Support::printToString($query_params) . " |<br>"
|
||||||
|
. " |<br>"
|
||||||
|
. "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | "
|
||||||
|
. "RETURNING EXT: " . print_r($db->dbGetReturningExt(), true) . " | "
|
||||||
|
. "RETURNING RETURN: " . print_r($db->dbGetReturningArray(), true)
|
||||||
|
. "ERROR: " . $db->dbGetLastError(true) . "<br>";
|
||||||
echo "<hr>";
|
echo "<hr>";
|
||||||
// binary insert tests
|
// binary insert tests
|
||||||
$filename = $db->dbEscapeLiteral('class_test.db.php');
|
$filename = $db->dbEscapeLiteral('class_test.db.php');
|
||||||
$rand_bin_uid = $db->dbEscapeLiteral(\CoreLibs\Create\Uids::uniqIdShort());
|
$rand_bin_uid = $db->dbEscapeLiteral(\CoreLibs\Create\Uids::uniqIdShort());
|
||||||
$binary_data = $db->dbEscapeBytea(file_get_contents('class_test.db.php') ?: '');
|
$binary_data = $db->dbEscapeBytea(file_get_contents('class_test.db.php') ?: '');
|
||||||
$query = <<<EOM
|
$query = <<<SQL
|
||||||
INSERT INTO binary_test (
|
INSERT INTO binary_test (
|
||||||
filename, uid, binary_data
|
filename, uid, binary_data
|
||||||
) VALUES (
|
) VALUES (
|
||||||
$filename, $rand_bin_uid, '$binary_data'
|
$filename, $rand_bin_uid, '$binary_data'
|
||||||
)
|
)
|
||||||
EOM;
|
SQL;
|
||||||
$status = $db->dbExec($query);
|
$status = $db->dbExec($query);
|
||||||
$__last_insert_id = $db->dbGetInsertPK();
|
$__last_insert_id = $db->dbGetInsertPK();
|
||||||
print "BINARY DATA INSERT: "
|
print "BINARY DATA INSERT: "
|
||||||
@@ -336,13 +369,13 @@ print "BINARY DATA INSERT: "
|
|||||||
. "ERROR: " . $db->dbGetLastError(true) . "<br>";
|
. "ERROR: " . $db->dbGetLastError(true) . "<br>";
|
||||||
|
|
||||||
echo "<b>*</b><br>";
|
echo "<b>*</b><br>";
|
||||||
$query = <<<EOM
|
$query = <<<SQL
|
||||||
INSERT INTO binary_test (
|
INSERT INTO binary_test (
|
||||||
filename, uid, binary_data
|
filename, uid, binary_data
|
||||||
) VALUES (
|
) VALUES (
|
||||||
$1, $2, $3
|
$1, $2, $3
|
||||||
)
|
)
|
||||||
EOM;
|
SQL;
|
||||||
$status = $db->dbExecParams($query, [$filename, $rand_bin_uid, $binary_data]);
|
$status = $db->dbExecParams($query, [$filename, $rand_bin_uid, $binary_data]);
|
||||||
$__last_insert_id = $db->dbGetInsertPK();
|
$__last_insert_id = $db->dbGetInsertPK();
|
||||||
print "BINARY DATA INSERT PARAMS: "
|
print "BINARY DATA INSERT PARAMS: "
|
||||||
@@ -380,7 +413,7 @@ print "DIRECT MULTIPLE INSERT WITH RETURN STATUS: " . Support::printToString($st
|
|||||||
$t_1 = time();
|
$t_1 = time();
|
||||||
$t_2 = time();
|
$t_2 = time();
|
||||||
$t_3 = time();
|
$t_3 = time();
|
||||||
$query = <<<EOM
|
$query = <<<SQL
|
||||||
INSERT INTO test_foo (
|
INSERT INTO test_foo (
|
||||||
test
|
test
|
||||||
) VALUES
|
) VALUES
|
||||||
@@ -388,7 +421,7 @@ INSERT INTO test_foo (
|
|||||||
('EOM BAR 2 $t_2'),
|
('EOM BAR 2 $t_2'),
|
||||||
('EOM BAR 3 $t_3')
|
('EOM BAR 3 $t_3')
|
||||||
RETURNING test_foo_id, test
|
RETURNING test_foo_id, test
|
||||||
EOM;
|
SQL;
|
||||||
$status = $db->dbExec($query);
|
$status = $db->dbExec($query);
|
||||||
print "EOM STRING DIRECT MULTIPLE INSERT WITH RETURN STATUS: " . Support::printToString($status) . " |<br>"
|
print "EOM STRING DIRECT MULTIPLE INSERT WITH RETURN STATUS: " . Support::printToString($status) . " |<br>"
|
||||||
. "QUERY: " . $db->dbGetQuery() . " |<br>"
|
. "QUERY: " . $db->dbGetQuery() . " |<br>"
|
||||||
@@ -422,7 +455,7 @@ print "UPDATE WITH PK " . Support::printToString($last_insert_pk)
|
|||||||
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
|
. "RETURNING ARRAY: " . print_r($db->dbGetReturningArray(), true) . "<br>";
|
||||||
// UPDATE BUT EOM STYLE
|
// UPDATE BUT EOM STYLE
|
||||||
$status = $db->dbExecParams(
|
$status = $db->dbExecParams(
|
||||||
<<<EOM
|
<<<SQL
|
||||||
UPDATE
|
UPDATE
|
||||||
test_foo
|
test_foo
|
||||||
SET
|
SET
|
||||||
@@ -432,7 +465,7 @@ $status = $db->dbExecParams(
|
|||||||
tset_foo_id = ?
|
tset_foo_id = ?
|
||||||
RETURNING
|
RETURNING
|
||||||
test_foo.test, string_a
|
test_foo.test, string_a
|
||||||
EOM,
|
SQL,
|
||||||
['SOMETHING DIFFERENT EOM', (string)rand(1, 100)]
|
['SOMETHING DIFFERENT EOM', (string)rand(1, 100)]
|
||||||
);
|
);
|
||||||
print "UPDATE EOM WITH PK " . Support::printToString($last_insert_pk)
|
print "UPDATE EOM WITH PK " . Support::printToString($last_insert_pk)
|
||||||
@@ -524,27 +557,27 @@ echo "<hr>";
|
|||||||
print "EOM STYLE STRINGS<br>";
|
print "EOM STYLE STRINGS<br>";
|
||||||
$test_bar = $db->dbEscapeLiteral('SOMETHING DIFFERENT');
|
$test_bar = $db->dbEscapeLiteral('SOMETHING DIFFERENT');
|
||||||
// Test EOM block
|
// Test EOM block
|
||||||
$q = <<<EOM
|
$q = <<<SQL
|
||||||
SELECT test_foo_id, test, some_bool, string_a, number_a,
|
SELECT test_foo_id, test, some_bool, string_a, number_a,
|
||||||
-- comment
|
-- comment
|
||||||
number_a_numeric, some_time
|
number_a_numeric, some_time
|
||||||
FROM test_foo
|
FROM test_foo
|
||||||
WHERE test = $test_bar
|
WHERE test = $test_bar
|
||||||
ORDER BY test_foo_id DESC LIMIT 5
|
ORDER BY test_foo_id DESC LIMIT 5
|
||||||
EOM;
|
SQL;
|
||||||
while (is_array($res = $db->dbReturn($q))) {
|
while (is_array($res = $db->dbReturn($q))) {
|
||||||
print "ROW: <pre>" . print_r($res, true) . "</pre><br>";
|
print "ROW: <pre>" . print_r($res, true) . "</pre><br>";
|
||||||
}
|
}
|
||||||
echo "<hr>";
|
echo "<hr>";
|
||||||
print "DB RETURN PARAMS<br>";
|
print "DB RETURN PARAMS<br>";
|
||||||
$q = <<<EOM
|
$q = <<<SQL
|
||||||
SELECT test_foo_id, test, some_bool, string_a, number_a,
|
SELECT test_foo_id, test, some_bool, string_a, number_a,
|
||||||
-- comment
|
-- comment
|
||||||
number_a_numeric, some_time
|
number_a_numeric, some_time
|
||||||
FROM test_foo
|
FROM test_foo
|
||||||
WHERE test = $1
|
WHERE test = $1
|
||||||
ORDER BY test_foo_id DESC LIMIT 5
|
ORDER BY test_foo_id DESC LIMIT 5
|
||||||
EOM;
|
SQL;
|
||||||
while (
|
while (
|
||||||
is_array($res = $db->dbReturnParams($q, ['SOMETHING DIFFERENT']))
|
is_array($res = $db->dbReturnParams($q, ['SOMETHING DIFFERENT']))
|
||||||
) {
|
) {
|
||||||
@@ -632,14 +665,14 @@ print "Wrote to DB tabel $table with data " . print_r($data, true) . " and got p
|
|||||||
$query = "SELECT type, sdate, integer FROM foobar";
|
$query = "SELECT type, sdate, integer FROM foobar";
|
||||||
$data = $db->dbReturnArray($query, true);
|
$data = $db->dbReturnArray($query, true);
|
||||||
print "RETURN ARRAY: " . $db->dbGetNumRows() . ", Full foobar list: <br><pre>" . print_r($data, true) . "</pre><br>";
|
print "RETURN ARRAY: " . $db->dbGetNumRows() . ", Full foobar list: <br><pre>" . print_r($data, true) . "</pre><br>";
|
||||||
$query = <<<EOM
|
$query = <<<SQL
|
||||||
SELECT
|
SELECT
|
||||||
type, sdate
|
type, sdate
|
||||||
FROM
|
FROM
|
||||||
foobar
|
foobar
|
||||||
WHERE
|
WHERE
|
||||||
type = $1
|
type = $1
|
||||||
EOM;
|
SQL;
|
||||||
$data = $db->dbReturnArrayParams($query, ['schmalz'], true);
|
$data = $db->dbReturnArrayParams($query, ['schmalz'], true);
|
||||||
print "RETURN ARRAY PARAMS: " . $db->dbGetNumRows() . ", Full foobar list: <br><pre>"
|
print "RETURN ARRAY PARAMS: " . $db->dbGetNumRows() . ", Full foobar list: <br><pre>"
|
||||||
. print_r($data, true) . "</pre><br>";
|
. print_r($data, true) . "</pre><br>";
|
||||||
|
|||||||
105
www/admin/class_test.db.single.php
Normal file
105
www/admin/class_test.db.single.php
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
<?php // phpcs:ignore warning
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @phan-file-suppress PhanTypeSuspiciousStringExpression
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
// turn on all error reporting
|
||||||
|
error_reporting(E_ALL | E_STRICT | E_ERROR | E_WARNING | E_PARSE | E_COMPILE_ERROR);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
// basic class test file
|
||||||
|
define('USE_DATABASE', true);
|
||||||
|
// sample config
|
||||||
|
require 'config.php';
|
||||||
|
// override ECHO ALL FALSE
|
||||||
|
$ECHO_ALL = true;
|
||||||
|
// define log file id
|
||||||
|
$LOG_FILE_ID = 'classTest-db-single';
|
||||||
|
ob_end_flush();
|
||||||
|
|
||||||
|
use CoreLibs\Debug\Support as DgS;
|
||||||
|
use CoreLibs\DB\IO as DbIo;
|
||||||
|
use CoreLibs\Debug\Support;
|
||||||
|
use CoreLibs\Convert\SetVarType;
|
||||||
|
|
||||||
|
$log = new CoreLibs\Debug\Logging([
|
||||||
|
'log_folder' => BASE . LOG,
|
||||||
|
'file_id' => $LOG_FILE_ID,
|
||||||
|
// add file date
|
||||||
|
'print_file_date' => true,
|
||||||
|
// set debug and print flags
|
||||||
|
'debug_all' => $DEBUG_ALL ?? true,
|
||||||
|
'echo_all' => $ECHO_ALL,
|
||||||
|
'print_all' => $PRINT_ALL ?? true,
|
||||||
|
]);
|
||||||
|
// db connection and attach logger
|
||||||
|
$db = new CoreLibs\DB\IO(DB_CONFIG, $log);
|
||||||
|
$db->log->debug('START', '=============================>');
|
||||||
|
|
||||||
|
$PAGE_NAME = 'TEST CLASS: DB SINGLE';
|
||||||
|
print "<!DOCTYPE html>";
|
||||||
|
print "<html><head><title>" . $PAGE_NAME . "</title><head>";
|
||||||
|
print "<body>";
|
||||||
|
print '<div><a href="class_test.php">Class Test Master</a></div>';
|
||||||
|
print '<div><a href="class_test.db.dbReturn.php">Class Test DB dbReturn</a></div>';
|
||||||
|
print '<div><h1>' . $PAGE_NAME . '</h1></div>';
|
||||||
|
|
||||||
|
print "LOGFILE NAME: " . $db->log->getSetting('log_file_name') . "<br>";
|
||||||
|
print "LOGFILE ID: " . $db->log->getSetting('log_file_id') . "<br>";
|
||||||
|
print "DBINFO: " . $db->dbInfo() . "<br>";
|
||||||
|
// DB client encoding
|
||||||
|
print "DB client encoding: " . $db->dbGetEncoding() . "<br>";
|
||||||
|
print "DB search path: " . $db->dbGetSchema() . "<br>";
|
||||||
|
|
||||||
|
$to_db_version = '15.2';
|
||||||
|
print "VERSION DB: " . $db->dbVersion() . "<br>";
|
||||||
|
print "SERVER ENCODING: " . $db->dbVersionInfo('server_encoding') . "<br>";
|
||||||
|
if (($dbh = $db->dbGetDbh()) instanceof \PgSql\Connection) {
|
||||||
|
print "ALL OUTPUT [TEST]: <pre>" . print_r(pg_version($dbh), true) . "</pre><br>";
|
||||||
|
} else {
|
||||||
|
print "NO DB HANDLER<br>";
|
||||||
|
}
|
||||||
|
|
||||||
|
// params > 10 for debug
|
||||||
|
// error catcher
|
||||||
|
$query_insert = <<<SQL
|
||||||
|
INSERT INTO many_columns (
|
||||||
|
col_01_int,
|
||||||
|
col_01, col_02, col_03, col_04, col_05, col_06, col_07, col_08, col_09,
|
||||||
|
col_10, col_11, col_12, col_02_int
|
||||||
|
) VALUES (
|
||||||
|
1,
|
||||||
|
$1, $2, $3, $4, $5, $6, $7, $8, $9,
|
||||||
|
$10, $11, $12, $13
|
||||||
|
)
|
||||||
|
RETURNING
|
||||||
|
many_columns_id,
|
||||||
|
col_01_int,
|
||||||
|
col_01, col_02, col_03, col_04, col_05, col_06, col_07, col_08, col_09,
|
||||||
|
col_10, col_11, col_12, col_02_int
|
||||||
|
SQL;
|
||||||
|
$query_params = [
|
||||||
|
'col 1', 'col 2', 'col 3', 'col 4', 'col 5', 'col 6', 'col 7', 'col 8',
|
||||||
|
'col 9', 'col 10', 'col 11', 'col 12', null
|
||||||
|
];
|
||||||
|
$status = $db->dbExecParams($query_insert, $query_params);
|
||||||
|
echo "<b>*</b><br>";
|
||||||
|
echo "EOM STRING WITH MORE THAN 10 PARAMETERS: "
|
||||||
|
. Support::printToString($query_params) . " |<br>"
|
||||||
|
. " |<br>"
|
||||||
|
. "PRIMARY KEY: " . Support::printToString($db->dbGetInsertPK()) . " | "
|
||||||
|
// . "RETURNING EXT: " . Support::printToString($db->dbGetReturningExt()) . " | "
|
||||||
|
. "RETURNING RETURN: " . Support::printToString($db->dbGetReturningArray())
|
||||||
|
. "ERROR: " . $db->dbGetLastError(true) . "<br>";
|
||||||
|
echo "<hr>";
|
||||||
|
|
||||||
|
// error message
|
||||||
|
print $log->printErrorMsg();
|
||||||
|
|
||||||
|
print "</body></html>";
|
||||||
|
|
||||||
|
// __END__
|
||||||
Reference in New Issue
Block a user