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>