🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Q&A

解決済

2回答

1553閲覧

selectがうまく動作しない

退会済みユーザー

退会済みユーザー

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

0グッド

0クリップ

投稿2021/03/11 00:10

編集2021/03/11 01:45

前提・実現したいこと

簡単な掲示板を作ってみたのですが、dbから書き込まれたデータ一覧を表示させたいです。
入力されたデータを実装中に以下のエラーメッセージが発生しました。

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

Warning: SQLite3::query(): Unable to prepare statement: 1, no such table: qffc162de19c4c3731ca34287 in hoge/aaaaaaaaaaaaa39685.php on line 121 Fatal error: Uncaught Error: Call to a member function fetchArray() on boolean in /home/etdfftytg/etdfftytg.php.xdomain.jp/public_html/aaaaaaaaaaaaa39685.php:122 Stack trace: #0 {main} thrown in hoge/aaaaaaaaaaaaa39685.php on line 122

該当のソースコード

php

1<?php 2// タイムゾーン設定 3date_default_timezone_set('Asia/Tokyo'); 4 5$db = null; 6$sql = null; 7$name=null; 8$now=null; 9$tablename=null; 10$main=null; 11$res = null; 12$row = null; 13 14echo ページ番号はtablEnameです; 15echo ページのお題; 16 echo '<hr>'; 17if(isset($_POST['btn_confirm']) and isset($_POST['main'])){ 18 19$name=htmlspecialchars($_POST['name'],ENT_QUOTES); 20 21$main=htmlspecialchars($_POST['main'],ENT_QUOTES); 22// 書き込み日時を取得 23$now = date("Y/m/d H:i:s"); 24$db = new SQLite3("wish.db"); 25 26 $sql="CREATE TABLE IF NOT EXISTS tablEname( 27 id INTEGER NOT NULL, 28 view_name TEXT NOT NULL, 29 message TEXT NOT NULL, 30 post_date INTEGER NOT NULL, 31 PRIMARY KEY(id) 32)"; 33$db->exec($sql); 34 35$sql = "INSERT INTO tablEname(view_name,message,post_date) VALUES(:name,:main,:now)"; 36 37$res=$db->prepare($sql); 38 39$res->bindValue(':name',$name,SQLITE3_TEXT); 40 41$res->bindValue(':main',$main,SQLITE3_TEXT); 42 43$res->bindValue(':now',$now,SQLITE3_TEXT); 44 45$res->execute(); 46 47} 48 49?> 50<!DOCTYPE html> 51<html> 52<head> 53<meta charset="utf-8"> 54<title>たいとる</title> 55 56</head> 57<body> 58<h1>ひと言掲示板</h1> 59<h1>内容</h1> 60 61<h2>入力欄</h2> 62 <div class="form-wrapper"><form action="" method="post"> 63 64 <div class="form-item"> 65 66 <label for="name"></label> 67 68 <input type="text" name="name" placeholder="表示名"></input> 69 70 </div> 71 <label for="main"></label> 72 73 <input type="text" name="main" required="required" placeholder="コメントする(必須)"></input> 74 75 </div> 76 <div class="button-panel"> <input type="submit" class="button" name="btn_confirm" value="とうこう"></input> </div> 77 </form> 78 <?php 79 $db = new SQLite3("wish.db"); 80 $sql="SELECT * FROM tablEname"; 81 $res = $db->query($sql); 82 while( $row = $res->fetchArray() ) { 83 echo '<ul> ' . ' <li> '.$row[0].'</li>'. ' <li> '.$row[1].'</li>'. 84 ' <li> '.$row[2].'</li>'. ' <li> '.$row[3].'</li>'. ' <li> '.$row[4].'</li>'. 85 '</ul>';} 86 ?> 87 88</body> 89</html>

試したこと

なぜかif文の中でselectをしているとテーブルは作られるし、うまくいきます。(if文中なので投稿をしないとデータ全て表示されませんが)

初歩的なミスだと思いますがよろしくお願いします。

失礼しました。
tablEnameは
str_replaceで、英数字の文字列(入力内容によって変わる)です。
例:tablEname=mb5(入力内容)
str_replace("入力内容"."入力データ".tablEname)

変更は別ページの入力内容なので、tablEnameは何かしら英数字になっています。
実際にそれは成功しています。

例:echo ページ番号はtablEnameです;➡️echo ページ番号はyddryhn65433ghjです;

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

echo ページ番号はtablEnameです;

文字列を囲む引用符もなければ、変数であることを示す$もないのは、ギャグですか?
ほんとうに動かしているコードをそのまま掲載しているのでしょうか。
(そういう大事なことをおろそかにすると、質問者と回答者のコミュニケーションコストが上がって、助言がつきにくくなります。)

投稿2021/03/11 00:35

編集2021/03/11 00:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

テーブル生成は「投稿が行われてはじめて」ではなく、先にコマンドで作っておけば良いのではないでしょうか。
いずれにしても都度IF NOT EXISTSでEXECされるのは非常に無駄です。
また、エラーハンドリングは必ず入れてください。

投稿2021/03/11 00:29

編集2021/03/11 00:31
m.ts10806

総合スコア80875

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

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

退会済みユーザー

退会済みユーザー

2021/03/11 08:29

ありがとうございます。 エラーハンドリグを勉強したのですが try{ $db=new SQLite3("test.db"); //例外に投げる処理 if (empty($db)) { throw new Exception(); } // トランザクション開始 $db->exec('begin'); } $db->close(); } catch (Exception $e) { echo 'エラーが発生しました: ' . $e->getMessage(); // ロールバック $db->exec('rollback'); } これで大丈夫ですか?
m.ts10806

2021/03/11 08:38

実行してみればわかるのでは。
退会済みユーザー

退会済みユーザー

2021/03/11 08:59

エラーが起きないのでよく分からないんです。
退会済みユーザー

退会済みユーザー

2021/03/11 09:28

select自体はうまくいきました。 ありがとうございます。
m.ts10806

2021/03/11 09:58

エラーハンドリングはエラーを起こすものではないです。 エラーが起きたときに詳細を捕捉するものです。拾うように作ることで問題切り分けにもなります。 DBの処理はPHPの外で行われていることなので、ここに落ちてこない=SQL文法の問題ではない(検索条件に当てはまるデータがあるかどうかは別)、と担保できたということです。
退会済みユーザー

退会済みユーザー

2021/03/11 10:09

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問