【问题标题】:Exporting encrypted record to csv file from mysql table in PHP fails将加密记录从 PHP 中的 mysql 表导出到 csv 文件失败
【发布时间】:2018-11-10 09:03:56
【问题描述】:

我有一个 PHP 页面,它从我的 SQL 表中选择记录并将记录的加密版本发送到 CSV 文件。我的问题是:当我选择记录而不使用 openssl 加密时,它会成功导出,但是,如果我包含加密它会打开一个空白屏幕。

我希望能在这里得到帮助。非常感谢提前

This is my code:

  <?php

    // Database Connection
    require("xxx.php");
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'))
    $encryption_key = 'bRuD5WYw5wd0rdHR9yLlM6wt2vteuiniQBqE70nAuhU=';

     $result='select   *
            from encrypt';


            $file='grade/file'.date('YmdDH_i_s').'.csv';
            $qry = "select * from gb_centre where use_flag=1";
            $rs = mysqli_query($con,$qry);
            $getRowAssoc = mysqli_fetch_assoc($rs);
    $query = (
        openssl_encrypt($result->uniqueid,'AES-256-CBC',$encryption_key,0,$iv),
        openssl_encrypt($result->username,'AES-256-CBC',$encryption_key,0,$iv),
    openssl_encrypt($result->shortname,'AES-256-CBC',$encryption_key,0,$iv),
    openssl_encrypt($result->rawgrade,'AES-256-CBC',$encryption_key,0,$iv),
    openssl_encrypt($result->finalgrade,'AES-256-CBC',$encryption_key,0,$iv),
    openssl_encrypt($result->cid,'AES-256-CBC',$encryption_key,0,$iv),
    openssl_encrypt($result->id,'AES-256-CBC',$encryption_key,0,$iv)

    );


    if (!$result = mysqli_query($con, $query)) {
        exit(mysqli_error($con));
    }

    $users = array($uniqueid,$username,$shortname,$rawgrade,$finalgrade,$cid,$id);
    if (mysqli_num_rows($result) > 0) {
        while ($row = mysqli_fetch_assoc($result)) {
            $users[] = $row;
        }
    }

    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename='.$getRowAssoc['cid'].date('_Y-m-d_Hi').'.csv');
    $output = fopen('php://output', 'w');
    fputcsv($output, array('a1', 'a2', 'a3', 'a4', 'a5','a6','a7'));

    if (count($users) > 0) {
        foreach ($users as $row) {
            fputcsv($output, $row);
        }
    }

    ?>

**

编辑

** 我已经编辑了代码部分,它现在可以使用 PHP OpenSSL 将记录导出到 csv 并且工作正常,问题是,它在 CSV 文件中添加了额外的列。我无法弄清楚错误在哪里。 这是编辑后的代码:

<?php
// Database Connection
require("config.php");
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$key = 'bRuD5WYw5wd0rdHR9yLlM6wt2vteuiniQBqE70nAuhU=';
$encryption_key = 'bRuD5WYw5wd0rdHR9yLlM6wt2vteuiniQBqE70nAuhU=';
$string='select   *
        from encrypt'
$qry = "select * from gb_centre where use_flag=1";
        $rs = mysqli_query($con,$qry);
        $getRowAssoc = mysqli_fetch_assoc($rs);
if (!$result = mysqli_query($con, $string)) {
    exit(mysqli_error($con));
}


if (mysqli_num_rows($result) > 0) {
    while ($row = mysqli_fetch_assoc($result)) {

        $uniqueid[] = openssl_encrypt($row->uniqueid,'AES-256-CBC',$encryption_key,0,$iv);
    $username[] = openssl_encrypt($row->username,'AES-256-CBC',$encryption_key,0,$iv);
    $shortname[] = openssl_encrypt($row->shortname,'AES-256-CBC',$encryption_key,0,$iv);
    $rawgrade[] = openssl_encrypt($row->rawgrade,'AES-256-CBC',$encryption_key,0,$iv);
    $finalgrade[] = openssl_encrypt($row->finalgrade,'AES-256-CBC',$encryption_key,0,$iv);
    $cid[] = openssl_encrypt($row->cid,'AES-256-CBC',$encryption_key,0,$iv);
    $id[] = openssl_encrypt($row->id,'AES-256-CBC',$encryption_key,0,$iv);
    }
}
$users = array($uniqueid,$username,$shortname,$rawgrade,$finalgrade,$cid,$i);
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename='.$getRowAssoc['cid'].date('_Y-m-d_Hi').'.csv');
$output = fopen('php://output', 'w');
fputcsv($output, array('a1', 'a2', 'a3', 'a4', 'a5','a6','a7'));

if (count($users) > 0) {
    foreach ($users as $row1) {
        fputcsv($output, $row1);
    }
}

?>

【问题讨论】:

  • $query 似乎只是一个值列表,而不是实际查询。您还缺少;$iv。我会得到一个有 linter 的代码编辑器。我推荐“原子”。它是免费的,而且做得很好。
  • 感谢您的回复,我正在尝试在 $query 中引用上面的 $result 查询。请问,我做错了什么?非常感谢

标签: php mysql php-openssl


【解决方案1】:

您似乎很难掌握执行查询的基础知识。我只想编写一些简单的代码来获取并显示单个查询的结果。然后当你得到这个想法时,你可以在你的代码中添加更多内容。

这是一个使用准备好的语句的示例。这将防止 sql 注入。您应该学习如何为所有查询使用准备好的语句。这是一个很好的资源的链接,它将教您如何执行您需要正确执行的任何查询。将此链接加入书签并经常参考。 MySQLi Prepared Statements

此代码将从查询返回的结果的每一行中打印出 uniqueid。

$query = "SELECT * 
FROM gb_centre 
WHERE use_flag = ?";

$stmt = $con->prepare($query);
$stmt->bind_param('i', 1); //set your bindings
$stmt->execute();
while ($result = $stmt->fetch_object()) {

  echo $result->uniqueid . '<br>';

}

【讨论】:

  • 我已经修改了查询,但它仍然没有将加密数据写入 CSV 文件,它只在页面加载时显示一个空白页面。请提供任何帮助。
  • 我上面的代码是要自己运行的。通过这种方式,您可以学习如何管理您的查询,然后在此基础上进行构建。您的代码中有错误。这将有助于简化它,以便您从中学习。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多