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

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

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

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

Q&A

解決済

Uncaught PDOException: There is no active transaction in 例外の原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

2回答

0グッド

0クリップ

4918閲覧

投稿2022/02/10 04:59

編集2022/02/10 05:30

提示コードですが以下のsignup.php///コメント部の行で以下の例外が発生します原因がわかりません。日本語訳[アクティブなトランザクションはありません]とはどういう意味なのでしょうか?dbh->prepare($sql);で発生していると思われるのですが対処方法がわかりません

参考サイト:https://take-lab.com/2017/12/04/post-317/
参考サイト: https://teratail.com/questions/114367

Fatal error: Uncaught PDOException: There is no active transaction in /opt/lampp/htdocs/sample/signup.php:143 Stack trace: #0 /opt/lampp/htdocs/sample/signup.php(143): PDO->rollBack() #1 {main} thrown in /opt/lampp/htdocs/sample/signup.php on line 143
registerCheck.php

php

1<!DOCTYPE html> 2<html lang=ja> 3 <head> 4 <meta charset="utf-8"> 5 6 <link rel="stylesheet" href="style.css"> 7 <title>send</title> 8 </head> 9 10 <body> 11 12<?php 13ini_set("display_errors",1); 14error_reporting(E_ALL); 15session_start(); 16?> 17 18<h1 class="center"> 登録確認 </h1> 19 20<?php 21 22 $dsn = 'mysql:dbname=Bulletin_Board;host=localhost;charset=utf8'; 23 $dbh = new PDO($dsn,"root",""); 24 25 26if(false) 27{ 28 echo "メールアドレスが未入力です"; 29} 30else 31{ 32 $mail = $_POST['mail']; 33 if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)) 34 { 35 echo "メールアドレスの形式が正しくありません。"; 36 } 37 38 $sql = "SELECT id FROM Account WHERE mail=:mail"; 39 $stm = $dbh->prepare($sql); 40 $stm->bindValue(':mail',$mail,PDO::PARAM_STR); 41 $stm->execute(); 42 $result = $stm->fetch(PDO::FETCH_ASSOC); 43 44 if(isset($result["id"]) == true) 45 //if(false) 46 { 47 echo "このメールアドレスは既に利用されています。"; 48 } 49 else 50 { 51 $urltoken = hash('sha256',uniqid(rand(),1)); 52 $url = "signup.php?urltoken=".$urltoken; 53 54 try 55 { 56 $dsn = 'mysql:dbname=Bulletin_Board;host=localhost;charset=utf8'; 57 // $dbh = new PDO($dsn,"root",""); 58 59 $sql = 'INSERT INTO `preAccount`(`mail`,`token`,`enable`,`date`) VALUES (:mail,:urltoken,false,now())'; 60 $stmt = $dbh->prepare($sql); 61 $stmt->bindValue(':urltoken',$urltoken,PDO::PARAM_STR); 62 $stmt->bindValue(':mail',$mail,PDO::PARAM_STR); 63 $stmt->execute(); 64 $dbh = null; 65 66 } 67 catch(PDOException $e) 68 { 69 print('Error:'.$e->getMessage()); 70 } 71 72 /* 73 $mailTo = $mail; 74 $body = <<< EOM 75 この度はご登録いただきありがとうございます。 76 24時間以内に下記のURLからご登録下さい。 77 {$url} 78EOM; 79 mb_language('ja'); 80 mb_internal_encoding('UTF-8'); 81 82 $companyname = "shigurechan"; 83 $registation_subject = "shigurechan"; 84 $companymail = "aoriaka00@gmail.com"; 85 //Fromヘッダーを作成 86 $header = 'From: ' . mb_encode_mimeheader($companyname). ' <' . $companymail. '>'; 87 88 if(mb_send_mail($mailTo, $registation_subject, $body, $header, '-f'. $companymail)){ 89 //セッション変数を全て解除 90 $_SESSION = array(); 91 //クッキーの削除 92 if (isset($_COOKIE["PHPSESSID"])) { 93 setcookie("PHPSESSID", '', time() - 1800, '/'); 94 } 95 //セッションを破棄する 96 session_destroy(); 97 $message = "メールをお送りしました。24時間以内にメールに記載されたURLからご登録下さい。"; 98 } 99 */ 100 } 101} 102 103$message = "確認"; 104session_write_close(); 105?> 106 107<h1>仮会員登録画面</h1> 108<?php if (isset($_POST['submit'])): ?> 109 <!-- 登録完了画面 --> 110 <p><?=$message?></p> 111 <p>↓TEST用(後ほど削除):このURLが記載されたメールが届きます。</p> 112 <a href="<?=$url?>"><?=$url?></a> 113<?php endif; ?> 114<!-- 登録画面 --> 115 116 117 <?php if (true): ?> 118 <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post"> 119 <p>メールアドレス:<input type="text" name="mail" size="50" value="<?php if( !empty($_POST['mail']) ){ echo $_POST['mail']; } ?>"></p> 120 <input type="hidden" name="token" value="<?=$token?>"> 121 <input type="submit" name="submit" value="送信"> 122 </form> 123<?php endif; ?> 124 125 126 127</body> 128 129</html> 130
signup.php

