Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将MySQL查询的结果格式化为从控制台运行_Php_Mysql_Zend Framework_Formatting - Fatal编程技术网

Php 将MySQL查询的结果格式化为从控制台运行

Php 将MySQL查询的结果格式化为从控制台运行,php,mysql,zend-framework,formatting,Php,Mysql,Zend Framework,Formatting,我正在写一个快速而肮脏的报告脚本,用于查询报告并通过电子邮件发送结果。使用MySQL控制台时,结果将显示在格式良好的表中: mysql> select * from users; +-----------+------------+-------+ | firstname | city | zip | +-----------+------------+-------+ | Maria | Holland | 12345 | | Rene | Doy

我正在写一个快速而肮脏的报告脚本,用于查询报告并通过电子邮件发送结果。使用MySQL控制台时,结果将显示在格式良好的表中:

mysql> select * from users;
+-----------+------------+-------+
| firstname | city       | zip   |
+-----------+------------+-------+
| Maria     | Holland    | 12345 |
| Rene      | Doylestown | 65432 |
| Helen     | Conway     | 98745 |
+-----------+------------+-------+
3 rows in set (0.01 sec)
mysql>SELECT
        topic_id,
        MATCH(text) AGAINST('tuning') AS score
    FROM
        topics
    WHERE
        MATCH(text) AGAINST('tuning' IN BOOLEAN MODE)
    ORDER BY
        score DESC
    LIMIT 10
+----------+--------------------+
| topic_id | score              |
+----------+--------------------+
| 153257   | 5.161948204040527  |
| 17925    | 4.781417369842529  |
| 66459    | 4.648380279541016  |
| 373176   | 4.570812702178955  |
| 117173   | 4.55166482925415   |
| 167016   | 4.462575912475586  |
| 183286   | 4.4519267082214355 |
| 366132   | 4.348565101623535  |
| 95502    | 4.293642520904541  |
| 29615    | 4.178250789642334  |
+----------+--------------------+
10 rows in set (141 ms)

在使用PHP获取结果时,有没有一种简单的方法可以复制这种格式?显然,我可以通过编写自己的报告格式化程序来实现这一点,但我希望有更优雅的东西

考虑到PHP中从MySQL获取数据的方式,这没有任何意义。i、 e:您通常一次获取一行数据,要么作为数组,要么作为对象


因此,您需要编写自己的hack来获取所有行并以这种方式格式化输出。也就是说,抓取数据并将其输出为HTML表应该很简单——如果您使用mysql_fetch_数组等,您可以通过获取字段名。

您可以使用exec或backticks,并通过php从命令行实际运行它。显然,mysql命令有一个可以使用的-H开关,它将输出HTML格式的文件。我还没试过,不过看起来也不错

echo '<pre>';
echo `mysql -u user -ppass -e "select * from table;" database_name`;

2行,没有pear软件包,一个快速而肮脏的统计页面能让它变得多么优雅。

使用pear软件包你可以很容易地做到这一点。只需循环查看MySQL结果,并将行添加到表中。您可以使用Console_Table::setHeaders方法添加列的标题,然后使用Console_Table::addRow方法添加每一行,最后使用Console_Table::getTable显示每一行

PHP中没有内置任何东西可以做到这一点。如果您不想使用/编写代码来绘制控制台表,只需使用passthru通过PHP将-e查询传递给mysql即可。这将对两个查询都有效;和\G:


你必须自己做

执行循环以查找每列的最大大小。然后将每行填充输出为该大小+2,在开始和结束处留有空格。用|分隔各列

使用+和-创建顶部和底部

如果不知道你用什么来获得结果,很难给出一个具体的例子。但假设您使用的是mysql\u查询。这里有一个例子

  query2table("select * from table;");
这样就可以了我希望我没有漏掉分号:


希望有帮助

听起来您只需要使用任何一种exec方法或backticks。我不确定“\G”这件事。。。但是,几个月前,我发布了一个名为query2Table的php函数,它基于我多年来一直在循环使用的函数。多年来我积累了很多东西:query2xml、query2excel、query2json等等。我想我在某些地方仍然有旧的perl和asp版本

基本上,在我的解决方案中,您只需将查询字符串传递给它,它就可以使用从结果中获取的列名作为表的标题行,动态地吐出一个html表。它也会增长以填充其继承容器对象的宽度

