質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

543閲覧

MySQLからデータを読み込むのがうまく行きません。

Burekomi

総合スコア1

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2023/04/25 11:23

編集2023/04/26 18:40

実現したいこと

データベースから読んだデータを変更して書き込む

前提

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としか表示されない空データが取得されるだけでした。

よろしければ、アドバイスいただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AbeTakashi

2023/04/25 11:56 編集

残念ですが、それだけの情報だとエスパーでも現れない限り回答が出ないと思います。情報があまりにも少なすぎます。せっかくソースコードを提示するのなら、そんな断片的な一部分ではなく、可能な限り出せるところは全部出してください。ページが二つあってソースコードも分かれてるのであれば、両方記載しましょう(前とか後とか言われても第三者は何を言ってるかさっぱり分からんです・・・)。データベースのホストやユーザ名、パスワードとかはマスクして良いですが、SQL文は省略せずに書きましょう。 あとはデータベースのテーブル構造に関する情報や、PHPやMySQLが動いてる環境(OSなど)の情報やPHP、MySQLのバージョンの情報もあった方がより良いです。 参考) https://teratail.com/help/question-tips ↑ 一度上から下まですべて読んでいただければ、おそらく情報が足りないことに気付くかと思います。回答者が答えられるように質問文を編集して可能な限り情報を追記してください。
Burekomi

2023/04/25 22:26

AbeTakeshi様 御質問ありがとう御座います。 では、ソースコードを少し掲載いたします、 はじめのページでは、以下のコードで、DBを呼び出して、格納された順位データを取得しました。 $CsScore=$_POST["customer_score"]; $CsStage=$_POST["achieved_stage"]; try { $DB=new PDO('mysql:dbname=????????;host=localhost;charset=sjis','ID,'パスワード); $DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC); $statement=$DB->prepare("SELECT * FROM hi_score"); $statement->execute(); $data=$statement->fetchAll(); for ($i=0;$i<=4;$i++){ $data[$i]['Stage']=substr(" ".$data[$i]['Stage'],-8); $data[$i]['Name']=substr(" ".$data[$i]['Name'],-11); $data[$i]['Score']=substr("00000".$data[$i]['Score'],-6); } $DB=null; } catch (PDOException $e) { echo 'DB接続エラー: ' . $e->getMessage(); }  このページでは、そのまま順位をphpからjsに渡して、表示することに成功しております。データは一旦phpからjsに渡されて処理したあとに、再びDBにアクセスしてデータを格納するために、phpに渡す目的でsubmitされます。  submit先のページの記述が以下です。  $CsName=$_POST["name"]; $CsStage=$_POST["stage"]; $CsScore=$_POST["score"]; $CsAddress=$_POST["address"]; $j=$_POST["customer_lanking"]; try { $DB=new PDO('mysql:dbname=?????????;host=localhost;charset=sjis','ID','パスワード'); $DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC); $statement=$DB->prepare("SELECT * FROM hi_score"); $statement->execute(); $data=$statement->fetchAll(); $DB=new PDO('mysql:dbname=mutoukai;host=localhost;charset=sjis','mutoukai','Ld0j1n010DB'); $DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);    } catch (PDOException $e) {  echo 'DB接続エラー: ' . $e->getMessage(); } for($i=5;$i>$j;$i--){ $Name0=$data0['Name']; $Stage0=$data0['Stage']; $Score0=$data0['Score']; $Address0=$data0['Address']; $statement=$DB->prepare("UPDATE hi_score SET Name=:Name0,Stage=:Stage0,Score=:Score0,Address=:Address0 WHERE Number='".$i."'"); $statement->bindParam(":Name0",$Name0,PDO::PARAM_STR); $statement->bindParam(":Stage0",$Stage0,PDO::PARAM_STR); $statement->bindParam(":Score0",$Score0,PDO::PARAM_INT); $statement->bindParam(":Address0",$Address0,PDO::PARAM_STR); $statement->execute(); } $statement=$DB->prepare("UPDATE hi_score SET Name=:CsName,Stage=:CsStage,Score=:CsScore,Address=:CsAddress WHERE Number='".$j."'"); $statement->bindParam(":CsName",$CsName,PDO::PARAM_STR); $statement->bindParam(":CsStage",$CsStage,PDO::PARAM_STR); $statement->bindParam(":CsScore",$CsScore,PDO::PARAM_INT); $statement->bindParam(":CsAddress",$CsAddress,PDO::PARAM_STR); $statement->execute(); $DB=null;   このページでは、再び順位を取得して、プレイヤーと比較して、新たな順位をDBに格納するのですが、取得したはずの$data0の内容が、echoで表示するとすべてArrayとしかでず、空データしか取得されません。従って、データーはヌルストリングと0が格納されてしまいます。  読み込みのコードがまずいのかと考え、以下のコードも試しました。 $CsName=$_POST["name"]; $CsStage=$_POST["stage"]; $CsScore=$_POST["score"]; $CsAddress=$_POST["address"]; $j=$_POST["customer_lanking"]; $DB=new PDO('mysql:dbname=?????????;host=localhost;charset=sjis','ID','パスワード'); $DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC); for($i=5;$i>$j;$i--){ $k=$i-1; $statement=$DB->prepare('SELECT * FROM hi_score WHERE Number=?'); $statement->bindValue(1,$i); $statement->execute(); $data0=$statement->fetch(); $Name0=$data0['Name']; $Stage0=$data0['Stage']; $Score0=$data0['Score']; $Address0=$data0['Address']; $statement=$DB->prepare("UPDATE hi_score SET Name=:Name0,Stage=:Stage0,Score=:Score0,Address=:Address0 WHERE Number='".$i."'"); $statement->bindParam(":Name0",$Name0,PDO::PARAM_STR); $statement->bindParam(":Stage0",$Stage0,PDO::PARAM_STR); $statement->bindParam(":Score0",$Score0,PDO::PARAM_INT); $statement->bindParam(":Address0",$Address0,PDO::PARAM_STR); $statement->execute(); } $statement=$DB->prepare("UPDATE hi_score SET Name=:CsName,Stage=:CsStage,Score=:CsScore,Address=:CsAddress WHERE Number='".$j."'"); $statement->bindParam(":CsName",$CsName,PDO::PARAM_STR); $statement->bindParam(":CsStage",$CsStage,PDO::PARAM_STR); $statement->bindParam(":CsScore",$CsScore,PDO::PARAM_INT); $statement->bindParam(":CsAddress",$CsAddress,PDO::PARAM_STR); $statement->execute(); $DB=null;  しかし、結果は同じく、$data0には、Arrayとしか表示されない空データが取得されるだけでした。  PHP80で、OSはWindows10です。  アドバイスして戴けたらさいわいです。  
m.ts10806

