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

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

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

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

解決済

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

samidare_chan
samidare_chan

総合スコア142

PHP

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

2回答

-3評価

0クリップ

1515閲覧

投稿2022/02/10 04:59

編集2022/02/10 17: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

<!DOCTYPE html> <html lang=ja> <head> <meta charset="utf-8"> <link rel="stylesheet" href="style.css"> <title>send</title> </head> <body> <?php ini_set("display_errors",1); error_reporting(E_ALL); session_start(); ?> <h1 class="center"> 登録確認 </h1> <?php $dsn = 'mysql:dbname=Bulletin_Board;host=localhost;charset=utf8'; $dbh = new PDO($dsn,"root",""); if(false) { echo "メールアドレスが未入力です"; } else { $mail = $_POST['mail']; if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)) { echo "メールアドレスの形式が正しくありません。"; } $sql = "SELECT id FROM Account WHERE mail=:mail"; $stm = $dbh->prepare($sql); $stm->bindValue(':mail',$mail,PDO::PARAM_STR); $stm->execute(); $result = $stm->fetch(PDO::FETCH_ASSOC); if(isset($result["id"]) == true) //if(false) { echo "このメールアドレスは既に利用されています。"; } else { $urltoken = hash('sha256',uniqid(rand(),1)); $url = "signup.php?urltoken=".$urltoken; try { $dsn = 'mysql:dbname=Bulletin_Board;host=localhost;charset=utf8'; // $dbh = new PDO($dsn,"root",""); $sql = 'INSERT INTO `preAccount`(`mail`,`token`,`enable`,`date`) VALUES (:mail,:urltoken,false,now())'; $stmt = $dbh->prepare($sql); $stmt->bindValue(':urltoken',$urltoken,PDO::PARAM_STR); $stmt->bindValue(':mail',$mail,PDO::PARAM_STR); $stmt->execute(); $dbh = null; } catch(PDOException $e) { print('Error:'.$e->getMessage()); } /* $mailTo = $mail; $body = <<< EOM この度はご登録いただきありがとうございます。 24時間以内に下記のURLからご登録下さい。 {$url} EOM; mb_language('ja'); mb_internal_encoding('UTF-8'); $companyname = "shigurechan"; $registation_subject = "shigurechan"; $companymail = "aoriaka00@gmail.com"; //Fromヘッダーを作成 $header = 'From: ' . mb_encode_mimeheader($companyname). ' <' . $companymail. '>'; if(mb_send_mail($mailTo, $registation_subject, $body, $header, '-f'. $companymail)){ //セッション変数を全て解除 $_SESSION = array(); //クッキーの削除 if (isset($_COOKIE["PHPSESSID"])) { setcookie("PHPSESSID", '', time() - 1800, '/'); } //セッションを破棄する session_destroy(); $message = "メールをお送りしました。24時間以内にメールに記載されたURLからご登録下さい。"; } */ } } $message = "確認"; session_write_close(); ?> <h1>仮会員登録画面</h1> <?php if (isset($_POST['submit'])): ?> <!-- 登録完了画面 --> <p><?=$message?></p> <p>↓TEST用(後ほど削除):このURLが記載されたメールが届きます。</p> <a href="<?=$url?>"><?=$url?></a> <?php endif; ?> <!-- 登録画面 --> <?php if (true): ?> <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>" method="post"> <p>メールアドレス:<input type="text" name="mail" size="50" value="<?php if( !empty($_POST['mail']) ){ echo $_POST['mail']; } ?>"></p> <input type="hidden" name="token" value="<?=$token?>"> <input type="submit" name="submit" value="送信"> </form> <?php endif; ?> </body> </html>
signup.php

php

