如何在数据库查询中使用会话和数组来存储和显示数据

Posted

技术标签:

【中文标题】如何在数据库查询中使用会话和数组来存储和显示数据【英文标题】:how to use sessions and arrays in a database query to store and display data 【发布时间】:2020-10-27 12:00:06 【问题描述】:

我想在输入数据后将数据保存到数组中并使用会话。我已经尝试过并且成功了。但我想显示一些从数据库中获取的数据并将其保存到数组和会话中。我试过添加数据库查询,但数据只能保存一个数据。

<?php
if (!isset($_SESSION)) 
session_start();
# code...



include_once "AlgoCBC.php";

function additem($jns, $hrg, $hrg_tw, $total, $kt_satu, $kt_dua, $kt_tiga, $kt_empat, $kt_lima, $kt_enam, $kt_tujuh)
    

    if (empty($_SESSION['$jns'])) 

        include "koneksi.php";

        $_SESSION['jenis'] = array();
        $jen = array_push($_SESSION['jenis'], $jns);
    
        
        foreach ($jen as $id) 
            
        
        $sql = mysqli_query($kns, "Select stok.id_stok as id_stok, merk.nama_merk as nama_merk, model.nama_model as nama_model, stok.warna as warna FROM stok INNER JOIN model On stok.id_model=model.id_model INNER JOIN merk ON model.id_merk=merk.id_merk where id_stok = '$id' ") or die(mysqli_error($kns));



                 while ($y=mysqli_fetch_array($sql)) 
                    $mrk[] = implode("", DekripCBC($y['nama_merk']));
                    $mdl[] = implode("", DekripCBC($y['nama_model']));
                    $wrn[] = implode("", DekripCBC($y['warna']));
                 

                

    $_SESSION['merk'] = array();
    $_SESSION['model'] = array();
    $_SESSION['warna'] = array();
    $_SESSION['kuantiti'] = array();
    $_SESSION['harga'] = array();
    $_SESSION['harga_tawar'] = array();
    $_SESSION['harga_jual'] = array();
    

    $kn = $kt_satu + $kt_dua + $kt_tiga + $kt_empat + $kt_lima + $kt_enam + $kt_tujuh;


    array_push($_SESSION['merk'], $mrk);
    array_push($_SESSION['model'], $mdl);
    array_push($_SESSION['warna'], $wrn);
    array_push($_SESSION['kuantiti'], $kn); 
    array_push($_SESSION['harga'], $hrg);
    array_push($_SESSION['harga_tawar'], $hrg_tw);
    array_push($_SESSION['harga_jual'],$total);





 function display()

if (!empty($_SESSION['merk'])) 
    $merk = $_SESSION['merk'];
$model =    $_SESSION['model'];
$warna =    $_SESSION['warna'];
$kuantiti =     $_SESSION['kuantiti'];
$harga =    $_SESSION['harga'];
$harga_tawar = $_SESSION['harga_tawar'];
$harga_jual = $_SESSION['harga_jual'];


$tgl = date('d-m-y');

echo '  <table class="table table-bordered table-striped text-gray-900" id="dataTable""> 
        <thead>

                <tr>
                <th colspan="5">'.$tgl.'</th>
                </tr>
                    <tr>

                      <th>Jenis Sepatu </th>
                      <th>Kuantiti</th>
                      <th>Harga</th>
                      <th>Harga Tawar</th>
                      <th>Total</th>
                    </tr>
              </thead>
              
    ';
$total=0;
$no = 1;
    for ($i = 0; $i < count($model); $i++ )  
        //$mk = implode("", $merk[$i]);
        //$md = implode("", $model[$i]);
        //$wr = implode("", $warna[$i]);
        
        echo '<tbody>
                    
                        <tr>
                        
                        <td>'.$merk[$i].' '.$model[$i].' '. $warna[$i].'</td>
                        <td>'.$kuantiti[$i].'</td>
                        <td>'.$harga[$i].'</td>
                        <td>'.$harga_tawar[$i].'</td>
                        <td>'.number_format($harga_jual[$i],0,',','.').'</td></tr>';

        $total = $total + $harga_jual[$i];
        

    

    echo '<tr><td>Total</td>
            <td></td>
            <td></td>
            <td></td>
            
            
            <td>'.number_format($total,0,',','.').'</td>
            
            </tr> </tbody> </table>';

    else 

    
  



  ?>

enter image description here

enter image description here

所以它只能保存 1 个数据。如果输入新数据,之前的数据就会丢失。

【问题讨论】:

问题是您在每次迭代中 覆盖 while 循环内的所有三个变量,所以当然只有最后一个记录“幸存下来”。您需要已经将值推送到该循环内的数组中。 我有点困惑,你能编辑我的代码吗,我应该改变哪一部分 如何将项目添加到这些会话条目中,您已经知道 - 您已经在显示的代码中执行此操作。所以把那部分移到while循环中。 在代码中使用die(mysqli_error($conn)); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die? 【参考方案1】:

