ページ 11

phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 12:26
by kou_hei
以下が書いたコードなのですが何が間違っているのかわかりません。
初心者なのですがどうか僕を助けてください。
お願いします。

コード:

<?php

/*共通処理*/

//データベースへの接続
    try{
    $GLOBALS['db'] = new PDO("mysql:host=localhost; dbname=bbs", "root", "test");    
    } catch (PDOException $e) {
        echo 'connection failed: '.$e->getMessage();
    }
    
    //action取得
    $action = (isset($_GET['action']) ? $_GET['action'] : $_POST['action']);
    
    //action振り分け
    switch($action)
    {
            //書き込み処理
        case "regist":
            proc_regist();
            break;
            
            //削除処理
        case "delete":
            proc_delete();
            break;
            
            //返信処理
        case "res":
            proc_res();
            break;
            
            //表示処理
        default:
            proc_default();
            break;
            
    }
    
    // 終了処理
    
    
	
	/* ここで処理は終了 あとは個別の関数へ */
    
    
    // 基本の掲示板表示処理
	function proc_default()
	{
		
		$db = $GLOBALS['db'];
        
        
        $page_max = 15;
        $offset = ( isset($_GET['offset']) ? $_GET['offset'] : 0 );
        
        $limit = $page_max +1;
        
        $stmd = $db->query("select * from message order by no desc limit $limit offset $offset");
        $rows = $stmd->fetchAll();
    
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang = "ja">
<head>
<meta http-equiv = "Content-Type" content="text/html; charset = UTF-8">
<title>
</title>
</head>
<body>

<form method = "POST" action = "bbs_new.php">
<input type = "hidden" name = "action" value= "regist">
お名前:<input type="text" name="name"><br>
メール:<input type="text" name="mail"><br>
題 名:<input type="text" name="title"><br>
削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"><br>
<textarea name="contents" cols="60" rows="5"></textarea><br>

<?php
print "<input type='submit' name='write' value='送信'>\n";
print "<hr>\n";
print "記事番号:<input type='text' name='delno'>\n";
print "削除キー: <input type='password' name='delkey'>\n";
print "<input type='submit' name='delete' value='記事削除'>\n";
print "<input type = 'hidden' name = 'action' value = 'delete'>\n";
    
?>


</form>
    
<?php
    
    //ここからデータ表示処理
    

    
    $sql = 'select * from message order by no desc';
   
    foreach ($db->query($sql) as $row) {
        

        if ($_GET['resno']) {
            if ($row['resno'] != $_GET['resno']) continue;
        }

        if ($_POST['resno']) $resno = $_POST['resno'];
        else $resno = $no;
        if ($row['no'] != $row['resno']) $res = true; else $res = false;
        if ($res) print "<blockquote>";
        else print "<hr>";
        print "<p>No.".$row['no']." ";
        print "<b>{$row['title']}</b> 投稿者:";
        if ($row['mail']) print "<a href='mailto:{$row['mail']}'>";
        print $row['name'];
        if ($row['mail']) print "</a>";
        
        $row['time'] = date("Y/m/d H:i:s");
        print " 投稿時間:{$row['time']}";
        if (!$res && !$_GET['resno']) {
            print " <a href='bbs_new.php?resno={$row['no']}'>返信</a>";
        }
        print "<br><br>{$row['contents']}</p>";
        if ($res) print "</blockquote>";
        print "\n";
        
    }
    
    //改ページ
	
    if(count($rows)>$page_max){
        $next = $offset+$page_max;
        print "[<a href='bbs_new.php?offset=$next'>前のページ</a>]";
    }
    
    if ($offset>0){
        $prev = $offset-$page_max;
        print "[<a href='bbs_new.php?offset=$prev'>次のページ</a>]";
    }
    
        //rowに1行ずつ取得したデータが入る
   
   


    //返信データの有無
        $sql2 = 'select * from message order by no desc';
        foreach ($db->qeury($sql2) as $row2){
        
        
        
        //入力フォームの書き出し
    
        if ($_GET['resno']) {
            
            print "<input type='submit' name='write' value='No.{$_GET['resno']} に返信'>\n";
            print "<input type='hidden' name='resno' value='{$_GET['resno']}'>\n";
        } else {
            print "<input type='submit' name='write' value='送信'>\n";
            print "<hr>\n";
            print "記事番号:<input type='text' name='delno'>\n";
            print " 削除キー: <input type='password' name='delkey2'>\n";
            print " <input type='submit' name='delete' value='記事削除'>\n";
        }
        }
    }
    
    
    //header("Location: bbs_new.php");
    

    //データベースへ書き込みを行う処理
    
    function proc_regist(){
        
        
        
        // グローバル変数から取り出す
		$db = $GLOBALS['db'];
   
        //記事番号
        $sql = 'select no from message order by no desc';
        $maxno = 0;
        
        $no = $maxno + 1;
        
        
        $_POST['no'] = $no;
        if(!$_POST['resno']){
            $_POST['resno'] = $_POST['no'];
        }
        
        
        
        //データベースへインサート
        
        $sql = 'insert into message values(?,?,?,?,?,?,?,?)';
        $st = $db->prepare($sql);
        $st->execute(array($_POST['no'], $_POST['resno'],$_POST['name'], $_POST['mail'],$_POST['title'], $_POST['contents'],$_POST['delkey'], $_POST['time']));
        
    }
       
        
        
           header("Location: bbs_new.php");
        
    
    
    //データベースから削除を行う処理
    
    function proc_delete(){
        
        $db = $GLOBALS['db'];
        $sql = 'delete from message where no = ? and delkey = ? ';
            $sth = $db->prepare($sql);
            $ret = $sth->execute(array($_POST['no'],$_POST['delkey']));
        
        
        header("Location: bbs_new.php");
    }
    ?>
