整理のため再度投稿します。
PHPで投稿機能を実装しています。
参考にしているサイトは、以下のサイトです。
https://www.techpit.jp/courses/132/curriculums/135/sections/976/parts/3946
こちらを見て投稿機能を作成しているのですが、不明点として投稿する度にuser_idが0として扱われます。
試したこととしては、requireで読み込んでいる部分(/common/auth.phpやfunction.php、database.phpなどをコメントアウトしてみる)をやってみました。この処理がまとまっていないために起きている不具合だと考えましたが、こちら原因わかる方いますか?
ログ出力してみると以下のような結果が出ました。
[21-Feb-2021 08:15:39 UTC] PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in /Applications/MAMP/htdocs/aaaa/tweets/create.php on line 37
//tweets/create.php <?php require('../common/auth.php'); require('../common/function.php'); require('../common/database.php'); require('../common/head_info.php'); if (!isLogin()) { header('Location: ../login/'); exit; } $user_id = getLoginUserId(); $database_handler = getDatabaseConnection(); //post送信されていた場合 if(!empty($_POST)) { //バリデーションチェック $title = (isset($_POST['title'])) ? $_POST['title'] : ''; $content = (isset($_POST['content'])) ? $_POST['content'] : ''; // //最大文字数チェック // validMaxLen($comment, 'comment'); // //未入力チェック // validNotEntered($comment, 'comment'); if(empty($err_msg)) { //例外処理 try { $user_id = getLoginUserId(); print_r('debug',$user_id); //DB接続 $database_handler = getDatabaseConnection(); // プリペアドステートメントで SQLをあらかじめ用意しておく $statement = $database_handler->prepare('INSERT INTO tweets (user_id, title, content) VALUES (:user_id, :title, :content)'); //指定された変数名にパラメータをバインド(紐付け) $statement->bindParam(':title', $title); $statement->bindParam(':user_id', $user_id); $statement->execute(); $_SESSION['select_tweet'] = [ 'id' => $database_handler->lastInsertId(), 'title' => $title, 'content' => $content, ]; //クエリ成功の場合 if($statement) { $_POST = array(); //postをクリア header('Location:../tweets/community01.php'); //自分自身に遷移する exit(); } } catch(Exception $e) { error_log('エラー発生:'. $e->getMessage()); } } } ?> <?php require('../common/header.php'); ?> <?php if(!empty($_SESSION['user']['id'])) { ?> <div class="main-top"> <form action="" method='post' class='form review-form'> <div class='button-containers'> <div class="tweet-header">zzz</div> <div class="tweet-body"> <div class="tweet-tops"> <label> <input type="text" name='title' placeholder="タイトル"> <div class="error_mes"> <?php if(!empty($err_msg['pass'])) echo $err_msg['pass']; ?> </div> </label> <label> <textarea name="content" cols="82" rows="10" class='review-textarea'></textarea> <div class="error_mes"> <?php if(!empty($err_msg['pass'])) echo $err_msg['pass']; ?> </div> </label> <div class='button-container'> <input type="submit" value='投稿する'> </div> </div> </div> </div> </form> </div> <?php require('../common/footer.php'); ?> <?php } ?>
//common/function.php <?php define('message01', '入力必須です'); define('message02', 'ニックネームは256文字以内で入力してください。'); define('message03', 'パスワードは256文字以内で入力してください。'); define('message04', 'パスワードは半角英数字8文字以上で入力してください。'); //================================ // ログ //================================ //画面にエラーを表示させるか // ini_set('display_errors', 'On'); //ログを取るか ini_set('log_errors', 'On'); //ログの出力ファイルを指示 ini_set('error_log', 'php.log'); //セッションを使う session_start(); // //================================= // //エラーメッセージ格納用の配列 // //================================= $err_msg = array(); //未入力チェック function validateNot($str,$value){ if(empty($str)) { global $err_msg; $err_msg[$value] = message01; } } //ニックネームの最大文字数チェック function validateNameMaxLen($str,$value){ //全角も半角も1文字として扱う if(mb_strlen($str)>256){ global $err_msg; $err_msg[$value] = message02; } } //パスワードの最大文字数チェック function validatePassMaxLen($str,$value){ //全角も半角も1文字として扱う if(mb_strlen($str)>256){ global $err_msg; $err_msg[$value] = message03; } } //パスワードの最小文字数チェック function validatePassMinLen($str,$value){ //全角も半角も1文字として扱う if(mb_strlen($str)<8){ global $err_msg; $err_msg[$value] = message04; } }
//common/database.php <?php /** * PDOを使ってデータベースに接続する * @return PDO */ function getDatabaseConnection() { try { $database_handler = new PDO('mysql:dbname=aaa;host = 127.0.0.1;port=8889;charset=utf8', 'root', 'root'); } catch (PDOException $e) { echo "DB接続に失敗しました。<br />"; echo $e->getMessage(); exit; } return $database_handler; }
//head_info.php <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet"> <link rel="stylesheet" href="../public/css/style.css"> </head> <body> <script src='https://code.jquery.com/jquery-3.4.1.min.js'></script> </body>