【问题标题】:Get Result from Stored procedure MySql PHP in HTML Table从 HTML 表中的存储过程 MySql PHP 获取结果
【发布时间】:2016-03-27 12:28:43
【问题描述】:

我在数据库中有存储过程:

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 表输出。

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 ( SELECT DISTINCT 市场 AS val FROM production WHERE production_date = '2015-12-31' ORDER BY 1 ) AS top ) )

【问题讨论】:

    标签: php mysql stored-procedures


    【解决方案1】:

    我认为您可以简化存储过程并使用以下内容:

    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 ;  
    

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

    【讨论】:

    • 它没有用.. :( 我希望得到程序最终结果的输出并将其填充到 php html tabe
    • 让我们从检查存储过程本身开始。如果您手动调用存储过程,它是否返回正确的结果?还是返回错误的结果?一个错误?什么都没有?
    • 它给出了正确的结果让我更新和分享截图
    • 这在上面的例子中有效并且正在给出数组。唯一缺少的是最后的总计
    • 程序在传递参数时使用它。如果您需要多个条件,请将它们放在带有正确括号的参数中,它应该可以正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2018-12-27
    • 2010-11-13
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多