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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

PHP

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

Q&A

2回答

1561閲覧

PHP:PDO、テーブル・WEBフォームの作成

xxx0_0xxx

総合スコア9

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

PHP

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

0グッド

1クリップ

投稿2021/05/24 05:42

<!DOCTYPE html> <html lang = “ja”> <head> <meta charset = “UFT-8”> <title></title> </head> <body> <?php $dsn = "mysql:host=localhost;dbname=section_08;charset=utf8;"; $user = 'root'; $pass = ''; try{ // DBへ接続 $db = new PDO($dsn,$user,$pass); // エラー時に例外処理をthrowする $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if ($db == null){ print('接続に失敗しました。<br>'); }else{ print('接続に成功しました。<br>'); } /*テーブル作成*/ // プリペアドステートメントを利用 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // トランザクション開始 $db->beginTransaction(); $db->query('CREATE TABLE IF NOT EXISTS test( id INT(11) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(10), price INT(11), age INT(11) )'); // データ格納 $aryInsert=[]; $aryInsert[]=['name'=>"'hoge'", 'price'=>100, 'age'=>10]; $aryInsert[]=['name'=>"'moge'", 'price'=>200, 'age'=>20]; $aryInsert[]=['name'=>"'hogehoge'", 'price'=>300, 'age'=>30]; $aryInsert[]=['name'=>"'mogemoge'", 'price'=>400, 'age'=>40]; // SQL作成 $sql = "INSERT INTO moge(name, price, stock)VALUES"; $arySql1=[]; // 行(レコード)の繰り返し foreach($aryInsert as $key1 => $val1){ $arySql2 = []; //列(カラム)の繰り返し foreach($val1 as $key2 => $val2){ // var_dump($val2); $arySql2[] = $val2; } $arySql1[] = '('.implode(',', $arySql2).')'; } // var_dump($arySql1); $sql .= implode(',', $arySql1); // var_dump($sql); $sth = $db -> exec($sql); // クエリ実行, Q3.価格が安い順:order by $sql = $db->query('SELECT * FROM test order by age'); // レコードをすべて配列にして取得 $rows = $sql->fetchAll(); foreach($rows as $row){ echo 'id->'.$row['id']."<br>"; echo 'name->'.$row['name']."<br>"; echo 'price->'.$row['price']."<br>"; echo 'age->'.$row['age']."<br>"; } $sth = $db->query('SELECT name,age FROM test WHERE name like "plum"'); $sth = 'UPDATE test SET age=age-30 WHERE name like "moge"'; $result = $db->exec($sth); }catch (PDOException $e){ print('Error:'.$e->getMessage()); die(); } ?> <!-- test TABLE --> <h1>test</h1> <table border='1'> <tr><td>id</td><td>name</td><td>price</td><td>age</td></tr> <?php foreach($rows as $row){ ?> <tr> <td><?php echo $row['id']; ?></td> <td><?php echo htmlspecialchars($row['name'],ENT_QUOTES,'UTF-8'); ?></td> <td><?php echo $row['price']; ?></td> <td><?php echo $row['age']; ?></td> </tr> <?php } ?> </table> </body> </html>

前提・実現したいこと

PHP/pdo/mysqlにて、phpよりテーブルを作成してwebフォームとつなげるシステムを作っています。
テーブルの重複がないよう、同じテーブルの名前がなければテーブルを作成するという機能を実装中に以下のエラーメッセージが発生しました。

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

ブラウザを更新するたびに、テーブルデータがそれぞれ増えてしまっています。

該当のソースコード

$db->query('CREATE TABLE IF NOT EXISTS moge( id INT(11) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(10), price INT(11), stock INT(11) )');

試したこと

調べたところ、このやり方もあるということだったので試してみました。
しかし、num_rowsとcloseで定義されていないというエラーが出てしまいます。

if ($result = $db->query("SHOW TABLES LIKE 'test'")) { if ($result->num_rows) { echo 'テーブルが存在'; } // 結果セットの開放 $result->close(); }

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

ループの部分が原因なのでしょうか。
お力添えいただければ幸いです。

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

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

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

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

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

guest

回答2

0

前回の質問にも回答してありますが

プログラムでcreate tableする運用は現実的ではないのでやめたほうがよいと思いますが
create tableするのがマストな仕様なのでしょうか?
テーブルをあらかじめ作っておくことですべてが解決しませんか?

投稿2021/05/24 05:57

yambejp

総合スコア114777

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

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

0

キーがオートインクリメントですし、条件ないのでアクセスのたびにデータがINSERTされる作りになってます。
CREATE TABLE IF NOT EXISTSは「テーブルがなければテーブルを作る」記述です。
なので「テーブルの重複がないよう、同じテーブルの名前がなければテーブルを作成するという機能」は既にできています。

あとは、どうなったら完成なのか次第です。

固定値とはいえパラメータをエスケープするなりプリペアドステートメントでバインドすべきとは思いますが、また別の話ですしね。

投稿2021/05/24 05:49

編集2021/05/25 11:21
m.ts10806

総合スコア80850

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

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

m.ts10806

2021/05/25 14:25

おそらく通知いってると思いますが、低評価された方、コメント願います。 ちなみにteratail運営に相談しており、下記の通り返信も得られました。 >teratailでは嫌がらせ目的の低評価など、他ユーザー様への迷惑行為を禁止しております。 サイトの利用規約に違反する行為が見られた場合、必要に応じて操作の取り消しやアカウントの停止を行っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問