2023/04/26 00:00

質問は編集できます。 コードはマークダウンでご提示を。 質問タグもPHPは必須です。 PHP80というのはまだ出てません。最新でも8.2です。 phpinfo()で出てきたものをそのまま提示してください。
m.ts10806

2023/04/26 00:02

あと、「前のページ」「後のページ」とは? どんなに熟練者でも他人が作りたいものを知ることはできないので、前提とか仕様は丁寧に説明してください。 XY問題は避けるべきですからね。
m.ts10806

2023/04/26 02:34

echoで変数内容を表示できるのは基本文字列として扱える情報だけ。 配列やオブジェクトを確認したいならデバッグでも使える機能があるので、そちらを(PHPマニュアル確認してください)
Burekomi

2023/04/26 02:56

m.ts様 教えていただきありがとう御座います。 ソースコードを追加しました。
m.ts10806

2023/04/26 03:06

コードはマークダウンのcodeで提示してください。 (マークダウンについてはヘルプに説明があります)
guest

回答1

0

自己解決

ごめんなさい、全然見当外れの質問でした。
echoで$data0の内容が表示されないと指摘されて、print_r にて表示しました。すると、$data0にちゃんと格納されておりました。
問題は、データーベースになぜスコア0で空白のデータが入れられるかですが、
setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
としていたために、$data0の配列の要素番号が0から始まる整数になると思い、はじめ番号で入れていたのです。そのため、'Score'にあたる三番目として$data0[2]と書いていたのが、0になって、これがデーターベースに格納されたようです。
さらに、いろいろ試行錯誤しているうちに上記のプログラムになったのですが、この最後に書いたソースでは、取り出したデータを同じNumberの行に入れています。Numberは、順位順に1~5が割り当てられていて、同じ順位のところにまた格納するプログラムです。これでは、もともとあったScoreの0が消えないわけです。
どうして、この質問のような疑問を抱いたかは、echoで$data0が表示されなかったからにすぎません。大変お騒がせしました。
上記をふまえ、データーベースに格納する場所をずらしてやったら、上手くいきました。修正後のソースを参考までに掲載しておきます。

 $CsName=$_POST["name"];
$CsStage=$_POST["stage"];
$CsScore=$_POST["score"];
$CsAddress=$_POST["address"];
$Lank=$_POST["customer_lanking"];
$DB=new PDO('mysql:dbname=データベース;host=localhost;charset=sjis','id','password');
$DB->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
for($i=5;$i>$Lank;$i--){
$statement=$DB->prepare('SELECT * FROM hi_score WHERE Number=?');
$statement->bindValue(1,$i-1);
$statement->execute();
$data=$statement->fetch();
$Name0=$data["Name"];
$Stage0=$data["Stage"];
$Score0=$data["Score"];
$Address0=$data["Address"];
$statement=$DB->prepare("UPDATE hi_score SET Name=:Name0,Stage=:Stage0,Score=:Score0,Address=:Address0 WHERE Number=:Lank");
$statement->bindValue(":Lank",$i,PDO::PARAM_INT);
$statement->bindValue(":Name0",$Name0,PDO::PARAM_STR);
$statement->bindValue(":Stage0",$Stage0,PDO::PARAM_STR);
$statement->bindValue(":Score0",$Score0,PDO::PARAM_INT);
$statement->bindValue(":Address0",$Address0,PDO::PARAM_STR);
$statement->execute();
}
$statement=$DB->prepare("UPDATE hi_score SET Name=:CsName,Stage=:CsStage,Score=:CsScore,Address=:CsAddress WHERE Number=:CsLank");
$statement->bindValue(":CsLank",$Lank,PDO::PARAM_INT);
$statement->bindValue(":CsName",$CsName,PDO::PARAM_STR);
$statement->bindValue(":CsStage",$CsStage,PDO::PARAM_STR);
$statement->bindValue(":CsScore",$CsScore,PDO::PARAM_INT);
$statement->bindValue(":CsAddress",$CsAddress,PDO::PARAM_STR);
$statement->execute();
$DB=null;
header("location:game_title.html");

お騒がせいたしました。

投稿2023/04/26 08:57

編集2023/04/26 09:40
Burekomi

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問