<!DOCTYPE html> <html lang=ja> <head> <meta charset="utf-8"> <title> 登録 </title> </head> <body> <?php session_start(); ini_set("display_errors",1); error_reporting(E_ALL); $dsn = 'mysql:dbname=Bulletin_Board;host=localhost;charset=utf8'; $dbh = new PDO($dsn,"root",""); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $urltoken = $_GET["urltoken"]; try{ // DB接続 //flagが0の未登録者 or 仮登録日から24時間以内 $sql = "SELECT mail FROM preAccount WHERE token=(:urltoken) AND enable = 0 AND date > now() - interval 24 hour"; $stm = $dbh->prepare($sql); $stm->bindValue(':urltoken', $urltoken, PDO::PARAM_STR); $stm->execute(); //レコード件数取得 $row_count = $stm->rowCount(); //24時間以内に仮登録され、本登録されていないトークンの場合 if( $row_count ==1) { $mail_array = $stm->fetch(); $mail = $mail_array["mail"]; $_SESSION['mail'] = $mail; } else { $errors['urltoken_timeover'] = "このURLはご利用できません。有効期限が過ぎたかURLが間違えている可能性がございます。もう一度登録をやりなおして下さい。"; } //データベース接続切断 $stm = null; }catch (PDOException $e) { print('Error:'.$e->getMessage()); die(); } //POSTされたデータを各変数に入れる $name = isset($_POST['name']) ? $_POST['name'] : NULL; $password = isset($_POST['password']) ? $_POST['password'] : NULL; //セッションに登録 $_SESSION['name'] = $name; $_SESSION['password'] = $password; print("test".$_SESSION["password"]); //アカウント入力判定 //パスワード入力判定 if ($password == ''): $errors['password'] = "パスワードが入力されていません。"; else: $password_hide = str_repeat('*', strlen($password)); endif; if ($name == ''): $errors['name'] = "氏名が入力されていません。"; endif; ?> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// <?php if(isset($_POST['btn_submit'])) { //パスワードのハッシュ化 $password = password_hash($_SESSION['password'], PASSWORD_DEFAULT); //ここでデータベースに登録する try{ $sql = "INSERT INTO Account (`name`,`id`,`password`,`mail`,`date`) VALUES (:name,:password_hash,:mail,now())"; $stm = $dbh->prepare($sql); $stm->bindValue(':name', $_SESSION['name'], PDO::PARAM_STR); $stm->bindValue(':mail', $_SESSION['mail'], PDO::PARAM_STR); $stm->bindValue(':password_hash', $password, PDO::PARAM_STR); $stm->execute(); //pre_userのflagを1にする(トークンの無効化) $sql = "UPDATE preAccount SET enable=1 WHERE mail=:mail"; $stm = $dbh->prepare($sql); //プレースホルダへ実際の値を設定する $stm->bindValue(':mail', $mail, PDO::PARAM_STR); $stm->execute(); /* * 登録ユーザと管理者へ仮登録されたメール送信 */ $mailTo = $mail.','.$companymail; $body = <<< EOM この度はご登録いただきありがとうございます。 本登録致しました。 EOM; mb_language('ja'); mb_internal_encoding('UTF-8'); //Fromヘッダーを作成 $header = 'From: ' . mb_encode_mimeheader($companyname). ' <' . $companymail. '>'; if(mb_send_mail($mailTo, $registation_mail_subject, $body, $header, '-f'. $companymail)){ $message['success'] = "会員登録しました"; }else{ $errors['mail_error'] = "メールの送信に失敗しました。"; } //データベース接続切断 $stm = null; //セッション変数を全て解除 $_SESSION = array(); //セッションクッキーの削除 if (isset($_COOKIE["PHPSESSID"])) { setcookie("PHPSESSID", '', time() - 1800, '/'); } //セッションを破棄する session_destroy(); }catch (PDOException $e) { print("sample"); //トランザクション取り消し(ロールバック) $dbh->rollBack(); $errors['error'] = "もう一度やりなおして下さい。"; print('Error:'.$e->getMessage()); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// } ?> <!-- page_3 完了画面--> <?php if(isset($_POST['btn_submit'])): ?> <h3>本登録されました。</h3> <!-- page_2 確認画面--> <?php elseif (isset($_POST['btn_confirm'])): ?> <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>?urltoken=<?php print $urltoken; ?>" method="post"> <p>メールアドレス:<?=htmlspecialchars($_SESSION['mail'], ENT_QUOTES)?></p> <p>パスワード:<?=$password_hide?></p> <p>氏名:<?=htmlspecialchars($name, ENT_QUOTES)?></p> <input type="submit" name="btn_back" value="戻る"> <input type="hidden" name="token" value="<?=$_POST['token']?>"> <input type="submit" name="btn_submit" value="登録する"> </form> <?php else: ?> <!-- page_1 登録画面 --> <?php if(!isset($errors['urltoken_timeover'])): ?> <form action="<?php echo $_SERVER['SCRIPT_NAME'] ?>?urltoken=<?php print $urltoken; ?>" method="post"> <p>メールアドレス:<?=htmlspecialchars($mail, ENT_QUOTES, 'UTF-8')?></p> <p>パスワード:<input type="password" name="password"></p> <p>氏名:<input type="text" name="name" value="<?php if( !empty($_SESSION['name']) ){ echo $_SESSION['name']; } ?>"></p> <input type="hidden" name="token" value="<?=$token?>"> <input type="submit" name="btn_confirm" value="確認する"> </form> <?php endif; ?> <?php endif; ?> </body> </html>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

m.ts10806

2022/02/10 05:41

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

PHP

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