Seditio Source
Root |
./othercms/PHPFusion 9.10.20/includes/db_handlers/all_functions_include.php
<?php
/*-------------------------------------------------------+
| PHPFusion Content Management System
| Copyright (C) PHP Fusion Inc
| https://phpfusion.com/
+--------------------------------------------------------+
| Filename: all_functions_include.php
| Author: Takács Ákos (Rimelek)
+--------------------------------------------------------+
| This program is released as free software under the
| Affero GPL license. You can redistribute it and/or
| modify it under the terms of this license which you
| can read by viewing the included agpl.txt or online
| at www.gnu.org/licenses/agpl.html. Removal of this
| copyright header is strictly prohibited without
| written permission from the original author(s).
+--------------------------------------------------------*/

use PHPFusion\Database\AbstractDatabaseDriver;
use
PHPFusion\Database\DatabaseFactory;
use
PHPFusion\Database\Exception\SelectionException;

/*
 * It will be called after everything else even if the script is
 * halted by exit(), die(), fatal error or exception.
 *
 * It shows all sent query per connection
 */
register_shutdown_function(function () {
    if (
DatabaseFactory::isDebug()) {
       
$log = AbstractDatabaseDriver::getGlobalQueryLog();
        foreach (
$log as $connectionid => $value) {
            if (!
DatabaseFactory::isDebug($connectionid)) {
                unset(
$log[$connectionid]);
            }
        }
       
//print_p($log);

       
$html = "<a href='#queries' class='queries-btn btn btn-primary pull-left'>View Queries</a>\n";
       
$html .= "<div id='queries' class='well queries-log' style='display: none'>\n";
        foreach (
$log as $connID => $queries) {
           
$html .= "Database connection ID: '<strong>".$connID."</strong>'<br/>\n";

           
$queries_time = 0;
           
$queries_log = '';
            foreach (
$queries as $key => $query) {
               
$queries_time = $queries_time + $query[0];
               
// The time and the query
               
$queries_log .= "<strong>#".($key + 1)." Time: ".$query[0]."</strong><br/>\n".stripinput($query[1])."<br />\n";
               
/*
                 // The query explained
                $exp_title = "";
                $exp_value = "";
                $queries_log .= "<table class='tbl-border'>";
                // For more info on this see: http://dev.mysql.com/doc/refman/5.0/en/explain-output.html
                // and http://dev.mysql.com/doc/refman/5.0/en/explain-extended.html
                foreach (dbarray(dbquery("EXPLAIN EXTENDED ".$query[1]."")) as $key => $value) {
                    $exp_title .= "<td class='tbl1 panel panel-default'>".$key."</td>";
                    $exp_value .= "<td class='tbl2 panel panel-default'>".($value == '' ? '-' : $value)."</td>";
                }
                $queries_log .= "<tr>".$exp_title."</tr><tr>".$exp_value."</tr>";
                $queries_log .= "</table>";

                // For more info on this please see: http://dev.mysql.com/doc/refman/5.0/en/show-warnings.html
                $more_info = dbarray(dbquery("SHOW WARNINGS"));
                if ($more_info) {
                    $queries_log .= "<a class='query-more-btn' href='#'>View additional info on this query generated by SHOW WARNINGS</a>";
                    $queries_log .= "<table class='tbl-border query-more-info' style='display:none'>";
                    $queries_log .= "<tr><td class='tbl1 panel panel-default'>Code</td>
                                        <td class='tbl1 panel panel-default'>Level</td>
                                        <td class='tbl1 panel panel-default'>Message</td>
                                    </tr>";
                    $queries_log .= "<tr><td class='tbl2 panel panel-default'>".$more_info['Code']."</td>
                                        <td class='tbl2 panel panel-default'>".$more_info['Level']."</td>
                                        <td class='tbl2 panel panel-default'>".stripinput($more_info['Message'])."</td>
                                    </tr>";
                    $queries_log .= "</table>";
                }
                $queries_log .= "<hr />\n";
                */
           
}

           
$html .= "Total time taken by queries to execute in this connection: <strong>".$queries_time."</strong> seconds<br/>\n";
           
$html .= "<code>".$queries_log."</code>\n";
        }
       
$html .= "</div>\n";
       
$html .= "<style>.queries-log code {white-space: normal} .queries-log hr {border-color: #ccc}</style>\n";
       
$html .= "<script>
        $('.query-more-btn').click(function(e){
            e.preventDefault();
            $(this).next('table').toggle();
        });
        $('.queries-btn').click(function(){
            $(this).hide();
            $('.queries-log').toggle();
        })
        </script>"
;

        echo
$html;
    }
});

