通过逐行从数据库中获取数据,使用 PHP/MySQL 生成 QR 码

Posted

技术标签:

【中文标题】通过逐行从数据库中获取数据,使用 PHP/MySQL 生成 QR 码【英文标题】:QR Code generation using PHP/MySQL by fetching data from database row by row 【发布时间】:2019-06-22 03:36:57 【问题描述】:

我在使用 php 和 SQL 生成二维码时被困在这里。基本上,我在从数据库中获取数据时使用他们的 id 和其他信息为学生生成代码。但问题是当我点击提交按钮时,表格数据存储在二维码中,然后它只生成最后一个学生的二维码。

我在每一行上创建提交按钮,以便当我点击提交按钮时,将该特定行的数据提交到 QR 图像。但问题是,当我单击任何行的提交按钮时,它会生成表中最后一个学生的 qr 图像。例如,如果 1 表中有 10 个学生,则生成 id 为 10 且位于表最后一行的学生的图像。

代码可在此处获得:

<?php
    include('qrlib.php'); 
    function getUsernameFromEmail($student_id) 
        $find = '@';
        $pos = strpos($student_id, $find);
        $username = substr($student_id, 0, $pos);
        return $username;
    
    if(isset($_POST['submit']) ) 
        $tempDir = 'temp/'; 
        $student_id = $_POST['student_id'];
        $fname =  $_POST['fname'];
        $filename = getUsernameFromEmail($student_id);

        $codeContents = 'mailto:'.$student_id.'?id='.urlencode($student_id).'&fname='.urlencode($fname); 
        QRcode::png($codeContents, $tempDir.''.$filename.'.png', QR_ECLEVEL_L, 5);
    
?>

表格:

<form id="demo-form2" method="post"  data-parsley-validate class="form-horizontal form-label-left" > 

                                      <table id="datatable" class="table table-striped table-bordered">
                  <thead>
                    <tr>
                      <th>Student Id</th>
                      <th>First Name</th>
                      <th>Actions</th>

                    </tr>
                  </thead>
                      <tbody>
                        <?php
                            include("includes/connection2.php");

                            $sql = "SELECT * FROM student";
                            $result=mysql_query($sql); //rs.open sql,con

                        while ($row=mysql_fetch_array($result))
                         ?><!--open of while -->
                        <tr>
                            <td><input type="text" value="<?php echo $row['student_id']; ?>" name="student_id" ></td>
                            <td><input type="text" value="<?php echo $row['fname']; ?>" name="fname" ></td>
                        <td class="center">
                                <div class="form-group">
                    <input type="submit" name="submit" class="btn btn-primary submitBtn" style="width:20em; margin:0;" />
                </div>
                            </td>
                            <td class="center">

                            </td>   
                        </tr>
                                                            <?php
                            //close of while
                        ?>
                      </tbody>
                       <?php
        if(!isset($filename))
            $filename = "author";
        
        ?>
        <div class="qr-field">
            <h3>QR Code Result: </h3>
            <center>
                <div class="qrframe" style="border:2px solid black; width:210px; height:210px;">
                    <?php echo '<img src="temp/'. @$filename.'.png" style="width:200px; height:200px;"><br>'; ?>
                </div>
    <a class="btn btn-primary submitBtn" style="width:50px; margin:1px 0;" href="download.php?file=<?php echo $filename; ?>.png ">Download QR Code</a>
            </center>
        </div>
                </table>
                        </div>
                </div>
              </div>
            </div>
</div>
        </div>   
                </form>

【问题讨论】:

(1) 在 PHP 端您尝试访问“student_id”。它来自哪里?,(2)您应该在发送之前正确缩进您的代码,(3)您应该创建重现您的问题的代码的最小版本。这将帮助您调试,如果您不成功 - 将帮助其他人帮助您。 我已经编辑了可以成功下载 QR 图像的代码,但是使用此代码我只能下载 id 位于末尾的学生的 QR 图像,即使我单击任何学生的提交按钮也是如此。如果您能解决我的问题并查看此代码。谢谢! 如果你真的能回答你提出的问题,那么人们帮助你会容易得多。您上面的所有评论都是重新陈述您的问题,我们已经知道了。 【参考方案1】:

您为每一行创建一个提交按钮,但所有这些按钮都在同一个表单内,因此它们都做同样的事情:提交整个表单及其所有输入。

您将每个学生的 student_id 存储在其自己的输入标签中,因此每个学生都有一个,但所有输入都具有相同的名称:“student_id”。

当表单被提交时(不管是哪个特定的提交按钮导致它被提交) - 所有输入的数据都被发送,但由于它们都具有相同的名称 - 最后一个值会覆盖所有其余的值。这就是为什么您总是只获得最后一个学生的结果。

解决此问题的一种方法是为每个学生设置单独的表格,但这不适用于当前的表格结构。

另一种选择是给每个提交按钮一个唯一的名称,然后根据提交按钮的名称确定在PHP端提交的是哪个学生。

另一种选择是不为每个学生设置一个提交按钮,而在表单底部只有一个提交按钮。然后,为每个学生添加一个具有唯一值(可能是 student_id)的单选按钮。这样,提交表单就会将选中学生的student_id发送到服务器。

处理这个问题的“正确”方法可能是使用 javascript

【讨论】:

以上是关于通过逐行从数据库中获取数据,使用 PHP/MySQL 生成 QR 码的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ajax 逐行获取数据

PHP - 将html textarea中的数据逐行放入变量中

C#中IDataReader和DataSet的区别是啥呢?

如何通过命令行从多个文件夹中获取完整文件名到 csv

Pandas:按行从 DataFrame 的特定列中选择值

如何在jsp中显示java中的ArrayList项?