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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

1464閲覧

php sql において、phpでつくったsqlが作動してくれない

Gnr4A

総合スコア30

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2021/05/27 06:11

編集2021/05/29 10:50

php sqlについて質問します。以下のプログラムでなぜ$sqlにfalseが入るのでしょうか。sql文もネットで調べていたので構文は間違えているはずはありませんし、各変数にはしっかりちゃんとした値が格納されています。
エラーが出ていませんのでますますわかりません。回答よろしくお願いします。
ボタンが押された場合に以下のプログラムが動きます。これはsql文での更新処理です。なのでupdateを使用しています。
$_POST['name']には変更したい名前、$_POST['age']には変更したい年齢、$_SESSION['id']には変更したい行のidがそれぞれ格納されており、$_POST['name']は文字列型、その他は整数型で変更したいです。

php

1$local='localhost'; 2$user_name='root'; 3$pass=''; 4$db_name='sample'; 5 6//if文にはちゃんと入っています 7if(isset($_POST['botton'])){ 8//var_dumuしたら色々配列で表示された。動いていないとfalseが表示されるので動いていると思われる 9 $link=mysqli_connect($local,$user_name,$pass,$db_name); 10//var_dumpしたらtrueが表示された 11 mysqli_set_charset($link,'utf8'); 12//var_dumpしたらfalseが表示された 13 $sql=mysqli_query($link,"UPDATE sample SET name='".$_POST['name']."',age=".$_POST['age']."WHERE id=".$_SESSION['id'].";"); 14 mysqli_close($link); 15 var_dump($sql); 16}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/27 06:21

「mysqli_connect()」及び「mysqli_set_charset()」の戻り値は確認しましたか?
Gnr4A

2021/05/27 06:25

はい、var_dumpを加えて確認しました。
m.ts10806

2021/05/27 06:26

書いてないことは誰もやったこととして認識しないので正確に具体的に記載してください。
退会済みユーザー

退会済みユーザー

2021/05/27 06:28

確認済みであれば、SQL文が間違えていると思いますが、 > sql文も調べていて間違えているはずはありませんし、各変数にはしっかりちゃんとした値が格納されています。 はどのように確認しましたか?
Gnr4A

2021/05/27 06:32

言い方がダメでしたね、すいません。 > sql文も調べていて間違えているはずはありませんし ネット上で調べて参照したのでupdate分は間違えていないと思われます。間違えている可能性のあるのは値ですが、しかし$sqlにfalseが入るのはおかしいと思います。なので自分はsql文が間違えていると考え難いです >各変数にはしっかりちゃんとした値が格納されています。 var_dumpで確認済みなのでそれは間違いありません。
m.ts10806

2021/05/27 06:36

そのネットの記事が間違ってないという裏とりはしたんですか? 個人の記事なんて間違いだらけ。 まあ何を参考にしたか不明なのでそれが正しいかどうか他人が客観的に判断するすべがないし、提示しないなら誰も信じない。 var_dumpも同じ。「何を送って何が表示されたか」を書かないと間違いないことは誰も確認できない。
退会済みユーザー

退会済みユーザー

2021/05/27 06:40

出来上がったSQL文自体が正しいのか、確認してないんですね たぶん、間違ってますよ
Gnr4A

2021/05/27 06:41

2,3件調べたのですが、、、 何が表示されたか修正しますね
退会済みユーザー

退会済みユーザー

2021/05/27 06:47

一度出来上がったSQL文自体を確認したほうがいいですよ 値次第ですが、ぱっと見で間違ってそうな箇所あるので
m.ts10806

2021/05/27 07:04 編集

なぜその参考にしたという2、3件を頑なに提示してないのか理解に苦しみます。 間違ったこと書いてたら質問者さんのような被害者が出ないように指摘しないといけないのですけど。 多くは参考にした人が間違ってるケースですが、間違ってる情報も中にはある。 公式ドキュメントでの裏とりもなしに個人記事を鵜呑みにしてはいけません
m.ts10806

2021/05/29 11:01

>ネットで調べていたので URL提示してください。 本当にその通りなら投稿主に指摘してきます。 間違った情報を発信し続けているわけで、質問者さんのような被害者が出ないようにしないといけません。 質問者さん自身がその記事を正しく理解していたかどうかも今後のために必要です。 ここで情報を出さないのは投稿者のためにもなりません。
guest

回答4

0

エラー捕捉できるような実装になっていません。

返ってきたエラーも確認してませんね。

MySQLはPHPからすれば外部の仕組みなので明示的に捕捉するように書かないとエラー返してくれません。

これに限らず外部とのやり取りはエラーハンドリング必須です。

