【问题标题】:CSV file upload with data validationCSV 文件上传和数据验证
【发布时间】:2017-02-03 18:12:01
【问题描述】:

我正在尝试使用 PhP 将 *.CSV 文件上传到数据库。 我不能真正使数据验证与文件上传一起工作。 该脚本应该通过在数据库表中搜索来查看来自某些单元格的数据是否有效。 如有错误,请勿上传文件!

这是代码!

<form name="import" method="post" enctype="multipart/form-data">
    <input type="file" name="file" /><br />
    <input type="submit" name="submit" value="Submit" />
</form>

<?php

    include ("connection2.php");

    if(isset($_POST["submit"]))
    {
        $file = $_FILES['file']['tmp_name'];
        $handle = fopen($file, "r");
        $c = 0;
        $err = 0;

        if ($_FILES["file"]["type"]=='application/vnd.ms-excel')
        {

            while(($filesop = fgetcsv($handle, 3000, ",")) !== false)
            {
                $tid = trim($filesop[0]);
                $beneficiar = ucwords(strtolower(trim($filesop[1])));   
                $locatie = ucwords(strtolower(trim($filesop[2])));
                $localitate = ucwords(strtolower(trim($filesop[3])));
                $judet = ucwords(strtolower(trim($filesop[4])));
                $adresa = ucwords(strtolower(trim($filesop[5])));
                $model = trim($filesop[6]);

                $query = mysqli_query("SELECT * FROM modele WHERE `model` = '".$model."'");
                if (!empty($query)) {
                    $err ++;
                    $msg=$msg."Model error on row $c <br>";
                }

                $query = mysqli_query("SELECT * FROM judete WHERE `nume` = '".$judet."'");
                if (!empty($query)) {
                    $err ++;
                    $msg=$msg."Judet error on row $c <br>";
                }

                $query = mysqli_query("SELECT * FROM beneficiari WHERE `nume` = '".$beneficiar."'");
                if (!empty($query)) {
                    $err ++;
                    $msg=$msg." Beneficiar error on row $c <br>";
                }

                // if (strlen($tid)!==8){
                    // $err ++;
                    // $msg=$msg."TID length error at row $c <br>";
                // }

                $c ++;
            }
            if ($err!==0){
                echo $msg;  echo "ERROR COUNT= ".$err;
                break;
            }

            $c=0;

            while(($filesop = fgetcsv($handle, 3000, ",")) !== false)
            { 
                $tid = trim($filesop[0]);
                $beneficiar = ucwords(strtolower(trim($filesop[1])));   
                $locatie = ucwords(strtolower(trim($filesop[2])));
                $localitate = ucwords(strtolower(trim($filesop[3])));
                $judet = ucwords(strtolower(trim($filesop[4])));
                $adresa = ucwords(strtolower(trim($filesop[5])));
                $model = trim($filesop[6]);

                $qry=mysql_query("SELECT id FROM beneficiari WHERE `nume` = '".$beneficiar."'");
                while ($row = mysql_fetch_assoc($qry)){
                    $id_client=$row['id'];
                    echo "Beneficiar=".$row['id'];
                }

                $qry_id_model=mysql_query("SELECT id FROM modele WHERE `model` = '".$model."'");
                while ($row = mysql_fetch_assoc($qry_id_model)){
                    $id_model=$row['id'];
                    echo "Model=".$row['id'];
                }
                echo "MODEL2:".$id_model;

                $adresa1 = $adresa.", ".$localitate;

                if ($c!==0){

                    $sql = mysql_query("INSERT INTO equipments 
                            (id_client, model, tid, beneficiar, adresa, agentie, judet) 
                            VALUES
                        ('$id_client','$id_model','$tid','$beneficiar','$adresa1','$locatie','$judet')");
                }
                $c = $c + 1; 
            }

            if($sql){
                echo "You database has imported successfully. You have inserted ". $c ." recordes <br>";
            }else{
                echo "Sorry! There is some problem.<br>";
            }

            echo "Upload: " . $_FILES["file"]["name"] . "<br />";
            echo "Type: " . $_FILES["file"]["type"] . "<br />";
            echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
            echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
        }
        else echo "NOT CSV!";
    }
?>

这里有什么问题?

当我尝试运行它时,数据没有上传并且没有显示错误,我在文件中留下了错误来测试它。我还上传了一个干净的文件,但文件也没有上传。如果我将代码分解为 2 并制作 2 个单独的代码,一个用于验证,一个用于上传,则上传有效,但我需要验证和上传在同一代码中。还尝试了 mysql_query 而不是 mysqli_query。

【问题讨论】:

  • 一些合理的代码缩进是个好主意。它可以帮助我们阅读代码,更重要的是,它将帮助 您调试代码 Take a quick look at a coding standard 为您自己谋福利。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。
  • 我已经添加了一个答案来解决您的代码中立即出现的一些问题 - 但是目前我们要做的只是"it's not working properly" - 关于究竟是什么不起作用会有所帮助。
  • @MacroMan 当我尝试运行它时,数据没有上传,也没有显示错误,我在文件中留下了错误来测试它,我上传了一个干净的文件,也没有上传文件.如果我将代码分解为 2 并制作 2 个单独的代码,一个用于验证,一个用于上传,则上传有效,但我需要验证和上传在同一代码中。还尝试了 mysql_query 而不是 mysqli_query
  • mysql_query 已贬值,不应使用 - 始终使用 mysqli_query - 您是否尝试按照我在回答中的建议将连接添加到该方法?跨度>
  • 我尝试了建议的 mysqli_query 但没有任何改变...什么都没有 :(

标签: php sql csv file-upload


【解决方案1】:

mysqli_query 的程序风格采用 2 个参数 - 连接和查询。你只是传递了查询。

您可以在此处阅读mysqli_query() 方法的官方文档:

http://php.net/manual/en/mysqli.query.php


关于如何解决此问题的建议如下:

$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");

if(!$link)
{
    echo("Unable to connect");
} else {
    if($ret = mysqli_query($link, "SELECT id FROM modele WHERE `model` = '".mysqli_real_escape_string($link, $model)."'"))
    {
        $data = mysqli_fetch_assoc($ret);
        echo($data["id"]);
    }

    mysqli_close($link);
}

重要提示:请注意我在上面的示例中使用了mysqli_real_escape_string - 您当前的代码使您容易受到 SQL 注入攻击。

【讨论】:

    【解决方案2】:

    首先,您应该将此文件上传到临时文件夹并保存文件名。然后使用getCSV php function 正确读取文件。

    最后,您可以检查是否一切正常,插入数据库,如果没有,则回显错误消息并删除文件(记住我们保存了名称,并且我们知道临时文件夹的静态路径)。

    希望对你有帮助!

    【讨论】:

    • 如果文件有错误,我不想上传任何行
    • 上传行?我正在谈论将文件临时存储以正确读取和检查错误
    猜你喜欢
    • 2011-07-07
    • 2014-10-17
    • 1970-01-01
    • 2011-10-02
    • 2017-06-18
    • 2015-02-25
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多