繁体   English   中英

从HTML表中的存储过程MySql PHP获取结果

[英]Get Result from Stored procedure MySql PHP in HTML Table

我已经在数据库中存储了过程:

DELIMITER $$

USE `billing`$$

DROP PROCEDURE IF EXISTS `Pivot`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Pivot`(
    IN tbl_name VARCHAR(99),       -- table name (or db.tbl)
    IN base_cols VARCHAR(99),      -- column(s) on the left, separated by commas
    IN pivot_col VARCHAR(64),      -- name of column to put across the top
    IN tally_col VARCHAR(64),      -- name of column to SUM up
    IN where_clause VARCHAR(99),   -- empty string or "WHERE ..."
    IN order_by VARCHAR(99)        -- empty string or "ORDER BY ..."; usually the base_cols
    )
    DETERMINISTIC
    SQL SECURITY INVOKER
BEGIN
    -- Find the distinct values
    -- Build the SUM()s
    SET @subq = CONCAT('SELECT DISTINCT ', pivot_col, ' AS val ',
                    ' FROM ', tbl_name, ' ', where_clause, ' ORDER BY 1');
    -- select @subq;
    SET @cc1 = "CONCAT('SUM(IF(&p = ', &v, ', &t, 0)) AS ', &v)";
    SET @cc2 = REPLACE(@cc1, '&p', pivot_col);
    SET @cc3 = REPLACE(@cc2, '&t', tally_col);
    -- select @cc2, @cc3;
    SET @qval = CONCAT("'\"', val, '\"'");
    -- select @qval;
    SET @cc4 = REPLACE(@cc3, '&v', @qval);
    -- select @cc4;
    SET SESSION group_concat_max_len = 10000;   -- just in case
    SET @stmt = CONCAT(
            'SELECT  GROUP_CONCAT(', @cc4, ' SEPARATOR ",\n")  INTO @sums',
            ' FROM ( ', @subq, ' ) AS top');
     SELECT @stmt;
    PREPARE _sql FROM @stmt;
    EXECUTE _sql;                      -- Intermediate step: build SQL for columns
    DEALLOCATE PREPARE _sql;
    -- Construct the query and perform it
    SET @stmt2 = CONCAT(
            'SELECT ',
                base_cols, ',\n',
                @sums,
                ',\n SUM(', tally_col, ') AS Total'
            '\n FROM ', tbl_name, ' ',
            where_clause,
            ' GROUP BY ', base_cols,
            '\n WITH ROLLUP',
            '\n', order_by
        );
    SELECT @stmt2;                    -- The statement that generates the result
    PREPARE _sql FROM @stmt2;
    EXECUTE _sql;                     -- The resulting pivot table ouput
    DEALLOCATE PREPARE _sql;
    -- For debugging / tweaking, SELECT the various @variables after CALLing.
END$$

DELIMITER ; 

当我传递一个SQL语句时,我想捕获带有列标题的行中的最终结果,并将其传递给PHP上的HTML Table输出。

CALL Pivot('production','product_name','market','forcast_qty',\\“ WHERE production_date ='2015-12-31'\\”,'');

到目前为止,当我对以下过程进行编码以获取输出时,我正在获取数组,而不是存储过程的最终结果。

if(isset($_POST['planned_forecast']))
{
if(isset($_POST['production_date'])){ $date_prod = $_POST['production_date']; } 
$stmt = $DB_con->prepare("CALL Pivot('production', 'product_name', 'market', 'forcast_qty', \"WHERE production_date = '2015-12-31'\", '');");
$stmt->execute();
while ($row  = $stmt->fetchAll(PDO::FETCH_ASSOC))
{
print_r($row);
}
echo '
<thead>';
   echo '
</thead>
';
echo '
<tbody>
   ';
   echo '
   <tr>
      ';
      echo '
      <td></td>
      ';
      echo '
   </tr>
   ';
   echo '
</tbody>
';
echo '</table>';
echo '<input hidden="true" name="date_prod" type="text" value="'.$date_prod.'"/>';
echo '<button type="submit" class="btn btn-default waves-effect waves-light" name="btn-editforcast" id="btn-editforcast">Update</button>';
}

结果:

数组([0] =>数组([@stmt] => SELECT GROUP_CONCAT(CONCAT('SUM(IF(market =','“',val,'”',',forcast_qty,0))AS',' “',val,'”'')分隔符“,”)INTO @sums FROM(选择不同的市场AS VAL FROM production WHERE production_date ='2015-12-31'ORDER BY 1)AS top))

在此处输入图片说明

我认为您可以简化存储过程,并使用以下方法:

DELIMITER $$

USE `billing`$$

DROP PROCEDURE IF EXISTS `Pivot`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `Pivot`(
    IN tbl_name VARCHAR(99),       -- table name (or db.tbl)
    IN base_cols VARCHAR(99),      -- column(s) on the left, separated by commas
    IN pivot_col VARCHAR(64),      -- name of column to put across the top
    IN tally_col VARCHAR(64),      -- name of column to SUM up
    IN where_clause VARCHAR(99),   -- empty string or "WHERE ..."
    IN order_by VARCHAR(99)        -- empty string or "ORDER BY ..."; usually the base_cols
    )
    DETERMINISTIC
    SQL SECURITY INVOKER
BEGIN

    -- Prepare the "pivot" part of the query
    SET @stmt = CONCAT(

        "SELECT GROUP_CONCAT(\" SUM(\" ",
        "                    \"   CASE WHEN ", pivot_col, "='\", ", pivot_col, ", \"'\"  ",
        "                    \"         THEN ", tally_col, "\"  ",
        "                    \"         ELSE 0\"  ",
        "                    \"    END\"  ",
        "                    \") AS '\", ", pivot_col, ", \"'\n\") as stmt FROM (select distinct ", pivot_col, " FROM ", tbl_name, ") A INTO @sum_clause"    
    );


    PREPARE _sql FROM @stmt;
    EXECUTE _sql;                     
    DEALLOCATE PREPARE _sql;

        -- Prepare and execute the query itself
    SET @stmt = CONCAT(
        "SELECT ", base_cols, ", ", 
        @sum_clause,
        ", SUM(", tally_col, ") as 'Total qty'"
        " FROM ", tbl_name, " \n" ,
        where_clause, "\n",
        " GROUP BY ", base_cols
        );

    PREPARE _sql FROM @stmt;
    EXECUTE _sql;                     
    DEALLOCATE PREPARE _sql;

END$$

DELIMITER ;  

我不能保证它适用于所有情况,但是它适用于示例中使用的参数,并且产生的结果与原始问题中的结果相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM