Twitter風ひとこと掲示板の作成でのエラー

このQ&Aのポイント
  • データーベース作成、会員登録画面から登録可能、データベースを見ると登録されていること確認
  • ログイン画面でログイン後、TOPのindex.php画面に飛んだとき、エラーが発生
  • SQL文にエラーがありますと、バージョンがどーのこーのといっているようですが、具体的な解決方法がわかりません
回答を見る
  • ベストアンサー

よくわかるPHPの教科書から、

「Twitter風ひとこと掲示板」の作成でのエラー。 [OK] ・データーベース作成 ・会員登録画面から登録可能 ・データベースを見ると登録されていること確認 http://higelatta.bob.buttobi.net/nise_twitter/index.php http://higelatta.bob.buttobi.net/nise_twitter/login.php [NG] ・ログイン画面でログイン後、TOPのindex.php画面に飛んだとき、エラーが発生 ■エラー内容 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-5, 5' at line 1 以上です。 SQL文にエラーがありますと、バージョンがどーのこーのといっているようですが、 具体的な解決方法がわかりません。 以下に、TOPのindex.phpのソースを少々添付いたします。 <?php session_start(); require('dbconnect.php'); if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) { // ログインしている $_SESSION['time'] = time(); $sql = sprintf('SELECT * FROM members WHERE id=%d', mysql_real_escape_string($_SESSION['id']) ); $record = mysql_query($sql) or die(mysql_query()); $member = mysql_fetch_assoc($record); } else { // ログインしていない header('Location: login.php'); } // 投稿を記録する if (!empty($_POST)) { if ($_POST['message'] != '') { $sql = sprintf('INSERT INTO posts SET member_id=%d, message="%s", reply_post_id=%d, created=NOW()', mysql_real_escape_string($member['id']), mysql_real_escape_string($_POST['message']), mysql_real_escape_string($_POST['reply_post_id']) ); mysql_query($sql) or die(mysql_error()); header('Location: index.php'); } } // 投稿を取得する $page = $_REQUEST['page']; if ($page == '') { $page = 1; } $page = max($page, 1); 以上です。 長々と申し訳ありません。 おそらく、 if (isset($_SESSION['id']) && $_SESSION['time'] + 3600 > time()) { 付近に問題があるのかなと思うのですが、 詳しい方ご教授願います。

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • g_liar
  • ベストアンサー率52% (382/728)
回答No.2