</body>
</html>


Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 12:41
by softya(ソフト屋)
コードタグの使いかたで

コード:

の指定をお願います。
省略時はc++となっております。

で、同じ環境がないので、どんな問題が出ているか具体的に説明をお願いします。
[url]http://dixq.net/board/board.html[/url] フォーラムルールに細かい説明があるのでお読みください。

Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 12:47
by kou_hei
softyaさんご親切にありがとうございます。
問題としては、フォームに文字を打ち込んで送信を押しても、
書き込み処理が行われず、掲示版に内容が追加されません。

データベースの方にも追加されていないのでinsert文に問題があるのではないかと、
ネットで色々調べたのですが、わかりませんでした。

以下が訂正したコードです。お願いします。

コード:

<?php

/*共通処理*/

//データベースへの接続
    try{
    $GLOBALS['db'] = new PDO("mysql:host=localhost; dbname=bbs", "root", "test");    
    } catch (PDOException $e) {
        echo 'connection failed: '.$e->getMessage();
    }
    
    //action取得
    $action = (isset($_GET['action']) ? $_GET['action'] : $_POST['action']);
    
    //action振り分け
    switch($action)
    {
            //書き込み処理
        case "regist":
            proc_regist();
            break;
            
            //削除処理
        case "delete":
            proc_delete();
            break;
            
            //返信処理
        case "res":
            proc_res();
            break;
            
            //表示処理
        default:
            proc_default();
            break;
            
    }
    
    // 終了処理
    
    
	
	/* ここで処理は終了 あとは個別の関数へ */
    
    
    // 基本の掲示板表示処理
	function proc_default()
	{
		
		$db = $GLOBALS['db'];
        
        
        $page_max = 15;
        $offset = ( isset($_GET['offset']) ? $_GET['offset'] : 0 );
        
        $limit = $page_max +1;
        
        $stmd = $db->query("select * from message order by no desc limit $limit offset $offset");
        $rows = $stmd->fetchAll();
    
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang = "ja">
<head>
<meta http-equiv = "Content-Type" content="text/html; charset = UTF-8">
<title>
</title>
</head>
<body>

<form method = "POST" action = "bbs_new.php">
<input type = "hidden" name = "action" value= "regist">
お名前:<input type="text" name="name"><br>
メール:<input type="text" name="mail"><br>
題 名:<input type="text" name="title"><br>
削除キー:<input type="password" name="delkey" value="<?php print $delkey ?>"><br>
<textarea name="contents" cols="60" rows="5"></textarea><br>

<?php
print "<input type='submit' name='write' value='送信'>\n";
print "<hr>\n";
print "記事番号:<input type='text' name='delno'>\n";
print "削除キー: <input type='password' name='delkey'>\n";
print "<input type='submit' name='delete' value='記事削除'>\n";
print "<input type = 'hidden' name = 'action' value = 'delete'>\n";
    
?>


</form>
    
<?php
    
    //ここからデータ表示処理
    

    
    $sql = 'select * from message order by no desc';
   
    foreach ($db->query($sql) as $row) {
        

        if ($_GET['resno']) {
            if ($row['resno'] != $_GET['resno']) continue;
        }

        if ($_POST['resno']) $resno = $_POST['resno'];
        else $resno = $no;
        if ($row['no'] != $row['resno']) $res = true; else $res = false;
        if ($res) print "<blockquote>";
        else print "<hr>";
        print "<p>No.".$row['no']." ";
        print "<b>{$row['title']}</b> 投稿者:";
        if ($row['mail']) print "<a href='mailto:{$row['mail']}'>";
        print $row['name'];
        if ($row['mail']) print "</a>";
        
        $row['time'] = date("Y/m/d H:i:s");
        print " 投稿時間:{$row['time']}";
        if (!$res && !$_GET['resno']) {
            print " <a href='bbs_new.php?resno={$row['no']}'>返信</a>";
        }
        print "<br><br>{$row['contents']}</p>";
        if ($res) print "</blockquote>";
        print "\n";
        
    }
    
    //改ページ
	
    if(count($rows)>$page_max){
        $next = $offset+$page_max;
        print "[<a href='bbs_new.php?offset=$next'>前のページ</a>]";
    }
    
    if ($offset>0){
        $prev = $offset-$page_max;
        print "[<a href='bbs_new.php?offset=$prev'>次のページ</a>]";
    }
    
        //rowに1行ずつ取得したデータが入る
   
   


    //返信データの有無
        $sql2 = 'select * from message order by no desc';
        foreach ($db->qeury($sql2) as $row2){
        
        
        
        //入力フォームの書き出し
    
        if ($_GET['resno']) {
            
            print "<input type='submit' name='write' value='No.{$_GET['resno']} に返信'>\n";
            print "<input type='hidden' name='resno' value='{$_GET['resno']}'>\n";
        } else {
            print "<input type='submit' name='write' value='送信'>\n";
            print "<hr>\n";
            print "記事番号:<input type='text' name='delno'>\n";
            print " 削除キー: <input type='password' name='delkey2'>\n";
            print " <input type='submit' name='delete' value='記事削除'>\n";
        }
        }
    }
    
    
    //header("Location: bbs_new.php");
    

    //データベースへ書き込みを行う処理
    
    function proc_regist(){
        
        
        
        // グローバル変数から取り出す
		$db = $GLOBALS['db'];
   
        //記事番号
        $sql = 'select no from message order by no desc';
        $maxno = 0;
        
        $no = $maxno + 1;
        
        
        $_POST['no'] = $no;
        if(!$_POST['resno']){
            $_POST['resno'] = $_POST['no'];
        }
        
        
        
        //データベースへインサート
        
        $sql = 'insert into message values(?,?,?,?,?,?,?,?)';
        $st = $db->prepare($sql);
        $st->execute(array($_POST['no'], $_POST['resno'],$_POST['name'], $_POST['mail'],$_POST['title'], $_POST['contents'],$_POST['delkey'], $_POST['time']));
        
    }
       
        
        
           header("Location: bbs_new.php");
        
    
    
    //データベースから削除を行う処理
    
    function proc_delete(){
        
        $db = $GLOBALS['db'];
        $sql = 'delete from message where no = ? and delkey = ? ';
            $sth = $db->prepare($sql);
            $ret = $sth->execute(array($_POST['no'],$_POST['delkey']));
        
        
        header("Location: bbs_new.php");
    }
    ?>
