提示コードですが以下の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>
退会してユーザー名変えて戻ってきたところで中身が同じ人なら全くの徒労かと。
周囲を馬鹿にし過ぎでは?
まだ回答がついていません
会員登録して回答してみよう