PHP で複数のファイルをアップロードする

Subodh Poudel 2023年1月30日
  1. PHP で multiple タグ、フォームの input 属性の name タグの配列、および move_uploaded_file() 関数を使用して複数のファイルをアップロードする
  2. PHP で PDO を使用してデータベース内の複数のファイルをアップロードする
PHP で複数のファイルをアップロードする

input タグの name 属性を配列として指定し、multiple 属性を使用して、PHP で複数のファイルをアップロードする方法を紹介します。form タグの enctype 属性の値は multipart/form-data です。このメソッドは、データベース接続に mysqli を使用します。

また、PDO を使用して PHP で複数のファイルをアップロードする別の方法を紹介します。ファイルをフォルダーにアップロードしてから、データベースにアップロードします。この方法は、実装の点で最初の方法と似ています。

PHP で multiple タグ、フォームの input 属性の name タグの配列、および move_uploaded_file() 関数を使用して複数のファイルをアップロードする

input タグの name 属性を配列として指定して、複数のファイルをアップロードできます。input タグは、アップロード中に複数のファイルを選択できる multiple キーワードを使用します。enctype 属性のエンコーディング multipart/form-data を記述して、フォームの送信中にフォームデータをエンコードする方法を指定できます。mysqli を使用してデータベースに接続できます。move_uploaded_file() 関数は、アップロードされたファイルをサーバーの一時的な場所から目的の場所に移動します。INSERT SQL ステートメントを使用して、選択したファイルをデータベースにアップロードできます。

たとえば、mysqli オブジェクトとのデータベース接続を設定し、その値を $db 変数に割り当てます。POST メソッドとエンコードタイプを multipart/form-data として HTML フォームを作成し、ファイルをアップロードします。input タグの type 属性を file として指定し、name 属性を file として指定します。input タグを閉じる前に、属性 multiple を書くことを忘れないでください。input タグを書き込んでフォームを送信します。

isset() 関数を使用してフォームが送信されているかどうかを確認してください。count 関数を使用して、アップロードされたファイルの数をカウントします。$_FILES['file']['name']count 関数のパラメーターとして取り、それを変数 $countfiles に割り当てます。for ループを使用して、アップロードされたファイルをループします。ループ内で、変数 $filename を作成し、$_FILES['file']['name'][$i] として割り当てます。ルートディレクトリに upload という名前のフォルダを作成します。move_upload_file() 関数を使用してファイルを移動します。一時名のファイルである最初のパラメーターとして、$_FILES['file']['tmp_name'][$i] を使用します。アップロードされたファイルを保存するファイル名と場所である 2 番目のパラメーターとして'upload/'.$filename を使用します。

SQL INSERT クエリを実行して、ファイルをデータベースに挿入します。変数 $filenameidname の両方としてデータベースの fileup テーブルに挿入します。$db 変数を使用して、クエリを実行するためのパラメータとして $sql 変数を使用して query() 関数を呼び出します。

サンプルコード:

# php 7.*
<?php
if(isset($_POST['submit'])){
    $countfiles = count($_FILES['file']['name']);
    for($i=0;$i<$countfiles;$i++){
        $filename = $_FILES['file']['name'][$i];
        $sql = "INSERT INTO fileup(id,name) VALUES ('$filename','$filename')";
        $db->query($sql);
        move_uploaded_file($_FILES['file']['tmp_name'][$i],'upload/'.$filename);
    }
}
?>
<form method='post' action='' enctype='multipart/form-data'>
<input type="file" name="file[]" id="file" multiple>
<input type='submit' name='submit' value='Upload'>
</form>
?>

出力:

SELECT * FROM `fileup`
id name 
1 cfc.jpg 
2 hills.jpg

PHP で PDO を使用してデータベース内の複数のファイルをアップロードする

PDO を使用して、PHP で複数のファイルをアップロードできます。PDO オブジェクトを使用して、データベースへの接続を作成できます。プリペアドステートメントを使用して、ファイルをデータベースに挿入します。この方法は、データベース接続の点で最初の方法とのみ異なります。このメソッドにも正確な HTML フォームを使用できます。フォルダとデータベースに 2つの jpg ファイルをアップロードすることにより、この方法を示します。

たとえば、new キーワードを使用して PDO データベース接続を確立し、それを $conn 変数に割り当てます。isset() 関数を使用してフォームが送信されているかどうかを確認してください。上記の count 関数を使用してファイルをカウントします。次に、$query 変数にクエリを記述して、idname を挿入します。プレースホルダーを書く ? クエリの値。prepare() 関数を使用してクエリを準備し、$statement 変数に値を割り当てます。move_uploaded_file() 関数を使用して、各ファイルを uplaod フォルダーに移動します。execute() 関数を使用してクエリを実行します。関数のパラメーターとして $filename$target_file を配列に指定します。

以下の例では、ユーザーは 2つの jpg ファイルをアップロードします。まず、ファイルが upload フォルダーにアップロードされ、次にデータベースにアップロードされます。データベースにはテーブル fileup が含まれ、列 idname があります。move_uploaded_files() 関数の詳細については、PHP マニュアルを参照してください。

サンプルコード:

#php 7.x
<?php
$conn = new PDO("mysql:host=$server;dbname=$dbname","$username","$password");
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
if(isset($_POST['submit'])){
    $countfiles = count($_FILES['file']['name']);
    $query = "INSERT INTO fileup (id, name) VALUES(?,?)";
    $statement = $conn->prepare($query);
    for($i=0;$i<$countfiles;$i++){
        $filename = $_FILES['file']['name'][$i];
        $target_file = 'upload/'.$filename;
        move_uploaded_file($_FILES['file']['tmp_name'][$i],$target_file);
        $statement->execute(array($filename,$target_file));
        }
  }    
?>

出力:

SELECT * FROM `fileup`
id name 
1 upload/cfc.jpg 
2+ upload/count.jpg 
著者: Subodh Poudel
Subodh Poudel avatar Subodh Poudel avatar

Subodh is a proactive software engineer, specialized in fintech industry and a writer who loves to express his software development learnings and set of skills through blogs and articles.

LinkedIn

関連記事 - PHP Upload