php

1<!DOCTYPE html> 2<html lang=ja> 3 <head> 4 <meta charset="utf-8"> 5 <title> 登録 </title> 6 </head> 7<body> 8 9 10 11<?php 12session_start(); 13ini_set("display_errors",1); 14error_reporting(E_ALL); 15 16 17$dsn = 'mysql:dbname=Bulletin_Board;host=localhost;charset=utf8'; 18$dbh = new PDO($dsn,"root",""); 19$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 20$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 21 22$urltoken = $_GET["urltoken"]; 23 24 25 26try{ 27 // DB接続 28 //flagが0の未登録者 or 仮登録日から24時間以内 29 $sql = "SELECT mail FROM preAccount WHERE token=(:urltoken) AND enable = 0 AND date > now() - interval 24 hour"; 30 $stm = $dbh->prepare($sql); 31 $stm->bindValue(':urltoken', $urltoken, PDO::PARAM_STR); 32 $stm->execute(); 33 34 //レコード件数取得 35 $row_count = $stm->rowCount(); 36 37 //24時間以内に仮登録され、本登録されていないトークンの場合 38 if( $row_count ==1) 39 { 40 $mail_array = $stm->fetch(); 41 $mail = $mail_array["mail"]; 42 $_SESSION['mail'] = $mail; 43 } 44 else 45 { 46 $errors['urltoken_timeover'] = "このURLはご利用できません。有効期限が過ぎたかURLが間違えている可能性がございます。もう一度登録をやりなおして下さい。"; 47 } 48 //データベース接続切断 49 $stm = null; 50 }catch (PDOException $e) 51 { 52 print('Error:'.$e->getMessage()); 53 die(); 54 } 55 56 //POSTされたデータを各変数に入れる 57 $name = isset($_POST['name']) ? $_POST['name'] : NULL; 58 $password = isset($_POST['password']) ? $_POST['password'] : NULL; 59 60 //セッションに登録 61 $_SESSION['name'] = $name; 62 $_SESSION['password'] = $password; 63 64 print("test".$_SESSION["password"]); 65 66 //アカウント入力判定 67 //パスワード入力判定 68 if ($password == ''): 69 $errors['password'] = "パスワードが入力されていません。"; 70 else: 71 $password_hide = str_repeat('*', strlen($password)); 72 endif; 73 74 if ($name == ''): 75 $errors['name'] = "氏名が入力されていません。"; 76 endif; 77 78 79 80 81?> 82/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 83<?php 84if(isset($_POST['btn_submit'])) 85{ 86 //パスワードのハッシュ化 87 $password = password_hash($_SESSION['password'], PASSWORD_DEFAULT); 88 89 //ここでデータベースに登録する 90 try{ 91 $sql = "INSERT INTO Account (`name`,`id`,`password`,`mail`,`date`) VALUES (:name,:password_hash,:mail,now())"; 92 $stm = $dbh->prepare($sql); 93 $stm->bindValue(':name', $_SESSION['name'], PDO::PARAM_STR); 94 $stm->bindValue(':mail', $_SESSION['mail'], PDO::PARAM_STR); 95 $stm->bindValue(':password_hash', $password, PDO::PARAM_STR); 96 $stm->execute(); 97 98 //pre_userのflagを1にする(トークンの無効化) 99 $sql = "UPDATE preAccount SET enable=1 WHERE mail=:mail"; 100 $stm = $dbh->prepare($sql); 101 //プレースホルダへ実際の値を設定する 102 $stm->bindValue(':mail', $mail, PDO::PARAM_STR); 103 $stm->execute(); 104 105 /* 106 * 登録ユーザと管理者へ仮登録されたメール送信 107 */ 108 109 $mailTo = $mail.','.$companymail; 110 $body = <<< EOM 111 この度はご登録いただきありがとうございます。 112 本登録致しました。 113EOM; 114 mb_language('ja'); 115 mb_internal_encoding('UTF-8'); 116 117 //Fromヘッダーを作成 118 $header = 'From: ' . mb_encode_mimeheader($companyname). ' <' . $companymail. '>'; 119 120 if(mb_send_mail($mailTo, $registation_mail_subject, $body, $header, '-f'. $companymail)){ 121 $message['success'] = "会員登録しました"; 122 }else{ 123 $errors['mail_error'] = "メールの送信に失敗しました。"; 124 } 125 126 //データベース接続切断 127 $stm = null; 128 129 //セッション変数を全て解除 130 $_SESSION = array(); 131 //セッションクッキーの削除 132 if (isset($_COOKIE["PHPSESSID"])) 133 { 134 setcookie("PHPSESSID", '', time() - 1800, '/'); 135 } 136 //セッションを破棄する 137 session_destroy(); 138 139 }catch (PDOException $e) 140 { 141 print("sample"); 142 //トランザクション取り消し(ロールバック) 143 $dbh->rollBack(); 144 $errors['error'] = "もう一度やりなおして下さい。"; 145 print('Error:'.$e->getMessage()); 146 } 147/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 148} 149?> 150 151 152<!-- page_3 完了画面--> 153<?php if(isset($_POST['btn_submit'])): ?> 154<h3>本登録されました。</h3> 155 156<!-- page_2 確認画面--> 157<?php elseif (isset($_POST['btn_confirm'])): ?> 158 <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>?urltoken=<?php print $urltoken; ?>" method="post"> 159 <p>メールアドレス:<?=htmlspecialchars($_SESSION['mail'], ENT_QUOTES)?></p> 160 <p>パスワード:<?=$password_hide?></p> 161 <p>氏名:<?=htmlspecialchars($name, ENT_QUOTES)?></p> 162 163 <input type="submit" name="btn_back" value="戻る"> 164 <input type="hidden" name="token" value="<?=$_POST['token']?>"> 165 <input type="submit" name="btn_submit" value="登録する"> 166 </form> 167 168<?php else: ?> 169<!-- page_1 登録画面 --> 170 171 <?php if(!isset($errors['urltoken_timeover'])): ?> 172 <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>?urltoken=<?php print $urltoken; ?>" method="post"> 173 <p>メールアドレス:<?=htmlspecialchars($mail, ENT_QUOTES, 'UTF-8')?></p> 174 <p>パスワード:<input type="password" name="password"></p> 175 <p>氏名:<input type="text" name="name" value="<?php if( !empty($_SESSION['name']) ){ echo $_SESSION['name']; } ?>"></p> 176 <input type="hidden" name="token" value="<?=$token?>"> 177 <input type="submit" name="btn_confirm" value="確認する"> 178 </form> 179<?php endif; ?> 180<?php endif; ?> 181 182 </body> 183</html> 184

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/02/10 08:38

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

m.ts10806

2022/02/10 05:41

退会してユーザー名変えて戻ってきたところで中身が同じ人なら全くの徒労かと。 周囲を馬鹿にし過ぎでは?

回答2

1

ベストアンサー

エラーメッセージをよく読んでください。
「/opt/lampp/htdocs/sample/signup.php:143」にあるものは、
$dbh->rollBack(); のことです。
PHP: PDO::rollBack - Manual
こいつは、トランザクションを開始していない状態で呼び出すと、そういうエラーを表示します。
トランザクションを開始するのに、beginTransaction()メソッドを実行しておくのですが、
signup.php の中にないようです。
PHP: PDO::beginTransaction - Manual

どこにbeginTransaction()を置くべきかを伝えることはできますが、
もうちょっと下調べして考えてみてほしいので、今は書きません。

投稿2022/02/10 08:28

編集2022/02/10 08:28
退会済みユーザー

退会済みユーザー

総合スコア0

退会済みユーザー👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/02/10 08:30

なお、データベースアクセス周りの基本形は、akagi_chanとかいう人にお伝えしたページを参照してほしいです。 PHPでデータベースに接続するときのまとめ - Qiita https://qiita.com/mpyw/items/b00b72c5c95aac573b71

0

try-catchするならエラーモードを設定してください

PHP

1$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

途中で$dsnを変更しようとしていますが、いまいち何をしたいかわかりません

投稿2022/02/10 05:46

yambejp

総合スコア108988

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2022/02/10 06:11 編集

質問ですが提示されたコードで提示コードの2つのエラーを取るように設定しましたが同じエラーが出ます。 <?php $dsn = 'mysql:dbname=Bulletin_Board;host=localhost;charset=utf8'; $dbh = new PDO($dsn,"root",""); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PHP

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