sql文も調べていて間違えているはずはありませんし、各変数にはしっかりちゃんとした値が格納されています。

自信があるのは結構なことですが、人間は間違えるものです。
そしてプログラムは書いたとおりにしか動かない。出た結果がすべて。
となると、想定の通り動かない原因はそのコードを書いた人間にあります。

「間違えるはずがない」という慢心を捨てない限り動くコードは書けません。

SQLが間違えてないというエビデンスは出せますか?
その生成されたSQLをDBに直に実行して確認取らない限り「間違ってない」ことは担保できません。
他にも確認すべきことはたくさんあるのでは?

本当にそのmysqli_query()実行する分岐入ってる?
$_POSTはvar_dumpで確認した?
MySQLは起動してるか?
接続先は間違ってないか?

とか。
初心者が最初に覚えるべきデバッグはどこまでされましたか?
書いたコードが間違いないかの確認をどこまでしましたか?

まずは自分を疑ってください。
コードは書いたとおりに動いています。
書いたのは誰ですか?

投稿2021/05/27 06:25

m.ts10806

総合スコア80875

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

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

m.ts10806

2021/05/27 06:33

少しは臆病になったほうがいい。 自動車教習でも習う「“だろう”じゃなく“かもしれない”」のように。 「間違ってるかもしれない」が先。 どんなに調べても記事や理解が間違ってればダメだし、記事や理解が合っていても自分が間違って書いてればダメ。 確証のとり方は慎重に。自信なんて邪魔にしかならない。
Gnr4A

2021/05/27 06:38

回答ありがとうございます。 if文ですか?if文はしっかり入っています $_POSTはvar_dumpで確認済みです MySQLは起動済みです >デバッグはどこまでされましたか? デバッグって動作確認でしょうか。 全ての行デバッグ済みです 書いたコードが間違いないかはデバッグをある程度しています。sqlは確認しようとしたらfalseが入っているので確認できなかったです。 このコードは書いたのは自分です。
m.ts10806

2021/05/27 06:44

回答を3割くらいしか読んでないのが分かりました。分からない箇所があるならスルーせず確認してください。 >デバッグは動作確認 あとのコメント見る限り間違った解釈してます。2割でも不明なら勝手解釈せず調べること。 「全ての行デバッグ済み」ってどうやったんですか? エラーハンドリングや 生成されるSQLをDB直実行は? >このコードは書いたのは自分です。 はいそうですね。 では「全部間違ってるかもしれない」と疑うところからスタートしてください。
Gnr4A

2021/05/27 06:48

さっきからみてるけどそれってなんの解決にもなっていませんよ。自分はいくら調べても直してもダメだから聞いているのに対し、何も質問に対してアドバイスをくれていません。それがまた質問放置にもつながります。理由は解決しないしベストアンサーに選びようもなく、自己解決を書くとたいてい文句を言われるからです。ではどうしろと?全部間違えているのならまず動きません。
m.ts10806

2021/05/27 07:00

「全部間違ってる"かもしれない"」 自分を疑うことからはじめてねってことです。 自分で解決できればそれが一番早いのです。成長につながる直接の解決策以上のアドバイスをしています。 質問せずに解決できればそれが一番早いから。 質問文考えるのも打つのも何回もやりとりしたり、回答を読んで理解するのもコストかかりますよね。 相手の時間も少なからず使ってるわけです。 私の回答は大抵、この先なにかの問題にあたったときにも役立つ内容になっています。 だから「あのとき言ったこと理解してれば質問しなくて済んだのに」と指摘するわけです。別にベストアンサー要らないのでたまに見返すと良いですよ。 「あの時言ってたのはこれだったのか」この数回でも幾つも当てはまります。 ちなみに既に間違いを見つける術は提示しています。 PHPで作ったSQLを画面出力してMySQLに直接実行してみてください。おそらく、エラーになります。 次はPHP側でそのエラーを捕捉するためのエラーハンドリングもする。 そしたら同じエラーが出る。 あとはMySQL側で想定の結果を得られるように調整し、できたらPHPに反映。
m.ts10806

2021/05/27 07:03

ちなみに「どう解決したのか」具体的に書けば自己解決で文句言われることはありません。 「解決しました」だけだと誰でも「どうやって?」と思うでしょ。 この手のコミュニティは自分さえ良ければそれでいい人には優しくないです。この手のコミュニティじゃなくても当たり前ですね。自分のことしか考えてないんだから
Gnr4A

2021/05/27 07:15

