PHP 用于在 while 命令中生成代码的变量

PHP variable used to generate code in a while command

我一直在构建 Google 图表,并且有很多 'fun' 让我的 SQL 命令满足 Google 的要求,但是,我终于完成后,现在需要继续处理更复杂的部分。可变数量的元素。

我的图表基于用户拥有的商店数量,我一直在使用基于迄今为止拥有三个商店的虚拟 set-up,但用户可以拥有 n 存储并需要调整我的 google 图表以适应这个变量输入。

到目前为止,我做得很好,我使用查询来提取用户拥有的商店数量,然后将其替换为 SQL 查询,因此我们 return 正确的数字Google 图表数据集中的行数,我可以将商店名称替换为 header,只是 PHP 我发现谷歌搜索将 SQL 输出写入Google 我正在苦苦挣扎的图表预期格式。

function drawChart1() {
    var data = google.visualization.arrayToDataTable([
        ['Month', 'Store A', 'Store B', 'Store C'],
    <?php 
        $sql = "SELECT
                DATE_FORMAT(date_submitted,'%b-%y') AS 'Month',
            CAST(((SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = 1 THEN 1 ELSE 0 END)/SUM(CASE WHEN store_list = 1 THEN 1 ELSE 0 END))*100) as decimal (10,1)) AS 'Store A',
            SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = 1 THEN 1 ELSE 0 END) AS 'Store A_Base',
            CAST(((SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = 2 THEN 1 ELSE 0 END)/SUM(CASE WHEN store_list = 2 THEN 1 ELSE 0 END))*100) as decimal (10,1)) AS 'Store B',
            SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = 2 THEN 1 ELSE 0 END) AS 'Store B_Base',
            CAST(((SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = 3 THEN 1 ELSE 0 END)/SUM(CASE WHEN store_list = 3 THEN 1 ELSE 0 END))*100) as decimal (10,1)) AS 'Store C',
            SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = 3 THEN 1 ELSE 0 END) AS 'Store C_Base'
        FROM data 
                WHERE store_list IN (" . $user_stores . ")
                GROUP BY YEAR(date_submitted), MONTH(date_submitted)
                ORDER BY YEAR(date_submitted) ASC, MONTH(date_submitted) ASC";

        $Sat = mysqli_query($conn,$sql);
        while($row = mysqli_fetch_array($Sat)){
            echo "['".$row['Month']."',".$row['Store A'].",".$row['Store B'].",".$row['Store C']."],";
        }
    ?> 
]);

所以,一切正常,给了我三个虚拟商店 1、2、3(商店 A、商店 B 和商店 C),并制作了一个漂亮的小图表。 所以我将其调整为以下内容:

    <?php
    //dynamically build chart queries
    $sql_prep = "SELECT d.store_list AS NUMB, s.name AS NAME FROM data d INNER JOIN store_list s ON d.store_list=s.store_id WHERE d.status != '' AND d.store_list IN (" . $user_stores . ") GROUP BY store_list";
    $sql_code = $conn->query($sql_prep);
        while($row = $sql_code->fetch_assoc()) {
        $select = $select . "CAST(((SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = " . $row['NUMB'] . " THEN 1 ELSE 0 END)/SUM(CASE WHEN store_list = " . $row['NUMB'] . " THEN 1 ELSE 0 END))*100) as decimal (10,1)) AS  '" . $row['NAME'] . "',SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = " . $row['NUMB'] . " THEN 1 ELSE 0 END) AS '" . $row['NAME'] . "_Base',";
        $cstores = $cstores . "'" . $row['NAME'] . "', " ;
        $carray = $carray . ",\".$row['" . $row['NAME'] . "'].\"";
        }
    ?>
...
function drawChart1() {
    var data = google.visualization.arrayToDataTable([
    ['Month', <?php echo $cstores ?>],
    <?php 
        $sql = "SELECT
            " . $select . "
            DATE_FORMAT(date_submitted,'%b-%y') AS 'Month'
        FROM data 
        WHERE store_list IN (" . $user_stores . ")
        GROUP BY YEAR(date_submitted), MONTH(date_submitted)
        ORDER BY YEAR(date_submitted) ASC, MONTH(date_submitted) ASC";

        $Sat = mysqli_query($conn,$sql);
        while($row = mysqli_fetch_array($Sat)){
             echo "['".$row['Month']."'".$carray."],";
        }
    ?> 

]);

它几乎就在那里,$select 工作,然后我更换了 $cstores,它仍然工作,但我被困在 $carray 上。如果我回应它,​​它完美地构建了进入那里所需的字符串,创建 ,".$row['Store A'].",".$row['Store B'].",".$row['Store C']." 但这不起作用所以显然 PHP 不支持(我真的不知道,我只是不断地用不同的方式戳它直到它起作用)

所以我现在卡住了。我需要将商店的 n 列写到构建 Google 图表的数组中,但我对 PHP 的理解很差。如果您不知道商店 A、商店 B 等的 header 列,是否有更好的写法 echo "['".$row['Month']."',".$row['Store A'].",".$row['Store B'].",".$row['Store C']."],";

知道了,有点变通,但更新了 SQL 并将输出更改为 Google 图表:

<?php
//dynamically build chart queries
$sql_prep = "SELECT d.store_list AS NUMB, s.name AS NAME FROM data d INNER JOIN store_list s ON d.store_list=s.store_id WHERE d.status != '' AND d.store_list IN (" . $user_stores . ") GROUP BY store_list";
$sql_code = $conn->query($sql_prep);
$select = '';
    while($row = $sql_code->fetch_assoc()) {
        $select .= ", CAST(((SUM(CASE WHEN LOWER(`q3`) = 'no' AND store_list = " . $row['NUMB'] . " THEN 1 ELSE 0 END)/SUM(CASE WHEN store_list = " . $row['NUMB'] . " THEN 1 ELSE 0 END))*100) as decimal (10,1)) AS  '" . $row['NAME'] . "' ";
        $cstores = $cstores . "'" . $row['NAME'] . "', " ;

    }
?>

<!--https://google-developers.appspot.com/chart/interactive/docs/gallery/linechart-->
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">

  google.charts.load('current', {'packages':['corechart']});
  google.charts.setOnLoadCallback(drawChart1);

  function drawChart1() {
var data = google.visualization.arrayToDataTable([
['Month', <?php echo $cstores ?>],
<?php 

    $sql = "SELECT
            QUOTE(DATE_FORMAT(date_submitted,'%b-%y')) AS 'Month'
            ". $select ."
        FROM data 
        WHERE store_list IN (" . $user_stores . ")
        GROUP BY YEAR(date_submitted), MONTH(date_submitted)
        ORDER BY YEAR(date_submitted) ASC, MONTH(date_submitted) ASC";

    $Sat = mysqli_query($conn,$sql);
    foreach( $Sat as $key => $array ) {
        echo("[");
        foreach( $array as $attribute => $value ) {
            echo $value. ",";
        }
        echo("],");
    }
?>