質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Q&A

解決済

2回答

1362閲覧

【PHP】INSERTが1度までしか実行されない

mmm022

総合スコア5

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

0グッド

0クリップ

投稿2021/07/02 03:35

前提・実現したいこと

DBに画像ファイルをアップロードして表示するシステムを作っています。
DBに画像をアップロードする段階で2件目以降のアップロードができない状態です。

発生している問題・エラーメッセージ

現在、画像アップロードフォームからアップロードを行うと、テーブル内が0件の時のみ正常に動作し、2件目以降を同じ手順でアップロードを行ったところエラーがなくDBにも追加されない状態です。

該当のソースコード

fileup

1<h1>画像アップロード</h1> 2<form method="post" enctype="multipart/form-data" action="upload_execute.php"> 3 4 <li> 5 <input type="file" name="upload" accept=".png, .jpg, .jpeg, .pdf" > 6 <input type="hidden" name="file_category" value="1"> 7 備考 8 <textarea name="other" class="textarea"></textarea> 9 </li> 10 11 <input type="submit" value="アップロード" class="button"> 12</form>

uploadexecute

1<?php 2session_start(); 3header('X-XSS-Protection: 0'); 4$time = date("Y/m/d"); 5$company_ID = $_SESSION['company_ID']; 6$other = $_POST['other']; 7$timestamp = date("YmdHis"); 8$file_category = $_POST['file_category']; 9 10if($_SESSION['company_ID'] == ""){?> 11<SCRIPT LANGUAGE="JavaScript"> 12 location.href = "../../index_timeout.php?<?php echo $time;?>"; 13</SCRIPT> 14<?php 15exit(); 16} 17 18if($file_category == 1){ 19 $category = pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION); 20 $category = strtolower($category); 21 if($category=="png"){ 22 $category = "1"; 23 }elseif($category=="jpeg"){ 24 $category = "2"; 25 }elseif($category=="jpg"){ 26 $category = "3"; 27 }elseif($category=="pdf"){ 28 $category = "4"; 29 } 30 ?> 31 32 33 <?php 34 $tempfile = $_FILES['upload']['tmp_name']; 35 $filename = '../../file/'.$company_ID.$category.$timestamp.".".pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION); 36 37 if (is_uploaded_file($tempfile)) { 38 if ( move_uploaded_file($tempfile , $filename )) { 39 } else { 40 } 41 } else { 42 } 43 44 45 $file_name = $_FILES['upload']['name']; 46 $system_name = $company_ID.$category.$timestamp.".".pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION); 47 48 $file_url = "http://so4.mydns.jp/test/maika/dss/mediamanagement/file/".$system_name; 49 $class = 1; 50 51 try{ 52 $pdo = new PDO('mysql:dbname=DSS; host=localhost; charset=utf8','maika','powerB1234', 53 array(PDO::ATTR_EMULATE_PREPARES => false)); 54 } catch (PDOException $e) { 55 exit('データベース接続失敗。'.$e->getMessage()); 56 } 57 //プリペアドステートメント 58 $stmt = $pdo -> prepare("INSERT INTO T_FILE(company_ID,class,file_name,system_name,other,extension,touroku_date) VALUES (:company_ID,:class,:file_name,:system_name,:other,:extension,:touroku_date)"); 59 //プレースホルダへ実際の値を設定する 60 if ($stmt===false){ 61 // エラー処理 62 } 63 $stmt->bindparam(':company_ID',$company_ID, PDO::PARAM_STR); 64 $stmt->bindparam(':class', $class, PDO::PARAM_STR); 65 $stmt->bindparam(':file_name', $file_name, PDO::PARAM_STR); 66 $stmt->bindparam(':system_name', $system_name, PDO::PARAM_STR); 67 $stmt->bindparam(':other', $other, PDO::PARAM_STR); 68 $stmt->bindparam(':extension', $category, PDO::PARAM_STR); 69 $stmt->bindparam(':touroku_date', $time, PDO::PARAM_STR); 70 71 $stmt->execute(); 72 73 // 使用を終了したので、閉じます 74 $stmt = null; 75 $pdo = null;

MySQLテーブル構造(PHPMyAdmin)

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

原因

phpMyAdminの表記だと分かりにくいですが、
恐らくcompany_IDがPKに設定されているため、同じcompany_IDを持つレコードを登録できない状態なっていると思います。
(phpMyAdminの表記はphpMyAdminを使っている人にしか分からないので、テーブル構造を表記する時はshow create table テーブル名で出力したものを提示して下さい)

PHPでデータベースに接続するときのまとめ
を参照して、挿入失敗時に例外が出るようにして捕捉してみて下さい。

以下の様な感じです。

PHP

1try { 2 $pdo = new PDO('mysql:dbname=DSS; host=localhost; charset=utf8', 'maika', 'powerB1234', 3 array(PDO::ATTR_EMULATE_PREPARES => false)); 4 5 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 6 7} catch (PDOException $e) { 8 exit('データベース接続失敗。' . $e->getMessage()); 9} 10 11try { 12 //プリペアドステートメント 13 $stmt = $pdo->prepare("INSERT INTO T_FILE(company_ID,class,file_name,system_name,other,extension,touroku_date) VALUES (:company_ID,:class,:file_name,:system_name,:other,:extension,:touroku_date)"); 14 //プレースホルダへ実際の値を設定する 15 if ($stmt === false) { 16 // エラー処理 17 } 18 $stmt->bindparam(':company_ID', $company_ID, PDO::PARAM_STR); 19 $stmt->bindparam(':class', $class, PDO::PARAM_STR); 20 $stmt->bindparam(':file_name', $file_name, PDO::PARAM_STR); 21 $stmt->bindparam(':system_name', $system_name, PDO::PARAM_STR); 22 $stmt->bindparam(':other', $other, PDO::PARAM_STR); 23 $stmt->bindparam(':extension', $category, PDO::PARAM_STR); 24 $stmt->bindparam(':touroku_date', $time, PDO::PARAM_STR); 25 26 $stmt->execute(); 27} catch (PDOException $e) { 28 exit('挿入失敗。' . $e->getMessage()); 29} 30

対応

  • 同じcompany_IDで複数レコードを持ちたい場合
  1. company_IDをIDにカラム名変更
  2. company_IDカラムを改めて追加(UNIQUIE制約やPKはつけない)

という感じで、company_IDからPKを外し、company_IDに代わるPKになるカラムを追加するようにテーブル構造を更新して対応する

  • 現在のテーブル構造が正しい場合

同じPKを持つデータがある場合はINSERTでは無くUPDATEするようにする。
公式リファレンス 13.2.5.3 INSERT ... ON DUPLICATE KEY UPDATE 構文

投稿2021/07/02 04:23

編集2021/07/02 04:31
tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

try節をDB接続時だけでなく、SQL実行時まで、含めたらエラーも確認できようかとは思います、というのと$_SESSION['company_ID']がどこでどう設定されるのか次第でもあるのですけど、主キーみたいなので同じキーでinsertしようとして主キー制約に引っかかってるのでは。

主キーを生きとするなら既存データがある場合はUPDATEにしなければなりませんし、複数登録できるとするならシーケンスなりなんなりもう一つ主キーが必要に思います。

投稿2021/07/02 04:02

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問