格式化MySQL查询的结果,就好像它是从控制台运行一样

Mik*_*e B 12 php mysql formatting zend-framework

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

mysql> select * from users;
+-----------+------------+-------+
| firstname | city       | zip   |
+-----------+------------+-------+
| Maria     | Holland    | 12345 |
| Rene      | Doylestown | 65432 |
| Helen     | Conway     | 98745 |
+-----------+------------+-------+
3 rows in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

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

mfo*_*nda 12

您可以使用Console_Table PEAR包很容易地完成此操作.只需遍历MySQL结果,并向表中添加行.您可以使用该Console_Table::setHeaders()方法为列添加标题,然后Console_Table::addRow()添加每行的方法,最后Console_Table::getTable()显示它.

PHP没有内置任何功能.如果你不想使用/编写代码来绘制控制台表,只需-e query通过PHP 传递给mysql passthru().这将工作与两端封查询;\G:

passthru("mysql -e '$query;' database_name");
Run Code Online (Sandbox Code Playgroud)


ehu*_*kai 5

你必须自己做.

做一个循环来找到每列的最大大小.然后将每行填充输出到该大小+2,并在开头和结尾添加一个空格.用|分隔每列.

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

如果不知道你用什么来获得结果,很难给出一个具体的例子.但假设你正在使用mysql_query.这是一个例子.

$conn = mysql_connect("localhost", "mysql_user", "mysql_password");
mysql_select_db("mydbname");
$result = mysql_query("SELECT * FROM myTable");
//first get your sizes
$sizes = array();
$row = mysql_fetch_assoc($result);
foreach($row as $key=>$value){
    $sizes[$key] = strlen($key); //initialize to the size of the column name
}
while($row = mysql_fetch_assoc($result)){
    foreach($row as $key=>$value){
        $length = strlen($value);
        if($length > $sizes[$key]) $sizes[$key] = $length; // get largest result size
    }
}
mysql_data_seek($result, 0); //set your pointer back to the beginning.

//top of output
foreach($sizes as $length){
    echo "+".str_pad("",$length+2,"-");
}
echo "+\n";

// column names
$row = mysql_fetch_assoc($result);
foreach($row as $key=>$value){
    echo "| ";
    echo str_pad($key,$sizes[$key]+1);
}
echo "|\n";

//line under column names
foreach($sizes as $length){
    echo "+".str_pad("",$length+2,"-");
}
echo "+\n";

//output data
do {
    foreach($row as $key=>$value){
        echo "| ";
        echo str_pad($value,$sizes[$key]+1);
    }
    echo "|\n";
} while($row = mysql_fetch_assoc($result));

//bottom of output
foreach($sizes as $length){
    echo "+".str_pad("",$length+2,"-");
}
echo "+\n";
Run Code Online (Sandbox Code Playgroud)

那样做(我希望我没有错过那里的分号:)).

希望有所帮助!