プロが教えるわが家の防犯対策術!

ネット上で公開されているソースコードを真似して練習しているのですが、フレームを使ったチャットルームでわからないことがあるので教えてください。
まず、ネームを入力してログインボタンを押す画面があり、それのコードは、

<p>お名前を入力してログインボタンを押してください。</p>
<form action="main.php" method="post" taeget="_self">
<input type="text" name="nick" cols="20">
<input type="submit" value="ログイン"><br>
</form>

これで、main.phpがフレームで読み込みと書き込みを上下に分けたページになっていて、
nickはこのmain.phpに

<?
setcookie("nick",$nick) //use cookie to store user nickname
?>

と記述するようになっているのでそのようにしたのですが、実際に書き込んでみると、nickの値のみが
mySQLに書き込まれていませんでした。

書き込み用のページ(speak.php)のコードは、
<?php
$user = "root";
$password = "";
$pdo = new PDO('mysql:dbname=sim2;host=localhost;',$user,$password);
$pdo->query('SET NAMES utf8');
date_default_timezone_set('Asia/Tokyo');
$time = date('Y m/d H:i:s');
if(isset($_POST['nick'])) $nick=$_POST['nick']; else $nick="";
if(isset($_POST['words'])) $words=$_POST['words']; else $words="";
if($words !="")
{
$write = $pdo->prepare("INSERT INTO chat(chtime,nick,words) VALUES('$time','$nick','$words')");
$write->execute();
}
$pdo=null;
?>
<form action="speak.php" method="post" target="_self">
<input type="text" name="words" cols="20">
<input type="submit" value="書き込む"><br>
</form>

このようにしたのですが、nickの値が書き込みできない原因はわかりますでしょうか?
あと、クッキーを使わずにフレームを使ったやり方でnickを取得する方法って他にありますか?
よろしくお願いいたします。

A 回答 (2件)

>そうなんですか?クッキーについて一応調べてはみた



いや、命題に
>setcookie("nick",$nick)
とあるので、そうかと思いましたが違いますか?

>名前付きプレースホルダか「?」プレースホルダを使うのが良いと本に書いてあるので
むしろ?を使わないのであればprepareをつかわずにそのままqueryを発行してしまえばよいでしょう

>SET NAMES utf8
については、あまりクエリーとして発行しない方がよい・・・と言われています。
PHPの現行バージョンではcharsetの指定はPDOを宣言する際に指定するのが標準です
(古いPHPのバージョンは別途処理するのが妥当)

またわざわざtimeをわたさないでもMySQL側の日付関数を使った方がよいかも
そうじて以下のような感じ?

$pdo = new PDO('mysql:dbname=sim2;host=localhost;charset=utf8',$user,$password);
$nick=isset($_COOKIE['nick'])?$_COOKIE['nick']:"";
$words=isset($_POST['words'])?$_POST['words']:"";
if($words !==""){
$data=array($nick,$words);
$query="INSERT INTO `chat`(`chtime`,`nick`,`words`) VALUES(NOW(),?,?)";
$stmt= $pdo->prepare($query);
$stmt->execute($data);
}
$pdo=null;
    • good
    • 0
この回答へのお礼

yambejpさん、お忙しいのにわざわざコードを書いてくださり大変感謝です!ほんとにどうもありがとうございます!!

先ほどお礼を書いた後にクッキーについてもう一度調べたらとてもわかりやすくサンプルで説明されてるページをみつけて、
それでやってみたらうまくいきました!
それから、プレースホルダの方も本のやり方でやってみまして、問題なく完成させることが出来ました。

それでご報告をと思いまして来てみたら参考コードを書いてくださっててとても嬉しく読ませていただきました。
そしてとても簡潔で綺麗なコードの書き方をされてますね。すごく参考になります。

早速真似して書き直してみたいと思います。どうもありがとうございました!
また何かありましたらよろしくお願いいたします。

お礼日時:2015/10/19 12:41

nickはクッキーで渡しているんですよね?


postでチェックしても得られないのでは?
ちなみに

>$write = $pdo->prepare("INSERT INTO chat(chtime,nick,words) VALUES('$time','$nick','$words')");

なんのためにプレースホルダを利用しているのでしょうか?
SQL文にダイレクトで変数いれちゃまずいでしょ?
    • good
    • 0
この回答へのお礼

回答してくださりありがとうございます。

>nickはクッキーで渡しているんですよね?
>postでチェックしても得られないのでは?
そうなんですか?クッキーについて一応調べてはみたのですが、よくわかりませんでした。もうちょっと調べてみます。

>なんのためにプレースホルダを利用しているのでしょうか?
>SQL文にダイレクトで変数いれちゃまずいでしょ?
このやり方は他の方のを真似して、そちらのコードで作ったものは問題なく作動したのでそのまま使ったのですが(書き方の意味とかはほぼわかっていなくて、ただ真似してやってる段階なのです。すみません)、
ご指摘いただいてちょっと今、「PHP+MySQLマスターブック」という手持ちの本を見てみたのですが、
yambejpさんが書いてくださってる、「変数をいれちゃまずい」というのは、危険だからということでしょうか?

名前付きプレースホルダか「?」プレースホルダを使うのが良いと本に書いてあるので、これでやってみます。
いろいろと教えてくださりどうもありがとうございました。
また何かありましたらよろしくお願いいたします。

お礼日時:2015/10/19 11:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!