前提・実現したいこと
こちらに掲載している、[https://gray-code.com/php/make-the-board-vol23/]「ひとこと掲示版」でページを新設するたびにdbを新しくしたいのですが、dbがconnect_errnoになってしまいます。
発生している問題・エラーメッセージ
エラーメッセージは特にありません。ここの部分のテーブルが読み込めていないみたい?作れてはいました。 //IF NOT EXISTS オプション を指定することで存在しない場合のみ、テーブル作成を行うこともできます。 $arr[]=chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)); $arr[]=mt_rand(1,10000); $arr[]=chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)); $arr[]=mt_rand(1,10000); $table_name=implode($arr); $sql="CREATE TABLE IF NOT EXISTS $table_name( view_name INTEGER PRIMARY KEY, message TEXT, post_date INTEGER, created_datetime TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')) )"; // データを登録するSQL作成 $sql = "INSERT INTO $table_name (view_name, message, post_date) VALUES ( '$clean[view_name]', '$clean[message]', '$now_date')"; $sql = "SELECT view_name,message,post_date FROM $table_name ORDER BY post_date DESC"; $res = $db->query($sql);
該当のソースコード
php
1<?php 2session_start(); 3 4// メッセージを保存するファイルのパス設定 5define( 'FILENAME', './message.txt'); 6 7// タイムゾーン設定 8date_default_timezone_set('Asia/Tokyo'); 9 10// 変数の初期化 11$now_date = null; 12$data = null; 13$file_handle = null; 14$split_data = null; 15$message = array(); 16$message_array = array(); 17$success_message = null; 18$error_message = array(); 19$clean = array(); 20 21// トランザクション開始 22$db->exec('begin'); 23 24try { 25if( !empty($_POST['btn_submit']) ) { 26 27 // 表示名の入力チェック 28 if( empty($_POST['view_name']) ) { 29 $error_message[] = '表示名を入力してください。'; 30 } else { 31 $clean['view_name'] = htmlspecialchars( $_POST['view_name'], ENT_QUOTES); 32 } 33 34 // メッセージの入力チェック 35 if( empty($_POST['message']) ) { 36 $error_message[] = 'ひと言メッセージを入力してください。'; 37 } else { 38 $clean['message'] = htmlspecialchars( $_POST['message'], ENT_QUOTES); 39 $clean['message'] = preg_replace( '/\r\n|\n|\r/', '<br>', $clean['message']); 40 41 42 // セッションに表示名を保存 43 $_SESSION['view_name'] = $clean['view_name']; 44 } 45 46 if( empty($error_message) ) { 47 48 /* 49 if( $file_handle = fopen( FILENAME, "a") ) { 50 51 // 書き込み日時を取得 52 $now_date = date("Y-m-d H:i:s"); 53 54 // 書き込むデータを作成 55 $data = "'".$clean['view_name']."','".$clean['message']."','".$now_date."'\n"; 56 57 // 書き込み 58 fwrite( $file_handle, $data); 59 60 // ファイルを閉じる 61 fclose( $file_handle); 62 63 $success_message = 'メッセージを書き込みました。'; 64 } 65 */ 66 67 // データベースに接続 68 $db = new SQLite3("test.db"); 69 70 // 接続エラーの確認 71 if( $db->connect_errno ) { 72 $error_message[] = '書き込みに失敗しました。';} 73 else { 74 75 /*// 文字コード設定 76 $db->set_charset('utf8'); 77 */ 78 // 書き込み日時を取得 79 $now_date = date("Y-m-d H:i:s"); 80 //IF NOT EXISTS オプション を指定することで存在しない場合のみ、テーブル作成を行うこともできます。 81 $arr[]=chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)); 82 $arr[]=mt_rand(1,10000); 83 $arr[]=chr(mt_rand(97, 122)).chr(mt_rand(97, 122)).chr(mt_rand(97, 122)); 84 $arr[]=mt_rand(1,10000); 85 $table_name=implode($arr); 86 $sql="CREATE TABLE IF NOT EXISTS $table_name( 87 view_name INTEGER PRIMARY KEY, 88 message TEXT, 89 post_date INTEGER, 90 created_datetime TIMESTAMP DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')) 91)"; 92 // データを登録するSQL作成 93 $sql = "INSERT INTO $table_name (view_name, message, post_date) VALUES ( '$clean[view_name]', '$clean[message]', '$now_date')"; 94 95 // データを登録 96 $res = $db->query($sql); 97 98 if( $res ) { 99 $success_message = 'メッセージを書き込みました。'; 100 } else { 101 $error_message[] = '書き込みに失敗しました。'; 102 } 103 104 // データベースの接続を閉じる 105 $db->close(); 106 }/* 107header('Location: ./');*/ 108 } 109} 110/* 111if( $file_handle = fopen( FILENAME,'r') ) { 112 while( $data = fgets($file_handle) ){ 113 114 $split_data = preg_split( '/\'/', $data); 115 116 $message = array( 117 'view_name' => $split_data[1], 118 'message' => $split_data[3], 119 'post_date' => $split_data[5] 120 ); 121 array_unshift( $message_array, $message); 122 } 123 124 // ファイルを閉じる 125 fclose( $file_handle); 126}*/ 127 128// データベースに接続 129$db = new SQLite3("test.db"); 130 131// 接続エラーの確認 132if( $db->connect_errno ) { 133 $error_message[] = 'データの読み込みに失敗しました。'; 134} else { 135 136 $sql = "SELECT view_name,message,post_date FROM $table_name ORDER BY post_date DESC"; 137 $res = $db->query($sql); 138 139 /*if( $res ) { 140 $message_array = $res->fetch_all(MYSQLI_ASSOC); 141 } 142 if( $res ) { 143 $message_array = $res->fetchArray(SQLITE3_ASSOC); 144 } 145 146 $message_array = sqlite3fetchAll($res); 147 148function sqlite3fetchAll($res) 149{ 150$result = []; 151while ($row = $res->fetchArray()) $result[] = $row; 152return $result; 153} while( $row = $res->fetchArray() ) { 154 155 echo '<ul>'.'<li>'.$row[0].'</li>'.'<li>'.$row[1].'</li>' 156 .'<li>'.$row[2].'</li>'.'<li>'.$row[3].'</li>'.'</ul>';} 157 */ 158 $message_array = []; 159while ($row = $res->fetchArray(SQLITE3_ASSOC)) 160$message_array[] = $row; 161 162$db->close(); 163 164// コミット 165 $db->exec('commit'); 166 167} catch(Exception $e) { 168 169 // ロールバック 170 $db->exec('rollback'); 171 172 // エラーメッセージの取得 173 $error = $e->getTraceAsString(); 174 return; 175} 176?>
html
1<h1>ひと言掲示板</h1> 2<?php if( empty($_POST['btn_submit']) && !empty($_SESSION['success_message']) ): ?> 3 <p class="success_message"><?php echo $_SESSION['success_message']; ?></p> 4 <?php unset($_SESSION['success_message']); ?><?php endif; ?> 5<?php if( !empty($error_message) ): ?> 6 <ul class="error_message"> 7 <?php foreach( $error_message as $value ): ?> 8 <li>・<?php echo $value; ?></li> 9 <?php endforeach; ?> 10 </ul> 11<?php endif; ?> 12<form method="post"> 13 <div> 14 <label for="view_name">表示名</label> 15 <input id="view_name" type="text" name="view_name" value="<?php if( !empty($_SESSION['view_name']) ){ echo $_SESSION['view_name']; } ?>"> 16 </div> 17 <div> 18 <label for="message">ひと言メッセージ</label> 19 <textarea id="message" name="message"></textarea> 20 </div> 21 <input type="submit" name="btn_submit" value="書き込む"> 22</form> 23<hr> 24<section> 25<?php if( !empty($message_array) ){ ?> 26<?php foreach( $message_array as $value ){ ?> 27<article> 28 <div class="info"> 29 <h2><?php echo $value['view_name']; ?></h2> 30 <time><?php echo date('Y年m月d日 H:i', strtotime($value['post_date'])); ?></time> 31 </div> 32 <p><?php echo $value['message']; ?></p> 33</article> 34<?php } ?> 35<?php } ?> 36</section>
回答1件
あなたの回答
tips
プレビュー