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

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

詳細はこちら
MySQL

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PDO

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

SQL

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

PHP

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

Q&A

解決済

1回答

1319閲覧

PDO、SQL文を2つ実行したいができない

CHS

総合スコア4

MySQL

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PDO

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

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/01/15 08:04

phpでPDOを使用して会員登録を行いたいのですが、その際2つのテーブルに情報を入れるときに$sql2の文は実行されるのですがsql3のほうが実行されないです。
PDOを初めて触っての作業なので調べながらやりましたがよくわかりません。
どこが間違っているのか教えていただきたいです。

Mysql使用しています

php

1<?php 2ini_set("display_errors", 1); 3error_reporting(E_ALL); 4//フォームからの値をそれぞれ変数に代入 5$name = $_POST['name']; 6$pass = $_POST['pass']; 7try { 8 $db = new PDO('*******); 9} catch (PDOException $e) { 10 echo "データベース接続エラー :".$e->getMessage(); 11} 12$sql = "SELECT count(*) FROM user WHERE username=:name"; 13$stmt = $db->prepare($sql); 14$stmt->bindValue(':name', $name); 15$stmt->execute(); 16$member=0; 17$member = $stmt->fetch(); 18$a=$member[0]; 19if ($a > 0) { 20 $msg = '同じユーザー名が存在します。'; 21 $link = '<a href="signup.php">戻る</a>'; 22} else { 23 $sql2 = "INSERT INTO user (username, passwd) VALUES (:name, :pass)"; 24 $stmt2 = $db->prepare($sql2); 25 $stmt2->bindValue(':name', $name); 26 $stmt2->bindValue(':pass', $pass); 27 $stmt2->execute(); 28 $sql3 = "INSERT INTO userscore (name) values (:name)"; 29 $stmt3 = $db->prepare($sql3); 30 $stmt3->bindValue(':name', $name); 31 $stmt3->execute(); 32 $msg = '会員登録が完了しました'; 33 $link = '<a href="login_form.php">ログインページ</a>'; 34 ?> 35<h1><?php echo $msg; ?></h1><!--メッセージの出力--> 36<?php echo $link; ?>

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

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

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

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

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

m.ts10806

2021/01/15 08:18

シンタックスハイライトで気づける部分もあるかとは思いますが、 > $db = new PDO('*******); ここ閉じてないためエラーになりますよ。
m.ts10806

2021/01/15 08:20

ただ、DBに変更を加える処理に対してException捕捉してないのはよろしくないのですし、処理結果による判定もないので実装が弱いです。 せめて、tryはDB処理全て入れてください。 あと、各メソッドの返却値を確認して処理を分岐させた方が良いです。
guest

回答1

0

ベストアンサー

さすがに$db = new PDO('*******);の閉じ引用符忘れはギャグだと思うのだけど、
if ($a > 0) {に対する} else {の閉じる方がないのは文法エラーになっちゃうんじゃないかい?

つまらない文法エラーが有ると、冒頭の

ini_set("display_errors", 1); error_reporting(E_ALL);

も無視されてしまうので、デバッグをちゃんとやるなら、
php.iniファイル上の該当箇所をデバッグ用に修正してください。
php.iniファイル上での記述の仕方は、こちらを参照:PHPのエラー表示設定について - Qiita

細かいことを言うと、
new PDO()する下りだけtry~catchしているんだが、
データベースにアクセスしている最中は例外は発生しやすいので、
全体的にtryブロック内に入れるべし。

さらには、複数のINSERT INTO文を実行しているけど、
片方だけ成功して片方が失敗したりするとデータの不整合を起こしちゃう危険性があるんじゃないかい?
失敗したときにINSERT INTO文をなかったコトにするためには、
PHP: PDO::beginTransaction - Manual
PHP: PDO::commit - Manual
PHP: PDO::rollBack - Manual
を駆使します。

try
_new PDO()
_try
__beginTransaction()
__INSERT INTO文実行1
__INSERT INTO文実行2
__commit()
_catch
__rollback()
catch

みたいな構造。このへんの流れは、ベテランでも何度も読み返すこちらの記事を参照あれ。
PHPでデータベースに接続するときのまとめ - Qiita

投稿2021/01/15 09:15

編集2021/01/15 09:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問