【问题标题】:How to insert many variables into database with greatest ease and speed如何以最大的方便和速度将许多变量插入数据库
【发布时间】:2016-05-25 14:33:21
【问题描述】:

我试图不创建重复的问题,并且现在已经搜索了 2 天,但没有找到似乎适用于我的情况的答案,所以如果是这种情况,我提前为提出重复/愚蠢的问题道歉。

所以我有一个用户上传 excel 文件的网络表单。这个 excel 文件需要完全像在 excel 文件中一样放入我们的 mySQL 数据库中。我已将数据库设置为匹配相同的列和标题。问题是这个文件有大约 260 列,每次上传将包含大约 100-500 条记录/行。我习惯于使用 mysqli bind_param(),但我很难找到一种方法将它作为一个带有 1 条语句的数组插入,这样我就不必写出接近 300 个变量。我读过使用 PDO 可以更轻松地与数组绑定,但是尽管实现了超过 15 个不同的示例,但由于各种原因,我无法让任何示例工作。以下是我现在拥有的代码。我对php不是很有经验,但也许有人可以指出我正确的方向。我正在使用 PHPExcel 提取文件数据并创建一个行数组:

if(isset($_POST['source']) && $_POST['source'] > 0){
        $source = $_POST['source'];
        if($_FILES['myFile']['name']){
            $error = $_FILES['myFile']['error'];
            if ($error == UPLOAD_ERR_OK) {
                $inputFileName = $_FILES['myFile']['tmp_name'];
                include_once '../Assets/plugins/PHPExcel-1.8/Classes/PHPExcel.php';

                $filetype = PHPExcel_IOFactory::identify($inputFileName);
                $objReader = PHPExcel_IOFactory::createReader($filetype);
                $objReader->setReadDataOnly(true);
                $objPHPExcel = $objReader->load($inputFileName);
                $objWorksheet = $objPHPExcel->getActiveSheet();
                $highestRow = $objWorksheet->getHighestRow();
                $highestColumn = $objWorksheet->getHighestColumn();
                $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);

                include_once('../Auth/masterClass.php');

注意:masterClass 只是一个连接函数(我对连接没有任何问题)

$add = new master;
                    $con = $add->con();
                    switch ($source) {
                        case 1:
                            $headerData = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',NULL,TRUE,FALSE);
                            for ($row = 2; $row <= $highestRow; $row++) {
                                $table_name = 'books';
                                $data = array();
                                $rowData = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,NULL,TRUE,FALSE);
                                $result_set = $con->prepare("INSERT INTO `$table_name` (".implode(', ',$headerData[0]).") VALUES (:".implode(', :',$rowData[0]).")");
                                function bindArrayValue($sql, $array){
                                    if(is_object($req) && ($req instanceof PDOStatement)){
                                        foreach($array as $key => $value){
                                            if(is_int($value)){
                                                $param = PDO::PARAM_INT;
                                            }elseif(is_bool($value)){
                                                $param = PDO::PARAM_BOOL;
                                            }elseif(is_null($value)){
                                                $param = PDO::PARAM_NULL;
                                            }elseif(is_string($value)){
                                                $param = PDO::PARAM_STR;
                                            }else{
                                                $param = FALSE;
                                                if($param){
                                                    $req->bindValue(":$value",$value,$param);
                                                };
                                            };
                                        };
                                    };
                                }
                                bindArrayValue($result_set,$rowData);
                                $result_set->execute();
    //                          $sql = "INSERT INTO `books` (
    //                          `id`, `title`, `author`, `status`
    //                          ) VALUES (NULL,?,?,?)";
    //                          if($stmt = $con->prepare($sql)){
    //                              $stmt->bind_param("sss", $data[0], $data[1], $data[2]);
    //                              if($stmt->execute()){
    //                                  $success = 1;
    //                              } else {
    //                                  echo '<div class="alert alert-danger">Error: '.$sql."<br>".$con->error.'</div>';
    //                              }
    //                          }
                            }
                            if($success == 1){
                                echo '<div class="alert alert-success">File successfully saved to the database!</div>';
                            }
                            break;
                        default:
                            echo '<div class="alert alert-danger">Source match not found!</div>';
                    }
                    $con->close();
                }else{
                    echo '<div class="alert alert-danger">File upload error!</div>';
                };
            }else{
                echo '<div class="alert alert-danger">ERROR: File cannot upload!</div>';
            };
        }else{
            echo '<div class="alert alert-danger">ERROR: File source not set!</div>';
        };
    ?>

这段代码告诉我我有一个 SQL 语法错误。我可以详细说明你们需要什么。

编辑:尝试“绑定一次”这是我所拥有的,请告知:

case 1:
                        $table_name = 'books';
                        $headerData = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',NULL,TRUE,FALSE);
                        $result_set = $con->prepare("INSERT INTO $table_name ".implode(', ',$headerData[0])."=:".implode(', ',$headerData[0]).")");
                        bindArrayValue($result_set,$rowData);
                        for ($row = 2; $row <= $highestRow; $row++) {
                            $rowData = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,NULL,TRUE,FALSE);
                            function bindArrayValue($sql, $array){
                                if(is_object($req) && ($req instanceof PDOStatement)){
                                    foreach($array as $key => $value){
                                        if(is_int($value)){
                                            $param = PDO::PARAM_INT;
                                        }elseif(is_bool($value)){
                                            $param = PDO::PARAM_BOOL;
                                        }elseif(is_null($value)){
                                            $param = PDO::PARAM_NULL;
                                        }elseif(is_string($value)){
                                            $param = PDO::PARAM_STR;
                                        }else{
                                            $param = FALSE;
                                            if($param){
                                                $req->bindValue(":$key",$value,$param);
                                            };
                                        };
                                    };
                                };
                            }
                            $result_set->execute();
                        }

【问题讨论】:

  • 您不能绑定值,例如:4。您必须设置名称,例如::somename,然后是 $req-&gt;bindValue(":somename",4,$param);。现在你有$req-&gt;bindValue(":4",4,$param);。你也可以用?代替:name
  • 你做错了。您准备一个语句 ONCE,绑定参数 ONCE,然后通过每次为绑定参数重新分配新值,在循环中多次重复使用该准备好的语句。在循环内部准备/绑定首先否定了准备语句的主要目的之一:支付编译/绑定价格一次。
  • 但是你可以使用:param4
  • 谢谢nospor ...我会调整的。 @Marc B,当您完成对我自称对该主题缺乏了解的批评后,您能否提供帮助并提供解决方案的链接或通过提供示例向我展示我做错了什么,因为我不知道该怎么做正在建议。

标签: php mysqli pdo


【解决方案1】:

我会为此使用LOAD DATA INFILE。 要使用,您需要将 Excel 文件另存为 csv。

$sql ="LOAD DATA INFILE 'csvfile.csv' 
    INTO TABLE tablename 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES;"
$db->exec($sql);

【讨论】:

    【解决方案2】:

    回答:好的,所以我用@Marc B 的伪方向和这个方便的链接想出了这个:http://thisinterestsme.com/pdo-prepared-multi-inserts/

    这是我的工作代码:

                include_once('../Auth/masterClass.php');
                $upload = new master;
                $pdoObject = $upload->conn();
    
                switch ($source) {
                    case 1:
                        $tableName = 'books';
                        $data = array();
                        $headerData = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',NULL,TRUE,FALSE);
                        for ($rec = 2; $rec <= $highestRow; $rec++) {
                            $rowData = $objWorksheet->rangeToArray('A'.$rec.':'.$highestColumn.$rec,NULL,TRUE,FALSE);
                            $comb_data = array_combine($headerData[0],$rowData[0]);
                            $data[] = $comb_data;
                        }
                        function pdoMultiInsert($tableName, $data, $pdoObject){
                                //Will contain SQL snippets.
                                $rowsSQL = array();
                                //Will contain the values that we need to bind.
                                $toBind = array();
                                //Get a list of column names to use in the SQL statement.
                                $columnNames = array_keys($data[0]);
                                //Loop through our $data array.
                                foreach($data as $arrayIndex => $row){
                                        $params = array();
                                        foreach($row as $columnName => $columnValue){
                                                $param = ":" . $columnName . $arrayIndex;
                                                $params[] = $param;
                                                $toBind[$param] = $columnValue; 
                                        }
                                        $rowsSQL[] = "(" . implode(", ", $params) . ")";
                                }
                                //Construct our SQL statement
                                $sql = "INSERT INTO `$tableName` (" . implode(", ", $columnNames) . ") VALUES " . implode(", ", $rowsSQL);
                                //Prepare our PDO statement.
                                $pdoStatement = $pdoObject->prepare($sql);
                                //Bind our values.
                                foreach($toBind as $param => $val){
                                        $pdoStatement->bindValue($param, $val);
                                }
                                //Execute our statement (i.e. insert the data).
                                return $pdoStatement->execute();
                        }
                        if(pdoMultiInsert($tableName, $data, $pdoObject)){
                            echo '<div class="alert alert-success">File successfully saved to the database!</div>';
                        }
                        break;
                    default:
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-03
      • 2011-03-09
      • 2018-08-16
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2018-12-21
      • 1970-01-01
      相关资源
      最近更新 更多