アドバイスはありがたいと思います。ですが他人のレスポンスを割り込んで入ってこられるとこちらとしてもやりにくいし、引用ができないみたいなので分からなくなってくるのであまりしないでほしいです。 あと質問にあまり関わらないような回答は控えてもらいたいです。それが解決策にはならないので。 あまり他に余計なプログラム等は書きたくなく、また後悔したくありません。なので最低限の所しか書きません。書いているところ以外で解決したのならなんて書けばいいのでしょうか。 別にアドバイスが嫌なわけではありません。けれどこちらとして真剣に悩んでいるのにアドバイスばかりだと解決策にはならず進まないので時間が無駄になっているとたびたび思うからです。
m.ts10806

2021/05/27 07:26

>あと質問にあまり関わらないような回答 関わってます。 自身が理解できてないことを「関係ない」と切り捨ててるだけです。 ちゃんと理解できれば本件も解決できるし今後悩むことも少なくなる。 >また後悔したくありません。 言ってることとやってること合ってません。 いまのやり方だと間違ってるので後悔します。 いいですか? ちゃんと回答理解できてたらしなくて良かった質問がたくさん。 真剣なら変に要約せず全部出すことです。要約しすぎて何度もヒアリングが必要になって時間がどんどん過ぎていきます。 自ら他人も巻き込んで時間の無駄を生み出してるわけです。ご認識ください。 それにこちらが真剣じゃないならこんな長文や調べた記事や理解していることを赤の他人のために出そうと思いません。 回答者をなんだと思ってますか? 暇つぶしにしても他人のために時間を割くのに、もしかしからその人のこの先を決めるかもしれないのに、なんの覚悟もなくできるわけないでしょう。 ※もちろんネットの記事と同じで嘘を書く人はいるでしょうけど、私はそんなことはないし、指摘されることもあって受け入れて成長してきた結果ここにいるのでご安心を。
m.ts10806

2021/05/27 07:32

>ですが他人のレスポンスを割り込んで入ってこられると 断りなく入ったことは謝ります。失礼しました。 ただ、最初のコメントは回答に向けたものですし、それ以降は私の回答にも関係する補足です(というかこの質問についた回答、本質は全部同じ)。そこはご認識くださいますよう。
m.ts10806

2021/05/27 07:35

続き。 >なんの覚悟もなくできるわけないでしょう。 なので、一言一句見逃さず読むこと。 ベストアンサーに選んだ回答にちゃんとキーワード書いてあるのに記事も提示されてるのに読み飛ばしてるから頓珍漢なことを追加質問しています。
m.ts10806

2021/05/27 07:53

>書いているところ以外で解決したのならなんて書けばいいのでしょうか。 ちゃんと調査して原因が分かったなら備忘録に残すつもりで書いたら良いです。思ってる場所と違うところが原因なんてこの先幾らでも出てきます。 だって書いたとおりにしか動かないんだから。 それを書かないのは時間の無駄です。 自分で理解して初めて人に説明できる、文章に起こせる。 理解できてないままだから何もかけないのでは。  物事を点でしか捉えられないと時間のムダばかり生まれます。視点を変えては? 今まで当然だと思ってた物事が途端に無駄だったと気づけますよ。 今回の質問も以前得たアドバイスが活かせてたら出てこなかった無駄な時間です。 あなたが初心者だからではなく、理解しないまま、常に点だけで生きるスタンスだからです。 やり方変えないと今後も傍から見ると時間ばかり費やして成果なしですし、同じ指摘を色んな人から受け続けます。 「今だけしのげばいい」だと結局一歩先で転ぶんですよ。
m.ts10806

2021/05/27 08:08

一気に全部理解するのは確かに難しく、キャパオーバーにもなるでしょう。 でもそこで「理解できないからスルー」ではなく「理解できてないことを自認」くらいはしておいてください。「つもり」ではなく。 回答する以上はなんらかの形で解決の手助けをしたいと関わってきた人たちです。 曲解したり敵対したりするならともかく、分からないことを分からないと言って責めるようなことはないです。 分からないことをスルーして、スルーしたところを確認しておけば出てこなかった疑問をぶつけるから指摘します。 (あと「分かりました」と返事だけの人とか) わからないことはとことん聞いて自分の血肉にするくらいの気概は必要ですよ。 プログラミングの本質は問題解決にあるので、難しくて当然です。覚悟と気概がないと乗り切ることはできません。 それが例え趣味であっても。 はからず他人の迷惑をかけてしまうことだってあるわけですから。セキュリティリスクを抱えたまま突き進むのはNGです。
guest

0

ベストアンサー

sql文も調べていて間違えているはずはありません

本当か?

php