</body>
</html>


Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 13:09
by softya(ソフト屋)
PDOは使ったことがないので、ぱっと見は問題を見つけられませんでした。

テスト中は、echoで通過ポイントや変数を表示したほうが良いと思います。
echo 'proc_regist';
echo $_POST['no'], $_POST['resno'],$_POST['name'], $_POST['mail'],$_POST['title'], $_POST['contents'],$_POST['delkey'], $_POST['time'];
などですね。
あと戻り値がチェックされていない所があるので、 $db->queryとか$db->prepareはエラーになる可能性がある前提でプログラムを組んでみて下さい。つまりエラーの戻り値ならエラー表示を行います。

Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 14:43
by kou_hei
softyaさんアドバイスありがとうございます。
もう一度色々変えて試してみます。

Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 17:08
by kou_hei
やはり何度、トライしてもわかりません。

みなさんお手数かけますが、もしよろしかったら、小さなことでも
いいので気づいたことがあれば指摘お願いします。

よろしくお願いします。

Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 17:26
by softya(ソフト屋)
確認したいことがります。私のアドバイス通りしているなら確認できているはずです。
メッセージを送った場合の動作で
1.function proc_regist(){に到達しているか?
2.下記の関数の戻り値は正常か?
$st = $db->prepare($sql);
$st->execute(array($_POST['no'], $_POST['resno'],$_POST['name'], $_POST['mail'],$_POST['title'], $_POST['contents'],$_POST['delkey'], $_POST['time']));
3.データベースの中身はMySQLのツールなどで追加されていないことは確認済みか?
どうでしょうか?

Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 17:45
by kou_hei
1.function proc_regist(){に到達しているか?
確認したところ到達して今いました。

2.下記の関数の戻り値は正常か?
$st = $db->prepare($sql);
$st->execute(array($_POST['no'], $_POST['resno'],$_POST['name'], $_POST['mail'],$_POST['title'], $_POST['contents'],$_POST['delkey'], $_POST['time']));
こちらも戻り値が正常であることが確認できました。

3.データベースの中身はMySQLのツールなどで追加されていないことは確認済みか?
どうでしょうか?

こちらは、デーダベースに追加されていないことが確認されました。

Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 17:57
by softya(ソフト屋)
insert が成功してデータベースに追加されていないなんて事は無いはずなのですが、PHPでやったことと同じSQL文をMySQLのツールから実行してもインサートされないのでしょうか?

Re: phpとmysqlでフローチャートに乗っ取って掲示版を作ろうとしています。

Posted: 2012年8月02日(木) 21:47
by pooka
ぱっと見ですが、1つのform内に
kou_hei さんが書きました:

コード:

<input type = "hidden" name = "action" value= "regist">

コード:

<input type = 'hidden' name = 'action' value = 'delete'>
があるので(73、86行目)、'delete'の方がPOSTされてproc_delete()が実行されているのではないでしょうか?

あと149行目の$db->qeuryは$db->queryの間違いかと。