Php 在多个文件上载时收到致命错误

Php 在多个文件上载时收到致命错误,php,mysql,image,file,upload,Php,Mysql,Image,File,Upload,我制作了一个脚本,可以使用表单上载多个文件: <form action="upload_image.php" id="form_img" method="POST" enctype="multipart/form-data"> <div align="center"> <div class="fileUpload btn btn-primary"> <span>Carica immagini nell

我制作了一个脚本,可以使用表单上载多个文件:

<form action="upload_image.php" id="form_img" method="POST" enctype="multipart/form-data">
    <div align="center">
        <div class="fileUpload btn btn-primary">
            <span>Carica immagini nella galleria</span>
            <input type="file" name="immagini[]" multiple="multiple" id="file_img" class="upload"/>
            <script>
            document.getElementById("file_img").onchange = function() {
                document.getElementById("form_img").submit();
            };
            </script>
        </div>
    </div>
</form>

卡里卡伊马吉尼内拉画廊
document.getElementById(“file_img”).onchange=function(){
document.getElementById(“form_img”).submit();
};
javascript代码应该在用户选择文件时提交表单,下面是我用来处理上传的php:

<?php 
error_reporting(E_ALL);
ini_set('display_errors', 1);
session_start();
$where = dirname(__FILE__);
include($where . "/config/db.php");
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

foreach ($_FILES as $file) {   
    $nome_file_temporaneo = $file["tmp_name"];
    $nome_file_vero = $file["name"];
    $tipo_file = $file["type"];
    $not_profilo = '1';

    for($i=0;$i<sizeof($tipo_file);$i++) {
        $dati_file = file_get_contents($nome_file_temporaneo[$i]);
        $query = "INSERT INTO ".$_SESSION['id']." (immagine,type,profilo) values (?,?,?)";

        $stmt = $dbh->prepare($query);
        $stmt->bindParam(1, $dati_file, PDO::PARAM_LOB);
        $stmt->bindParam(2, $tipo_file[$i],PDO::PARAM_STR);
        $stmt->bindParam(3, $not_profilo, PDO::PARAM_STR);
        $stmt->execute();
    }
}
header("location: profile_set.php");
?>

这给了我一个错误:

致命错误:在第24行的C:\xampp\htdocs\tp\upload\u image.php中

第24行包含:
$stmt->execute()


任何帮助都将不胜感激。

尝试使用插入执行(array())的数组进行绑定。如果要确保值是应该的值,只需在
foreach()
循环中进行一些验证。最后一件事,你说你的表单进行了多次上传,但你只有一个输入,一旦输入发生变化,你就让它上传,这有点让人困惑:

// I am just saving your connection to a function just to clean it up a bit
function connection()
    {
        include(__DIR__."/config/db.php");
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        return $dbh;
    }
// I like to reogranize my $_FILES array so each file is in it's own array
function organize($array = false)
    {
        if(!is_array($array) || empty($array))
            return $array;

        foreach($array['name'] as $key => $value) {

                if($array['error'][$key] != 0) {
                        $files[$key]    =   false;
                        continue;
                    }

                $files[$key]    =   array(
                                            "name"      =>  $array['name'][$key],
                                            "tmp_name"  =>  $array['tmp_name'][$key],
                                            "type"      =>  $array['type'][$key],
                                            "error"     =>  $array['error'][$key],
                                            "size"      =>  $array['size'][$key]
                                        );
            }

        return $files;
    }

// This will return an array of bind values and statement values
function CompileUpload($use_name = 'immagini')
    {
        // If empty, do nothing
        if(empty($_FILES[$use_name]))
            return false;

        //Reorganize array
        $FILES  =   organize($_FILES[$use_name]);
        $return =   false;
        foreach ($FILES as $i => $file) { 
            if($file["error"] !== 0)
                continue;
            // I would suggest just saving the name and location of
            // the file(s) instead of saving them to the database. 
            $temp = $file["tmp_name"];
            $name = $file["name"];
            $type = $file["type"];
            $data = file_get_contents($temp);
            // Create a bind array
            $bind[":".$i."name"]    =   $name;
            $bind[":".$i."type"]    =   $type;
            $bind[":".$i."data"]    =   $data;
            // Create the append values for the sql statement
            $bCols[$i][]    =   ":".$i."name";
            $bCols[$i][]    =   ":".$i."type";
            $bCols[$i][]    =   ":".$i."data";
            // Implode and save to a master row array
            $iCols[]        =   "(".implode(",",$bCols[$i]).")";
        }
        // If there is no bind array (errors in file array)
        // just return false
        if(empty($bind))
            return false;
        // assign bind
        $return['bind'] =   $bind;
        // Implode rows
        $return['cols'] =   implode(",",$iCols);
        // return the final data array
        return $return;
    }
使用:

    // Make sure to include the above functions here....

    // Get the uploads
    $uploads    =   CompileUpload();
    // If there are uploads and the user is logged in
    if(!empty($uploads) && !empty($_SESSION['id'])) {
            // Is this really correct? Do you have a table for each user?
            // Compile your statement
            $statement  =   "INSERT into `".$_SESSION['id']."` (`immagine`,`type`,`profilo`) VALUES ".$uploads['cols'];
            // Get connection and prepare
            // You may need to do $con = connection(); $con->prepare...etc.
            // but this should work
            $query      =   connection()->prepare($statement);
            // Execute with bind values
            $query->execute($uploads['bind']);
        }
sql语句如下所示:

INSERT into `whatever` (`immagine`,`type`,`profilo`) VALUES (:0name,:0type,:0data)
多次上传将是:

INSERT into `whatever` (`immagine`,`type`,`profilo`) VALUES (:0name,:0type,:0data),(:1name,:1type,:1data)

如果每次我敦促人们避免在数据库中存储文件时我都能得到一分钱,我就可以接管甲骨文。再来一次。不要将文件内容保存在数据库中。致命错误的其余部分是什么?致命错误什么?谢谢你的回答,部分代码工作。。现在的问题是,我在upload_image.php页面中没有任何错误,所有发送到db的文件只有1B大小要查看是否正确填充了upload dataSorry,这是我的代码问题,不是你的。。。我将'profilo'存储为'immagine'列,因此在blob列中只插入'1'。听起来不错。确保在回答的问题上做标记(如果有效)。