/**
 * Send a database query
 *
 * @param string $query SQL
 * @param array  $parameters
 *
 * @return mixed The result of query or FALSE on error
 */
function dbquery($query, $parameters = []) {
   
// Temporary check to detect the bug in installer
   
return DatabaseFactory::getConnection('default')->query($query, $parameters);
}

/**
 * Count the number of rows in a table filtered by conditions
 *
 * @param string $field      Parenthesized field name
 * @param string $table      Table name
 * @param string $conditions Conditions after "where"
 * @param array  $parameters
 *
 * @return int
 */
function dbcount($field, $table, $conditions = "", $parameters = []) {
    return
DatabaseFactory::getConnection('default')->count($field, $table, $conditions, $parameters);
}

/**
 * Fetch the first column of a specific row
 *
 * @param mixed $result
 * @param int   $row
 *
 * @return mixed
 */
function dbresult($result, $row) {
    return
DatabaseFactory::getConnection('default')->fetchFirstColumn($result, $row);
}

/**
 * Count the number of affected rows by the given query
 *
 * @param mixed $result
 *
 * @return int
 */
function dbrows($result) {
    return
DatabaseFactory::getConnection('default')->countRows($result);
}

/**
 * Fetch one row as an associative array
 *
 * @param mixed $result
 *
 * @return array Associative array
 */
function dbarray($result) {
    return
DatabaseFactory::getConnection('default')->fetchAssoc($result);
}

/**
 * Fetch one row as a numeric array
 *
 * @param mixed $result
 *
 * @return array Numeric array
 */
function dbarraynum($result) {
    return
DatabaseFactory::getConnection('default')->fetchRow($result);
}

/**
 * Connect to the database
 *
 * @param string $db_host
 * @param string $db_user
 * @param string $db_pass
 * @param string $db_name
 * @param int    $db_port
 * @param bool   $halt_on_error If it is TRUE, the script will halt in case of error
 *
 * @return array
 */
function dbconnect($db_host, $db_user, $db_pass, $db_name, $db_port = 3306, $halt_on_error = FALSE) {
   
$connection_success = TRUE;
   
$dbselection_success = TRUE;
    try {
       
DatabaseFactory::connect($db_host, $db_user, $db_pass, $db_name, [
           
'debug' => DatabaseFactory::isDebug('default'),
           
'port'  => $db_port
       
]);
    } catch (\
Exception $e) {
       
$connection_success = $e instanceof SelectionException;
       
$dbselection_success = FALSE;
        if (
$halt_on_error and !$connection_success) {
            die(
"<strong>Unable to establish connection to MySQL</strong><br />".$e->getCode()." : ".$e->getMessage());
        } else if (
$halt_on_error) {
            die(
"<strong>Unable to select MySQL database</strong><br />".$e->getCode()." : ".$e->getMessage());
        }

    }

    return [
       
'connection_success'  => $connection_success,
       
'dbselection_success' => $dbselection_success
   
];
}

/**
 * Connect to the another database
 *
 * @param string $db_host
 * @param string $db_user
 * @param string $db_pass
 * @param string $db_name
 * @param int    $db_port
 * @param string $dbid
 *
 * @return AbstractDatabaseDriver
 */
function custom_dbconnect($db_host, $db_user, $db_pass, $db_name, $db_port, $dbid) {
   
PHPFusion\Database\DatabaseFactory::registerConfiguration($dbid, [
       
'host'     => $db_host,
       
'user'     => $db_user,
       
'password' => $db_pass,
       
'database' => $db_name,
       
'port'     => $db_port,
       
'charset'  => 'utf8mb4',
       
'debug'    => PHPFusion\Database\DatabaseFactory::isDebug($dbid)
    ]);

    return
PHPFusion\Database\DatabaseFactory::getConnection($dbid);
}

/**
 * Get the next auto_increment id of a table
 *
 * Try to avoid the use of it! {@link dblastid()} after insert
 * is more secure way to get the id of an existing record than
 * get just a potential id.
 *
 * @param string $table
 *
 * @return int|false
 */
function dbnextid($table) {
    return
DatabaseFactory::getConnection('default')->getNextId($table);
}

/**
 * Get the last inserted auto increment id
 *
 * @return int
 */
function dblastid() {
    return
DatabaseFactory::getConnection('default')->getLastId();
}

/**
 * Get the AbstractDatabase instance
 *
 * @return AbstractDatabaseDriver
 */
function dbconnection() {
    try {
        return
DatabaseFactory::getConnection('default');
    } catch (\
Exception $e) {
       
## Do nothing to hide all errors
       
ini_set('display_errors', FALSE);

        return
NULL;
    }
}