実現したいこと
データベースから読んだデータを変更して書き込む
前提
jsとphpでゲームを作っているのですが、ハイスコアの格納にデータベースを使用したく思っております。データベースにテーブルを作って接続することころまではうまく行ったのですが、もともとデータベースにあるスコア順を読み込んで、jsで処理してphpで書き込むときに、なぜか同じデータを二度読み込めず、読み込んだデータは空データとして取得されました。
全く同じ処理を、二つのページでやっているのですが、前のページではちゃんとデータを読み込むのに、後のページでは空データしか読み込みません。
処理としては、ゲームが終わり、前のページでデータベースからハイスコアを取り出し、jsでゲームのスコアを評価し、ハイスコアに入るようなら、postメソッドで後のページに送って、phpでデータベースに格納すると言うものです。
ゲームした人のスコアは格納できるのですが、それによってずれた順位の成績を、データベースに格納するときに、もう一度データーベースを参照するのですが、そのときのデータ取得がうまくいかないために、順位が変わった部分に、空白とゼロが格納されてしまうようです。
前のページでは、以下のコードで、DBを呼び出して、格納された順位データを取得しました。
001 $CsScore=$_POST["customer_score"];
002 $CsStage=$_POST["achieved_stage"];
003 try {
004 $DB=new PDO('mysql:dbname=????????;host=localhost;charset=sjis','ID,'パスワード);
005 $DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
006 $statement=$DB->prepare("SELECT * FROM hi_score"); $statement->execute();
007 $data=$statement->fetchAll();
008 for ($i=0;$i<=4;$i++){
009 $data[$i]['Stage']=substr(" ".$data[$i]['Stage'],-8);
010 $data[$i]['Name']=substr(" ".$data[$i]['Name'],-11);
011 $data[$i]['Score']=substr("00000".$data[$i]['Score'],-6);
012 }
013 $DB=null;
014}
015 catch (PDOException $e) { echo 'DB接続エラー: ' . $e->getMessage(); }
このページでは、そのまま順位をphpからjsに渡して、表示することに成功しております。データは一旦phpからjsに渡されて処理したあとに、再びDBにアクセスしてデータを格納するために、phpに渡す目的でsubmitされます。
submit先のページの記述が以下です。
001 $CsName=$_POST["name"];
002 $CsStage=$_POST["stage"];
003 $CsScore=$_POST["score"];
004 $CsAddress=$_POST["address"];
005 $j=$_POST["customer_lanking"];
006 try {
007 $DB=new PDO('mysql:dbname=?????????;host=localhost;charset=sjis','ID','パスワード');
008 $DB-> setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
009 }
010 catch (PDOException $e) { echo 'DB接続エラー: ' . $e->getMessage(); }
010 for($i=5;$i>$j;$i--){
011 $Name0=$data0['Name'];
012 $Stage0=$data0['Stage'];
013 $Score0=$data0['Score'];
014 $Address0=$data0['Address'];
015 $statement=$DB->prepare("UPDATE hi_score SET Name=:Name0,Stage=:Stage0,Score=:Score0,Address=:Address0 WHERE Number='".$i."'");
016 $statement->bindParam(":Name0",$Name0,PDO::PARAM_STR);
017 $statement->bindParam(":Stage0",$Stage0,PDO::PARAM_STR);
018 $statement->bindParam(":Score0",$Score0,PDO::PARAM_INT);
019 $statement->bindParam(":Address0",$Address0,PDO::PARAM_STR);
020 $statement->execute();
021 }
022 $statement=$DB->prepare("UPDATE hi_score SET Name=:CsName,Stage=:CsStage,Score=:CsScore,Address=:CsAddress WHERE Number='".$j."'");
023 $statement->bindParam(":CsName",$CsName,PDO::PARAM_STR);
024 $statement->bindParam(":CsStage",$CsStage,PDO::PARAM_STR);
025 $statement->bindParam(":CsScore",$CsScore,PDO::PARAM_INT);
026 $statement->bindParam(":CsAddress",$CsAddress,PDO::PARAM_STR);
027 $statement->execute();
028 $DB=null;
このページでは、再び順位を取得して、プレイヤーと比較して、新たな順位をDBに格納するのですが、取得したはずの$data0の内容が、echoで表示するとすべてArrayとしかでず、空データしか取得されません。従って、データーはヌルストリングと0が格納されてしまいます。 読み込みのコードがまずいのかと考え、以下のコードも試しました。
001 $CsName=$_POST["name"];
002 $CsStage=$_POST["stage"];
003$CsScore=$_POST["score"];
004 $CsAddress=$_POST["address"];
005 $j=$_POST["customer_lanking"];
006 $DB=new PDO('mysql:dbname=?????????;host=localhost;charset=sjis','ID','パスワード');
007 $DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
008 for($i=5;$i>$j;$i--){
009 $k=$i-1;
010 $statement=$DB->prepare('SELECT * FROM hi_score WHERE Number=?');
011 $statement->bindValue(1,$i);
012 $statement->execute();
013 $data0=$statement->fetch();
014 $Name0=$data0['Name'];
015 $Stage0=$data0['Stage'];
016 $Score0=$data0['Score'];
017 $Address0=$data0['Address'];
018 $statement=$DB->prepare("UPDATE hi_score SET Name=:Name0,Stage=:Stage0,Score=:Score0,Address=:Address0 WHERE Number='".$i."'");
019 $statement->bindParam(":Name0",$Name0,PDO::PARAM_STR);
020 $statement->bindParam(":Stage0",$Stage0,PDO::PARAM_STR); $statement->bindParam(":Score0",$Score0,PDO::PARAM_INT);
021 $statement->bindParam(":Address0",$Address0,PDO::PARAM_STR);
022 $statement->execute();
023 }
024 $statement=$DB->prepare("UPDATE hi_score SET Name=:CsName,Stage=:CsStage,Score=:CsScore,Address=:CsAddress WHERE Number='".$j."'");
025 $statement->bindParam(":CsName",$CsName,PDO::PARAM_STR);
026 $statement->bindParam(":CsStage",$CsStage,PDO::PARAM_STR);
027 $statement->bindParam(":CsScore",$CsScore,PDO::PARAM_INT);
028 $statement->bindParam(":CsAddress",$CsAddress,PDO::PARAM_STR);
029 $statement->execute();
030 $DB=null;
しかし、結果は同じく、$data0には、Arrayとしか表示されない空データが取得されるだけでした。
よろしければ、アドバイスいただけたら幸いです。

回答1件
あなたの回答
tips
プレビュー