PHPのデータベースを利用した掲示板を作成したい
ログインした状態からチャットを入力し、
- 入力したユーザー
- 内容
の二点を、SQLiteを利用して表示する掲示板を作成したいのですが、
エラーメッセージが表示され上手くいきません。
発生している問題・エラーメッセージ
Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\login-bbs2.php on line 92
該当のソースコード
php
1<?php session_start(); 2$users = array( 3 "takeshi" => "a94a8fe5ccb19ba61c4c0873d391e987982fbbd3",//test 4 "yutaka" => "ee3f7d52ca341c51c694af9288701f4ce43be0ad",//rabit 5 "akiko" => "f91a8ee646a277a2f1359709604b99c1b32d9f24",//panda 6 "mamoru" => "e08f57d03a1a78d2473c0520cbf0db9d3aadcc49" 7); 8 9$savepath = dirname(__FILE__).'/log.db'; 10$script=$_SERVER["SCRIPT_NAME"]; 11 12try { 13 $db = new PDO("sqlite:$savepath"); 14} catch (PDOException $e) { 15 echo "接続失敗:".$e->getMessage(); exit; 16} 17 18$create_query = <<< __SQL__ // ここが問題?? 19CREATE TABLE IF NOT EXISTS log ( 20 log_id INTEGER PRIMARY KEY, 21 user TEXT; 22 body TEXT, 23); 24__SQL__; 25$db->exec($create_query); 26 27if (isset($_SESSION["login"])) { 28 show_login_contents(); 29} 30 31if (isset($_POST["user"])) { 32 check_login(); 33} else { 34 show_login_form(); 35} 36 37function show_login_form() { 38 global $script; 39 echo <<< __FORM__ 40 <div id="loginform"> 41 <form action="$script" method="POST"><h3>ログインしてください</h3> 42 <label>ユーザー名</label><input type="text" name="user" /> 43 <label>パスワード</label><input type="password" name="pass" /> 44 <button type="submit">ログイン</button> 45 </form></div> 46__FORM__; 47} 48 49function check_login() { 50 global $users, $script; 51 if(empty($_POST["pass"])){ 52 echo "パスワードが入力されていません"; exit; 53 } 54 if(empty($users[$_POST["user"]])) { 55 echo "ユーザーが存在しないかパスワードが違います。"; exit; 56 } 57 58 $pass_correct = $users[$_POST["user"]]; 59 if(sha1($_POST["pass"]) != $pass_correct) { 60 echo "ユーザーが存在しないかパスワードが違います。"; exit; 61 } 62 63 $_SESSION["login"] = array("user" => $_POST["user"]); 64 echo "<a href='$script'>ログインしました!</a>"; 65} 66 67function show_login_contents() { 68 $m = isset($_GET["m"]) ? $_GET["m"]:""; 69 switch ($m) { 70 case "logout": show_logout(); break; 71 case "write": write_log(); break; 72 default: show_log(); break; 73 } 74} 75 76function show_log() { 77 global $script, $savefile, $db; 78 $user = $_SESSION["login"]["user"]; 79 echo "<h1>こんにちは、{$user}さん!</h1>"; 80 echo "現在ログイン中"; 81 echo "→(<a href='$script?m=logout'>ログアウトする</a>)"; 82 echo "</ul>"; 83 echo "<form action='$script' method='get'>"; 84 echo "<input type='text' name='body' size='40' />"; 85 echo "<input type='hidden' name='m' value='write' />"; 86 echo "<input type='submit' value='書き込み' />"; 87 echo "</form>"; 88 echo "<h3>掲示板</h3>"; 89 90 $select_query = "SELECT * FROM log ORDER BY log_id DESC"; 91 $stmt = $db->query($select_query); 92 foreach ($stmt as $row) { 93 $name = htmlspecialchars($row["user"]); 94 $body = htmlspecialchars($row["body"]); 95 echo "<div class='log'>$name > $body</div>"; 96 } 97} 98 99// 次回はここから 100 101function write_log() { 102 global $db; 103 if (isset($_GET["body"])) { 104 if ($_GET["body"] == "") { 105 echo "<p>内容を入力してください。</p>"; exit; 106 } 107 108 $template = "INSERT INTO log (user,body)". 109 "VALUES(?,?);"; 110 $stmt = $db->prepare($template); 111 $stmt->execute(array($_GET["user"],$_GET["body"])); 112 header("location: $script"); exit; 113 } 114} 115 116function show_logout() { 117 global $scripit; 118 unset($_SESSION["login"]); 119 echo "<a href='script'>ログアウトしました</a>"; 120 exit; 121}
試したこと
「DB Browser for SQLite」を利用して確認したところ、
login.db自体は作成されているのですが、テーブル自体がうまく作成できていないみたいです...。
たぶん、該当の部分に問題があると思うのですが...。
php
1$create_query = <<< __SQL__ 2CREATE TABLE IF NOT EXISTS log ( 3 log_id INTEGER PRIMARY KEY, 4 user TEXT; 5 body TEXT, 6); 7__SQL__; 8$db->exec($create_query);
補足情報(FW/ツールのバージョンなど)
・windows10
・XAMPP
PHPのバージョンは5.2.0です。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。