【问题标题】:php Undefined offset csv file uploadphp未定义偏移量csv文件上传
【发布时间】:2021-07-20 05:29:53
【问题描述】:

我正在尝试从 CSV 文件导入和获取数据并将其存储在我的数据库中 我的数据库表架构是这样的
用户(ID、Fname、Lname、user_type、major、Bday、Email、密码、图像、状态)
csv (111, Leo, pichon, , business, , leo@yzu.cn) 这是我的 csv 文件架构,列只匹配我的数据库架构所需的字段,它的类似如下: '' 空字段要么有默认值,要么为空 ''

导入后,我的数据文件几乎每一行都会收到以下通知: 未定义的偏移量:php csv 中的 1 这是我的 php 函数:

if ($_GET['action'] = 'UsersCvs') {

if (isset($_FILES['users_cvs']['name'])) {
    $file = $_FILES['users_cvs']['tmp_name'];
    if ($_FILES["users_cvs"]["size"] > 0) {


        $handle = fopen($file, "r");
        $c = 0;
        while (($files = fgetcsv($handle, 2000, ",")) !== false) {

            // $id = mysqli_real_escape_string($link , $files[0]);
            // $fname = $files[1];
            // $lname =  $files[2];
            // $user_type = $files[3];
            // $major = $files[4];
            // $email = $files[6];
            // $gender = mysqli_real_escape_string($link, $filesop[6]);
            //$sql = "INSERT INTO users(ID , Fname,Lname , user_type , major , Email) values ('" . $id . "','" . $fname . "' ,'" . $lname . "' ,'" .$user_type. "','" . $major . "','" . $email . "')";

            // mysqli_query($link, $sql);
            $num = count($files);
            echo "<p> $num fields in row $c: <br /></p>\n";
            $c++;
            for ($i = 0; $i < $num; $i++) {
                echo $files[$i] . "<br />\n";
            }
        
        }
        fclose($file);
        // if ($sql) {
        //     echo 1 ;
        // } else {
        //     echo mysqli_error($link); ;
        // }
    } else {

    }
}else{
    echo 'no file found';
}

}

对我来说似乎很奇怪,经过检查,我的数据被编码为不可读的字符串 像这样的

 <p> 3 fields in line 2: <br /></p>

�Ѷѩ\h�1�������
��dr
KK(G~�S⼥���Nw|x���
�s�k�Ŗ�X���J�fb�fWш�eʬ�y�`hc�g�

第 3 行中的 1 个字段:

��y��Q�b~����^�)�Ϸ��������LD?��r�:��DN��(����C��*T�? �C��!�&�e���!_�8��+[�|��PK�N�@}�":[docProps/core.xml��QK�0���C�{ ��cm*{r 8Q|��lҐD��{�v����c�9���^R������:���� Ah����%zٮ����gZ�� �P�8��no

第 4 行中的 2 个字段:

我已经尽了最大努力并进行了在线研究,但我找不到任何匹配的参考资料 我非常感谢您提前提供帮助

【问题讨论】:

  • 您对SQL Injections 持开放态度,应该使用参数化准备好的语句而不是手动构建查询。它们由PDOMySQLi 提供。永远不要相信任何形式的输入!即使是受信任的用户,you are still at risk of corrupting your dataEscaping is not enough.
  • 您确定您正在阅读正确的文件吗?检查 $file 的值。
  • 你的表单方法是get还是post?不确定您是否可以使用 get 上传。
  • 是的,我正在阅读正确的文件,我正在使用 ajax post 方法,并将操作附加到我的 url 以指示我的操作类型
  • 我没有插入数据,但它似乎是在从文件中读取后立即注入的

标签: php mysql ajax csv


【解决方案1】:

您尝试处理的文件不是 CSV 文件,而是 Excel 工作簿(“.xlsx”文件)。

这里有两条线索:

  • 首先,您清楚地看到的数据不是人类可读的文本。 CSV 文件只是按照特定约定格式化的文本文件,而这看起来很像仅供机器使用的二进制数据。
  • 您发布的非常短的 sn-p 恰好包含字符串“docProps/core.xml”。如果你在网上搜索,你会得到很多对现代版本的 Microsoft Office 使用的“Office Open XML”格式的引用。这些文件的结构是一个包含多个 XML 文件的 zip 文件,这是 zip 中一个内部文件的名称。

您应该做的第一件事是向您的代码添加一些验证。来自用户的输入总是需要验证,在这种情况下,检查预期的字段数量或强制性标题行会立即给你一个错误。

您应该做的第二件事是 a) 告诉用户将电子表格导出为 CSV 文件,或者 b) 使用可以读取 Excel 文件的库(例如 PhpSpreadsheet)重新编写代码。

【讨论】:

  • 这正是发生的事情,我记得我将数据粘贴到现有的 .xlsx 文件中并手动更改了文件名加上 .csv 格式,我认为这会将我的文件解析为 .csv 格式,我有一个上传前验证但是我只是验证文件名 .csv 不幸的是这必须通过我的验证。非常感谢你拯救了我的一天,如果我可以问更多,我如何验证文件的核心格式而不仅仅是使用 JS 或 PHP 的名称?再次感谢
  • @HAMMASI 没有验证文件格式的通用方法,因为最终所有文件都只是一串位。但是,对于 CSV 文件,这真的很容易:如果您始终具有相同的标题,则该行在每个上传的文件中都应该相同,如果不存在,您可以立即给出错误。然后,当您加载每一行时,您可以验证它是否具有正确的列数,也许您期望的列是数字,等等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多