1$sql=mysqli_query($link,"UPDATE sample SET name='".$_POST['name']."',age=".$_POST['age']."WHERE id=".$_SESSION['id'].";");

↓ デバッグ用に、まずこう直す。

php

1$sql_str = "UPDATE sample SET name='".$_POST['name']."',age=".$_POST['age']."WHERE id=".$_SESSION['id'].";"; 2var_dump($sql_str); 3$sql = mysqli_query($link, $sql_str);

で、気づいたところを直してみる。
慣れないうちは、SQL文の完成度を確認しやすい構造にしておくといいよ。

ところで、SQL文に直接$_POSTとか連結するのは、ダメだよ。
SQLインジェクション - Wikipedia
$_POSTや$_GETなど、外部からくるデータは、
仕組みを逆手に取って細工したデータを受け取る可能性もあり、
基本的に「汚染されている(tainted)」データである。
汚染されているか居ないかを確認するのを、バリデーションっていう。
バリデーション(バリデート)とは - IT用語辞典 e-Words
それを杜撰にしてデータベース操作用のSQL文に混ぜ込むと、
SQLインジェクション攻撃の標的になる。
外部からくるデータの文字列を工夫して、強制的にSQL文を終了させ破壊するような任意のSQL文を実行させたりする可能性がある。
そういう、意図しないSQL文を実行しないために、
SQL文の中に展開するときにエスケープ処理を自動的にやってくれるのが、プレースホルダとプリペアドステートメントの仕組み。
とっても便利で脆弱性を避けられる仕組みを使わない理由はない。
自分でエスケープ処理を組み込むのは手間だし、考慮が浅くて防ぎきれなかったりするかもしれないし。

プレースホルダとプリペアドステートメントのやり方を学ぼう。(できればPDOを使おう。)
PHPでデータベースに接続するときのまとめ - Qiita

投稿2021/05/27 07:13

編集2021/05/27 07:40
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Gnr4A

2021/05/27 07:29

ありがとうございます!! $_POST['age']."とWHERE id="の間にスペースがなかったためWHERE句として見られていなかっただけでした!sqlのデバッグの仕方が知らなかったため助かりました! 最後に >$_POSTとか連結するのは、ダメだよ。 $_POSTを何かの変数に置いてそれを連結するのはダメなのでしょうか
退会済みユーザー

退会済みユーザー

2021/05/27 07:41

バリデーションして汚染されていないことを確認するのも、たいへんなので。原則ダメです。
episteme

2021/05/29 03:15

> WHERE句として見られていなかっただけでした! 「sql文も調べていて間違えているはずはありません」じゃなかった、と。
Gnr4A

2021/05/29 10:49

m6u そうなのでしたか!いろいろ教えて下さりありがとうございました! episteme すいません!言い方が悪く間違えてとらえてしまった方が多かったみたいですね。 sql文も調べていて間違えているはずはありません→ネット上で調べたので構文は間違えありません スペースミスは気づきませんでした。
guest

0

sql が間違ってますね。見直してください。

余談ですが、文字連結で sql を作っているような解説サイトの品質は最低です。
参考になるものは無いです。

投稿2021/05/27 07:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2021/05/27 07:14

スーパーグローバル変数直接参照もいかんっすね。10年は前かも(でもたまに今年っぽい記事が書いてて唖然とする)
guest

0

"UPDATE sample SET name='".$_POST['name']."',age=".$_POST['age']."WHERE id=".$_SESSION['id'].";

「$_POST['age']」と「"WHERE id="」を結合してますが、出来上がったSQL文は問題ないでしょうか?

投稿2021/05/27 07:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2021/05/27 07:05

プリペアドステートメント使えばこの手のミスは避けられるんですけど、よほど参考にした記事が古いか悪かったんでしょうね。 記事が間違ってる可能性は私はまだ捨ててませんけど。
Gnr4A

2021/05/27 07:06

回答ありがとうございます。 $sqlにfalseが入っているので確認しようがありません。 結合ってどういうことでしょうか。.(コンマ)が間にないとエラーがでます。
m.ts10806

2021/05/27 07:10

その変数に入ってるのは「実行結果」 https://www.php.net/manual/ja/mysqli.query.php みんなが言ってるのはSQL「文」でしょ。 echo "UPDATE sample SET name='".$_POST['name']."',age=".$_POST['age']."WHERE id=".$_SESSION['id'].";";
m.ts10806

2021/05/27 07:12

PHPにとっては単なる文字列ですよ。DBに届けてようやく動く。 htmlも同じ。PHPにとっては単なる文字列。ブラウザが読み取ってようやく動く。(似たこと各所で何回も色んな人が言及してます)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問