您在每次迭代中都覆盖了 while 循环内的所有三个变量,这就是为什么您只得到一个结果(这是在 while 循环内执行的最后一个数据集。

基本上你可以做 3 件事来解决你的问题。

1.使用数组来存储你从循环中得到的所有结果

    while ($y=mysqli_fetch_array($sql)) 
          $mrk[] = implode("", DekripCBC($y['nama_merk']));
          $mdl[] = implode("", DekripCBC($y['nama_model']));
          $wrn[] = implode("", DekripCBC($y['warna']));
     

2.使用预定义的数组来存储您使用array_push从循环中获得的所有结果。

  /**There are 3 ways to define an empty array. You can use any of the following
      1.$emptyArray = [];
      2.$emptyArray = array();
      3.$emptyArray = (array) null;
   * */

  $dataSet =[];

    while ($y=mysqli_fetch_array($sql)) 
          $data['mrk'] = implode("", DekripCBC($y['nama_merk']));
          $data['mdl'] = implode("", DekripCBC($y['nama_model']));
          $data['wrn'] = implode("", DekripCBC($y['warna']));

        array_push($dataSet ,$data);
     

3.将值连接到变量中

  while ($y=mysqli_fetch_array($sql)) 
    // I have added a seprator(,) for all the variables so that there will be a , after every result and it wouldn't make you confused at the end
         $mrk .= implode("", DekripCBC($y['nama_merk'])).','; 
         $mdl .= implode("", DekripCBC($y['nama_model'])).',';
         $wrn .= implode("", DekripCBC($y['warna'])).',';
  

我强烈建议您使用方法 1 或 2。

希望这能帮助您解决问题。

如果您想使用查询搜索多个 id:(因为我在 cmets 中提到过,所以我将其添加到此处。)

前:

//You have multiple ids that you get from the session.

$jns = [12,13,4,5]; 

 //So now you can use a foreach loop to loop all the ids and use the query to get relevant data

 foreach($jns as $id)
     $sql = mysqli_query($kns, "Select stok.id_stok as id_stok, merk.nama_merk as nama_merk, model.nama_model as nama_model, stok.warna as warna FROM stok INNER JOIN model On stok.id_model=model.id_model INNER JOIN merk ON model.id_merk=merk.id_merk where id_stok = '$id' ") or die(mysqli_error($kns));

    while ($y=mysqli_fetch_array($sql)) 
       $mrk[] = implode("", DekripCBC($y['nama_merk']));
       $mdl[] = implode("", DekripCBC($y['nama_model']));
       $wrn[] = implode("", DekripCBC($y['warna']));
     
  

通过这种方法你可以得到上面提到的ids的所有数据并将其分配给数组。

【讨论】:

我尝试使用数字2,但是数据库中的数据没有出现,只保存了最后一个数据。我尝试了 3 号,数据库中的数据出现但只保存最后一个数据。我尝试了 1 号,但出现以下错误:注意:第 91 行的数组到字符串的转换:'.$merk[$i].' '.$model[$i].' '.$warna[$i].' 你能给出所有代码应该改变哪些部分吗?也许不是在while循环中,但下面有一段必须改变 conver 字符串数组中的问题 1 已由 imploade 解决。但它仍然只能捕获最新数据 您确定您的查询返回了超过 1 个数据集吗? 是的,我试过输入第一个数据,但是输入第二个数据后,第一个数据丢失了,只出现了第二个数据。【参考方案2】:

导致此问题的原因是它正在添加到变量中,并且由于相同的变量名,每次都会覆盖相同的变量。 您要么他们需要清空这些变量,要么将它们推送到其他地方并可以使用它。

为此,我们可以使用 php 函数 array_push 将它们推送到主数组中。

$master = array();
while ($y=mysqli_fetch_array($sql)) 
                    $data['mrk'] = implode("", DekripCBC($y['nama_merk']));
                    $data['mdl'] = implode("", DekripCBC($y['nama_model']));
                    $data['wrn'] = implode("", DekripCBC($y['warna']));
                    array_push($master,$data);
                 

【讨论】:

我尝试使用,但是数据库中的数据没有出现,只保存了最后的数据。 你能给出所有代码应该更改哪些部分吗?可能不在while循环中,但下面有一个部分必须更改

以上是关于如何在数据库查询中使用会话和数组来存储和显示数据的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 Firebase 原始数据中的会话长度和会话数?

如何使用会话数组检查复选框

如何在会话存储中使用相同的键更新数组

将数据库记录存储到数组中

如何存储用户的会话数据

如何迅速杀掉数据库里inactive的会话