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

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

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

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

PHP

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

Q&A

2回答

1292閲覧

CSVファイルのデータをphp MyAdminに保存したい

sa-t

総合スコア4

MySQL

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

PHP

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

0グッド

0クリップ

投稿2021/12/03 07:36

PHPについて質問です。

CSVファイルのデータをデータベースに保存したいのですがうまく保存出来ません。プログラムはネット上にあったものを参考にしました。とりあえずこれで自分のデータベースに保存出来るか試している段階です。イメージ説明
画像のようにファイルを選択して「インポートに成功」と文字は出るのですが、データベースに保存されません。
これは、データベースとの接続がうまくいってないからでしょうか?

php

1<?php 2 3/* HTML特殊文字をエスケープする関数 */ 4function h($str) { 5 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); 6} 7 8// パラメータを正しい構造で受け取った時のみ実行 9if (isset($_FILES['upfile']['error']) && is_int($_FILES['upfile']['error'])) { 10 11 try { 12 13 /* ファイルアップロードエラーチェック */ 14 switch ($_FILES['upfile']['error']) { 15 case UPLOAD_ERR_OK: 16 // エラー無し 17 break; 18 case UPLOAD_ERR_NO_FILE: 19 // ファイル未選択 20 throw new RuntimeException('ファイルが選択されていません'); 21 case UPLOAD_ERR_INI_SIZE: 22 case UPLOAD_ERR_FORM_SIZE: 23 // 許可サイズを超過 24 throw new RuntimeException('ファイルが大きすぎます'); 25 default: 26 throw new RuntimeException('エラー'); 27 } 28 29 $tmp_name = $_FILES['upfile']['tmp_name']; 30 $detect_order = 'ASCII,JIS,UTF-8,CP51932,SJIS-win'; 31 setlocale(LC_ALL, 'ja_JP.UTF-8'); 32 33 /* 文字コードを変換してファイルを置換 */ 34 $buffer = file_get_contents($tmp_name); 35 if (!$encoding = mb_detect_encoding($buffer, $detect_order, true)) { 36 // 文字コードの自動判定に失敗 37 unset($buffer); 38 throw new RuntimeException('文字セットの検出に失敗しました'); 39 } 40 file_put_contents($tmp_name, mb_convert_encoding($buffer, 'UTF-8', $encoding)); 41 unset($buffer); 42 43 /* データベースに接続 */ 44 $pdo = new PDO( 45 'mysql:dbname=tennis;host=localhost;charset=utf8', 46 'root', 47 'root', 48 array( 49 // カラム型に合わない値がINSERTされようとしたときSQLエラーとする 50 PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode='TRADITIONAL'", 51 // SQLエラー発生時にPDOExceptionをスローさせる 52 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 53 // プリペアドステートメントのエミュレーションを無効化する 54 PDO::ATTR_EMULATE_PREPARES => false, 55 ) 56 ); 57 $stmt = $pdo->prepare ('INSERT INTO tennis_table (num,timestampss,manufacturer_name,racket_name,swing_type,impact_position,ball_speed,ball_spin,swing_speed,tag_id,video_filename) 58 VALUES (num,timestampss,manufacturer_name,racket_name,swing_type,impact_position,ball_speed,ball_spin,swing_speed,tag_id,video_filename)'); 59 60 /* トランザクション処理 */ 61 $pdo->beginTransaction(); 62 try { 63 $fp = fopen($tmp_name, 'rb'); 64 while ($row = fgetcsv($fp)) { 65 if ($row === array(null)) { 66 // 空行はスキップ 67 continue; 68 } 69 if (count($row) !== 11) { 70 // カラム数が異なる無効なフォーマット 71 throw new RuntimeException('無効な列が検出されました'); 72 } 73 $executed = $stmt->execute($row); 74 } 75 if (!feof($fp)) { 76 // ファイルポインタが終端に達していなければエラー 77 throw new RuntimeException('CSV解析エラー'); 78 } 79 fclose($fp); 80 $pdo->commit(); 81 } catch (Exception $e) { 82 fclose($fp); 83 $pdo->rollBack(); 84 throw $e; 85 } 86 87 /* 結果メッセージをセット */ 88 if (isset($executed)) { 89 // 1回以上実行された 90 $msg = array('green', 'インポートに成功'); 91 } else { 92 // 1回も実行されなかった 93 $msg = array('black', 'インポートするものはありませんでした'); 94 } 95 96 } catch (Exception $e) { 97 98 /* エラーメッセージをセット */ 99 $msg = array('red', $e->getMessage()); 100 101 } 102 103} 104 105// XHTMLとしてブラウザに認識させる 106// (IE8以下はサポート対象外w) 107header('Content-Type: application/xhtml+xml; charset=utf-8'); 108 109?> 110<!DOCTYPE html> 111<html xmlns="http://www.w3.org/1999/xhtml"> 112<head> 113 <title>CSV to MySQL importation test</title> 114</head> 115<body> 116<?php if (isset($msg)): ?> 117 <fieldset> 118 <legend>結果</legend> 119 <span style="color:<?=h($msg[0])?>;"><?=h($msg[1])?></span> 120 </fieldset> 121<?php endif; ?> 122 <form enctype="multipart/form-data" method="post" action=""> 123 <fieldset> 124 <legend>ファイルを選択</legend> 125 ファイル名(CSVのみがサポートされています): <input type="file" name="upfile" /><br /> 126 <input type="submit" value="Upload" /> 127 </fieldset> 128 </form> 129</body> 130</html>

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

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

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

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

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

m.ts10806

2021/12/03 11:19

phpMyAdminはMySQLを操作するツールの1つに過ぎないので、そこ自身に保存することはできません。保存先はあくまでデータベースです。
m.ts10806

2021/12/03 11:43

あとテーブル定義どうなってるのでしょう。 可能ならcreate table文で提示してください。
guest

回答2

0

色々とツッコミどころはあります。

  • PDOStatement::executeの返却値はtrue/falseですが、isset()で確認されてるので、 $executed = $stmt->execute($row);に入れば必ず条件式は満たされます(変数の内容ではなく変数の存在確認だから)
  • SQLこれ、VALUES()の中には「セットしたい値」を入れるのですが、カラムしか入ってません。エラーにはならないようですが、おそらくカラムの初期値でデータが入るはず。

ただ、通常プログラムから実行するときは?なり名前付きパラメータなりで値をバインドするものでは。

  • if ($row === array(null)) {これが今ひとつピンとこない表現ですがfgetcsvの返却値からすると、is_null($row[0])とするとか、列数が決まってるならcount($row[]) === 列数のほうが良い気がします(つまり既にある次のチェックだけで良い)。
  • RuntimeException発生したときしかロールバックされないような。
  • 1行ずつINSERTよりどうせロールバックするんですから、バルクインサートの形取った方が実行回数少なくて済みます。

投稿2021/12/03 11:59

編集2021/12/03 12:01
m.ts10806

総合スコア80875

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

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

0

単純にprepare処理が用をなしていないような書き方に見えます

投稿2021/12/03 08:33

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問