<pre>
<?php
$db = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');
$start = microtime(true);
$sql = "SELECT * FROM myTable";
$result = mysqli_query($db, $sql);
$exec_time = microtime(true) - $start;
// obtain the maximum string length of all column headings and rows
$colwidths = array();
while ($row = mysqli_fetch_assoc($result)) {
    foreach ($row as $key => $value) {
        // heading
        if (!isset($colwidths[ $key ])) {
            $colwidths[ $key ] = strlen($key) + 2;
        }
        // rows
        $colwidths[ $key ] = max($colwidths[ $key ], strlen($value) + 2);
    }
}
echo 'mysql>' . trim($sql) . PHP_EOL;
// SELECT, SHOW, DESCRIBE, EXPLAIN = resource
// INSERT, UPDATE, DELETE, DROP = true
// Error = false
if (!is_bool($result)) {
    if ($colwidths) {
        mysqli_data_seek($result, 0);
        while ($row = mysqli_fetch_assoc($result)) {
            // create and display horizontal line and column headings
            if (!isset($header)) {
                $header = '| ';
                $line = '+';
                foreach ($row as $key => $value) {
                    $line .= str_repeat('-', $colwidths[ $key ] + 2) . '+';
                    $header .= str_pad($key, $colwidths[ $key ]) . ' | ';
                }
                echo $line . PHP_EOL;
                echo $header . PHP_EOL;
                echo $line . PHP_EOL;
            }
            // display row values
            foreach ($row as $key => $value) {
                echo '| ' . str_pad($value, $colwidths[ $key ] + 1);
            }
            echo '|' . PHP_EOL;
        }
        echo $line . PHP_EOL;
    }
    mysqli_free_result($result);
}
$affectedrows = mysqli_affected_rows($db);
if ($result === false) {
    echo PHP_EOL . 'ERROR ' . mysqli_errno($db) . ': ' . mysqli_error($db);
}
else if ($result === true) {
    echo 'Query OK, ' . $affectedrows . ' rows affected (' . round($exec_time / $iterations * 1000) . ' ms)';
}
else if ($affectedrows) {
    echo $affectedrows . ' rows in set (' . round($exec_time / $iterations * 1000) . ' ms)';
}
else {
    echo 'Empty set (' . round($exec_time / $iterations * 1000) . ' ms)';
}
?>
</pre>
我有一个更为最新的query2AjaxTable版本,它将所有内容很好地封装在一个类中,并添加了jQuery排序和动画,但它还没有准备好发布

如果我愚蠢的小函数不能帮助你,在你进退两难的时候,也许其他人会发现它有用

我对其进行了优化,使其使用了更少的循环5对9。为了完整起见,我还添加了命令行、统计信息和错误输出:

错误:

<?php
//Suppress E_DEPRECATED errors for statically calling a non-static method (this package is pretty old!)
error_reporting(E_ALL & ~E_DEPRECATED);
require __DIR__ . '/vendor/autoload.php';

//echo "<pre>"; #uncomment this line if running script in a browser

//The class isn't namespaced so just call it directly like so:
echo Console_Table::fromArray(
    ['column', 'headings'], 
    [
        ['1st row', 'values'], 
        ['2nd row', 'values'], 
        ['...', '...']
    ]
);
更新

+---------+----------+
| column  | headings |
+---------+----------+
| 1st row | values   |
| 2nd row | values   |
| ...     | ...      |
+---------+----------+

基于mfonda的答案,您现在可以轻松地使用composer加载:

$composer需要pear/控制台\u表


不,你必须自己格式化。当您得到mysql的结果时,您没有使用mysql客户端,而是使用php和mysql库。格式化是由命令行客户端完成的。如果你想要相同的格式,你必须自己做。如果你想帮忙做那件事,那就不太好了hard@ehudokai我理解PHP的mysql库和控制台的区别。我真的希望有更聪明的东西。我明白:我在回答中写下了需要做的事情,但是如果你不介意的话,@mfonda提到的控制台看起来也做了同样的事情。谢谢你的回复。我知道所有的抓取方法,并且我毫不怀疑我能够设计出一个模拟控制台的表格式化程序。我真的在寻找MySQL或PHP原生的轻量级预构建解决方案。如果这样的选项不存在,我会满足于这个答案:如果我用\G终止一个查询会怎么样?输出完全从表格样式更改为垂直样式。我真的,真的不想写我自己的格式化程序,因为MySQL做得很好。@mikeB,如果你想要MySQL,就用MySQL吧。正如其他人所说,您可以从exec运行mysql,这正是我所需要的。
mysql>SELECT * WHERE 1=1

ERROR 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE 1=1' at line 1
mysql>UPDATE topics_search SET topic_id = topic_id WHERE topic_id = 2
Query OK, 0 rows affected (0 ms)
<?php
//Suppress E_DEPRECATED errors for statically calling a non-static method (this package is pretty old!)
error_reporting(E_ALL & ~E_DEPRECATED);
require __DIR__ . '/vendor/autoload.php';

//echo "<pre>"; #uncomment this line if running script in a browser

//The class isn't namespaced so just call it directly like so:
echo Console_Table::fromArray(
    ['column', 'headings'], 
    [
        ['1st row', 'values'], 
        ['2nd row', 'values'], 
        ['...', '...']
    ]
);
+---------+----------+
| column  | headings |
+---------+----------+
| 1st row | values   |
| 2nd row | values   |
| ...     | ...      |
+---------+----------+