動かないからと言って内容を理解せずに安易に削除するのは間違いです。 1回投稿してからプログラムを元に戻したら動くようになった理由は、全体像が見えないから憶測でしかありませんが…。 きっと、未使用の状態(=レコード数が0件)が考慮されてないのでしょう。 投稿が1件でもあれば問題なく動くプログラムなのでは? 「レコード数が0件の場合はどうなるか?」を頭においてプログラムを見直してみてください。 ちなみに、書籍などに載っているサンプルプログラムは、経験上かなりの確率でバグを含んでいます。 勉強し始めの頃は書籍に頼って、サンプルプログラムの内容を理解せずに動かしてみることは僕もやりがちですが(^^;おおざっぱにでも理解をしてから動かしてみた方が結局のところ近道な気がします。

mark28
質問者

お礼

貴重なご意見ありがとうございます。 >>動かないからと言って内容を理解せずに安易に削除するのは間違いです。 まさにその通りでした。 現に別のサーバー上で同じステップを踏んだら、 ログインはできますが、DBへ書き込まれた情報が画面へ反映されなくなってしまいました。 もう一度きちんと理解しなおそうと思います。

その他の回答 (1)

  • g_liar
  • ベストアンサー率52% (382/728)
回答No.1

よくわかるPHPの教科書と言うことはPHPのお勉強中ですかね。 答えを書いてしまうと勉強になりませんので解決方法だけ。 エラーメッセージはよく読みましょう。 You have an error in your SQL syntax;…つまり、SQLの構文エラーです。 操作内容から言って、エラーになっているのは示されているindex.phpのもっと後ろの方だと思いますが、示されている部分でもSQLの構文エラーがあります。 構文エラーを見つける手っ取り早い方法はどんなSQLを実行しているかを調ること。 SQLの実行前に以下を挿入して実行しているSQLを表示してみましょう。 print "$sql<br>\n"; 表示されたSQLを手動で実行してみて同じエラーになるものが問題のSQLです。

mark28
質問者

お礼

途中経過報告です。 // 最終ページを取得する $sql = 'SELECT COUNT(*) AS cnt FROM posts'; $recordSet = mysql_query($sql); $table = mysql_fetch_assoc($recordSet); $maxPage = ceil($table['cnt'] / 5); $page = min($page, $maxPage); $start = ($page - 1) * 5; $sql = sprintf('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT %s, 5', $start ); print "$sql<br>\n"; $posts = mysql_query($sql) or die(mysql_error()); 上記の様に、 print "$sql<br>\n"; を入れてみたところ、 SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT -5, 5 と表示されました。 それを手動で実行してみたところ、 元々のエラーと同じものをはきました。 上記構文の $start = ($page - 1) * 5; の「5」の値を1などに変更すると エラー文が created DESC LIMIT -5, 5 から created DESC LIMIT -1, 5 に変わります。 従って、 上記構文から $start = ($page - 1) * 5; $sql = sprintf('SELECT m.name, m.picture, p.* FROM members m, posts p WHERE m.id=p.member_id ORDER BY p.created DESC LIMIT %s, 5', $start ); を削除してみました。 すると無事、ログインできるようになりました^^ ただ、 画面に文字を入力しても投稿できませんでした。 何も画面がかわりませんでした。 やはり、上記部分を削除してしまうのではなくて、 上限に合うような数値を入力するべきなのでしょうか? ん? いやいや、 先ほど削除したものを再び戻して、結局現状維持でとりあえずサーバーにUPしてみたのですが、 先ほど、削除した状態で投稿したけど、何も変化のなかった画面に 投稿した痕跡が表示されていました。 エラーが発生した当初の状態に戻したはずなのに、 今度はきちんとログインでき、 更には投稿も普通にできました。。。 なぜなのでしょうか。 先ほど、削除した部分は、最初のログインの時は不要で、 ログイン成功した後は、 再び戻せばいいものなのでしょうか? 長々と申し訳ありません。

関連するQ&A

  • phpのif文について

    phpでログイン処理のif文を書いています。 nameとpasswordのフィールドが記入されているのかをチェックするif文を書いたのですが、機能してくれません。何かが間違っているのでしょうか。 何も入力しないor間違った情報を入力する ということをしてもログインが出来てしまいます。 どなたかテェックお願い致します。 <?php require('dbconnect.php'); session_start(); if ($_COOKIE['name'] != '') { $_POST['name'] = $_COOKIE['name']; $_POST['password'] = $_COOKIE['password']; $_POST['save'] = 'on'; } if (!empty($_POST)) { // ログインの処理 if ($_POST['name'] != '' && $_POST['password'] != '') { $sql = sprintf('SELECT * FROM members WHERE name="%s" AND password="%s"', mysql_real_escape_string($_POST['name']), sha1(mysql_real_escape_string($_POST['password'])) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { // ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time(); // ログイン情報を記録する if ($_POST['save'] == 'on') { setcookie('name', $_POST['name'], time()+60*60*24*14); setcookie('password', $_POST['password'], time()+60*60*24*14); } header('Location: index.php'); exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?>

    • ベストアンサー
    • PHP
  • phpでログイン時のIDチェック

    phpでIDとパスワードを入力してもらいそれをチェックしてログインするシステムを作っています。 普通にログインはできるのですがIDがsから始まりその後に数字が7桁来れば会員専用のメイン画面に移行し、それ以外のIDであれば普通のメイン画面に移行するプログラムを書きたいです。 例)IDがs1234567であれば会員用の画面、それ以外s1234,1234567,d1234567などのIDであれば違う画面に移行したいです。 自分が書いたコードはこのようになっておりこちらをどのように改良していけばこのようなプログラムが書けるか知りたいです。 どなたかご教授お願いします。 <?php require('dbconnect.php'); session_start(); if (!empty($_POST)) { // ログインの処理 if ($_POST['name'] != '' && $_POST['password'] != '') { $sql = sprintf('SELECT * FROM members WHERE name="%s" AND password="%s"', mysql_real_escape_string($_POST['name']), sha1(mysql_real_escape_string($_POST['password'])) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { // ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time(); header('Location: group.php'); exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?>

    • ベストアンサー
    • PHP
  • どうしてもPHPのエラーが消えまえん。

    今週からPHPを勉強し始めました。 書籍を元に勉強をしているのですが、書籍通りの内容で書き、 どんなに調べても、どうしてもエラーが消えません。 お知恵をお貸し頂けると幸いです。 エラー内容はコチラです。 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':20130514235839, created="2013-05-15 08:27:09"' at line 1 エラーページのコードは下記です。 <?php session_start(); require('../function.php'); if(!isset($_SESSION['sign_up'])){ header('Location: index.php'); exit(); } if (!empty($_POST)) { // 登録処理をする $sql = sprintf('INSERT INTO members SET name="%s", mail="%s", pass="%s", image=:%s, created="%s"', mysql_real_escape_string($_SESSION['sign_up']['name']), mysql_real_escape_string($_SESSION['sign_up']['mail']), mysql_real_escape_string(sha1($_SESSION['sign_up']['pass'])), mysql_real_escape_string($_SESSION['sign_up']['image']), date('Y-m-d H:i:s') ); mysql_query($sql) or die(mysql_error()); unset($_SESSION['sign_up']); header('Location: finish.php'); exit(); } 念のため、phpmyadminの画面をあげておきます。 http://cl.ly/image/3M002J1S0q0N 以上よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPのPDOについて

    例えば手続き型でしたら、値をデータベースに追加するとき $sql = sprintf( 'INSERT INTO member SET id=%d, message="%s" ', mysql_real_escape_string($id), mysql_real_escape_string($message) ); mysql_query($sql) or die(mysql_error()); など「mysql_real_escape_string」を使って多少なりともセキュリティーをかけると思うのですが、PDOですと下記に書かれている以外に見たことないのですが、「mysql_real_escape_string」などはやらなくても大丈夫ということなのでしょうか? PDOの場合 $sql = 'INSERT INTO member SET id=?, message=?'; $stmt = $db->prepare($sql); $stmt->execute(array($id, $message)); 色々調べてみたのですがいまいち分からないためよろしくお願いします。

    • ベストアンサー
    • PHP
  • パスワードの暗号化

    php+mysqlでシンプルな会員登録を作りたいのですがパスワードは暗号化したほうがいいですか? パスワードを簡単に暗号化できる方法はありますか? postされたpassと暗号化されたpassのチェック方法がわかりません ログイン if ($_POST['id'] !='' && $_POST['pass'] !='') { $sql = sprintf('SELECT * FROM hoge WHERE id="%s" AND pass="%s"', mysql_real_escape_string($_POST['id']), mysql_real_escape_string($_POST['pass']) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { $_SESSION['id'] = $table['id']; $_SESSION['name'] = $table['name']; } else { //エラー }

    • ベストアンサー
    • MySQL
  • PHP エラー

    PHP勉強中の初心者です。会員登録画面を作り動作確認しているのですが ログインするときに下記のエラーが出ます。 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'nakahiro7'@'localhost' (using password: NO) in /home/nakahiro7/nakahiro7.webcrow.jp/public_html/public_html/login.php on line 15 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/nakahiro7/nakahiro7.webcrow.jp/public_html/public_html/login.php on line 15 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'nakahiro7'@'localhost' (using password: NO) in /home/nakahiro7/nakahiro7.webcrow.jp/public_html/public_html/login.php on line 16 Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/nakahiro7/nakahiro7.webcrow.jp/public_html/public_html/login.php on line 16 Warning: mysql_query() [function.mysql-query]: Access denied for user 'nakahiro7'@'localhost' (using password: NO) in /home/nakahiro7/nakahiro7.webcrow.jp/public_html/public_html/login.php on line 18 Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in /home/nakahiro7/nakahiro7.webcrow.jp/public_html/public_html/login.php on line 18 Access denied for user 'nakahiro7'@'localhost' (using password: NO) login.phpのソースは下記です <?php require('dbconnect.php'); session_start(); if ($_COOKIE['email'] != ''){ $_POST['email'] = $_COOKIE['email']; $_POST['password'] = $_COOKIE['password']; $_POST['save'] = 'on'; } if(!empty($_POST)) //ログインの処理 if ($_POST['email'] != '' && $_POST['password'] != ''){ $sql = sprintf('SELECT * FROM member WHERE email="%s" AND password="&s"', mysql_real_escape_string($_POST['email']), mysql_real_escape_string(sha1($_POST ['password']))); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { //ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time(); //ログイン情報を記録する if ($_POST['save'] == 'on') { setcookie('email',$_POST['email'],time()+60*60*24*14); setcookie('password',$_POST['password'], time()+60*60*24*14); } header('Location: index.php'); exit();}else{ $error['login'] = 'failed'; }}else{ $error['login'] = 'blank'; } ?> <div id="lead"> <p>アドレスとパスワードを入力しログインしてください</p> <p>メンバーズ登録がまだの方はこちら</p> <p>&raquo;<a href="join/">メンバーズ登録をする</a></p> </div> <form action="" method="post"> <d1> <dt>アドレス</dt> <dd> <input type="text" name="email" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['email']); ?>" /> <?php if($error['login'] == 'blank'): ?> <p class="error">*アドレスとパスワードを記入ください</p> <?php endif; ?> <?php if ($eoor['login'] == 'failed'): ?> <p class="error">*ログインに失敗しました。正しく入力してください。</p> <?php endif; ?> </dd> <dt>pasword</dt> <dd> <input type="password" name="password" size="35" maxlength="255" value="<?php echo htmlspecialchars($_POST['password']); ?>" /> </dd> <dt></dt> <dd><input id="save" type="checkbox" name="save" value="on"> <label for="save">次回から自動的にログイン</label> </dd> </d1> <div> <input type="submit" value="Log in"/></div> </form> ググりまくりましたが解決できませんでした。 エラーの解決方法 その他ご指摘ありましたらお願いいたします。

    • ベストアンサー
    • PHP
  • MySQLでshal()関数のエラーがでます

    Fatal error: Call to undefined function shal() in C:\xampplite\htdocs\HP2\join\check.php on line 14 とエラーがでてきます。 原因がわからなくて困っています。 どなたか回答よろしくお願いします。 if (!empty($_POST)) { //登録処理をする $sql = sprintf('INSERT INTO members SET name="%s", email="%s", password"%s", created"%s"', mysql_real_escape_string($_SESSION['join']['name']), mysql_real_escape_string($_SESSION['join']['email']), shal(mysql_real_escape_string($_SESSION['join']['password'])), date('Y-m-d H:i:s')); mysql_query($sql) or die(mysql_error()); unset($_SESSION['join']); header('Location: thanks.php'); } ?>

    • ベストアンサー
    • MySQL
  • PHPでDBとディレクトリへの画像データ登録方法

    初めて質問させていただきますPHP初心者です。 画像投稿画面を作り、DB(imageフィールド)と任意のディレクトリ(member_picture)へ画像を保存するページを考えてます。 下記が作ったソースになるのですが、 id、message、titleフィールドにはちゃんと投稿内容が入るのですが、 どうしてもimageだけがフィールドにもディレクトリにも入りません。 アドバイスいただけますでしょうか。 <?php session_start(); if(!empty($_POST)) { //画像エラーの確認 $fileName = $_FILES['image']['name']; if(!empty($fileName)) { $ext = substr($fileName, -3); if($ext !='jpg') { $error['image'] = 'type'; } } if(empty($error)) { //画像をアップロードする $image = date('YmdHis') . $_FILES['image']['name']; move_uploaded_file($_FILES['image']['tmp_name'], '../member_picture/' . $image); $_SESSION['join'] = $_POST; $_SESSION['join']['image'] = $image; header('Location: content_upload.php'); } } //記録する if (!empty($_POST)) { if ($_POST['title'] !='') { $sql = sprintf('INSERT INTO post SET member_id=%d, message="%s", title="%s", image="%s", created=NOW()', mysql_real_escape_string($member['id']), mysql_real_escape_string($_POST['message']), mysql_real_escape_string($_POST['title']), mysql_real_escape_string($_POST['image']) ); mysql_query($sql) or die(mysql_error()); header('Location: content_upload.php'); } } ?> <!DOCTYPEうんぬん・・> <html うんぬん・・> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="style.css" /> <title>画像投稿ページ</title> </head> <body><div id="wrap"> <div id="head"><h1>画像投稿ページ</h1></div> <form action="" method="post" enctype="multipart/form-data"> <dl><dt>投稿画面</dt> <dd>画像<br> <input type="file" name="image" /> <?php if($error['image'] == 'type'): ?> <p class="error">* 画像は「.jpg」の画像を指定してください</p> <?php endif; ?> <?php if(!empty($error)): ?> <p class="error">* 恐れ入りますが、画像を改めて指定してください</p> <?php endif; ?> </dd> </dl> <div> <p><input type="submit" value="投稿する" /></p> </div> </form> </div> </div> </body> </html> 以上になります。 どこを注意したらいいのかもわからず困ってます! よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • エラーの意味

    $con=mysql_connect(localhost,***,***); mysql_select_db("shopdb"); $passwd=mysql_real_escape_string($_POST['passwd']); $email=mysql_real_escape_string($_POST['email']); $name=mysql_real_escape_string($_POST['name']); $sql="select * from users where email={$email} and passwd={$passwd}"; $_SESSION['name']=$name; $rs=mysql_query($sql); if(mysql_num_rows($rs)>0){ $_session['login']=1; header("localhost:". "top.php"); exit; } を入力したら Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource が出てしまいました・・・ なんのエラーでしょうか?

    • ベストアンサー
    • PHP
  • 会員制ログインページ

    会員制ログインページを製作しているのですが なかなかうまくいきません <?php if($_POST["keep_login"] != ""){ session_set_cookie_params(365*25*3600); }else{ session_set_cookie_params(0); } session_start(); //データベースに接続するphpです require("config.php"); if($_POST["passwd"]==""){ $_POST["passwd"]=time(); } //照合しているのですが、いろいろ試した結果ここが おかしいようなのですが if($_POST["action"]=="login"){ $sql = "select * from users where login_id = '".mysql_real_escape_string($_POST["login_id"])."' and state = '0'"; $result=mysql_query($sql); $users=mysql_fetch_array($result); if($users["passwd"]==md5($_POST["passwd"])){ $_SESSION["login_id"]=$_POST["login_id"]; $_SESSION["auth_code"]=md5($magic_code.$_POST["login_id"]); $_SESSION["name_kanji"]=$users["name_kanji"]; $sql="update users set login_date ='".date('Y-m-d H:i:s')."' where login_id='".mysql_real_escape_string($_POST['login_id'])."' and state='0'"; $result=mysql_query($sql); if($_GET["redirect"] !=""){ header("Location:".$_GET["redirect"]); exit; }else{ header("Location:".$site_url); exit; } }else{ $message='<br><br><font color="red">ログインできませんでした</font><br>'; } } ?>

    • 締切済み
    • PHP

専門家に質問してみよう