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

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

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

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

Q&A

3回答

4095閲覧

●mysqlがphpmyadminでは動くのに、phpでは動かない。

takeji

総合スコア21

MySQL

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

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

PHP

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

0グッド

0クリップ

投稿2016/03/08 20:44

var_dumpした文字列をphpmyadminのsqlで実行するとDBに入るのですが、
localのphp上で動かすとDBに入らなくて困ってます。
ご教授頂けますか。
以下のように書いています。

$password = hash( 'SHA256', $password); //登録 $sql = "INSERT INTO `posts` (`id`, `message`, “password“, “created_at“) " ."VALUES (".id.",'".$message."','".$password."','".$created_at."')"; var_dump($sql); $result = mysqli_query($sql); mysql_close($link);

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

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

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

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

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

unau

2016/03/08 21:27

エラーメッセージも添えて質問するとよいと思います。あと、PHP 部分はコードブロックを使って書いたほうがいいと思います。
takeji

2016/03/09 12:35

コードブロック使ってます。<?php です。 エラーは出てないです。
mpyw

2016/03/09 13:00 編集

コードブロックは ```php から始まって ``` で終わる書き方です.これを使えば回答者が使っているように美しい表記になりますよ.
takeji

2016/03/09 18:05 編集

>コードブロック ```php は初めて聞きました。上記で検索しましたが見つかりません。出典を下さいますか。
unau

2016/03/09 18:16

teratail で質問や回答において、「ここからここまでは PHP のコードです」ということを指定する方法、ということです。PHP の構文を解釈してシンタックスハイライトしてくれるのでコードが見やすくなります。また、そのコードブロック内は PHP のコードとして解釈され、コードブロック外の通常の markdown 記法の解釈がなされません。たとえば、「`x`」と書いた場合、コードブロック外ならコード中の文字列「x」として表示されますが、コードブロック内ならそのままコードの一部として「`x`」が表示されます。 teratail に限らず技術系のサイトでは一般的な markdown 記法です。
unau

2016/03/09 18:19

https://teratail.com/help こちらの「Markdownの機能を知りたい」の「コードを入力」の部分に相当します。
mpyw

2016/03/09 18:54

unauさん,補足ありがとうございます.ちょっと不親切な回答でした,すみません
guest

回答3

0

$result が、false なら、エラーになっていますのでエラーをチェックしてみましょう。

コード例としては、こんな感じかな。

php

1<?php 2$link = mysqli_connect("localhost", "my_user", "my_password", "database"); 3 4// 5if (mysqli_connect_errno()) { 6 echo mysqli_connect_error(); 7 exit(); 8} 9 10// SQL 実行 11$result = mysqli_query($link, "SELECT * FROM Table-name LIMIT 10"); 12 13// 値が帰ってきたら件数表示。false ならエラー表示 14if($result){ 15 echo mysqli_num_rows($result); 16} else { 17 echo mysqli_error($link); 18} 19 20mysqli_close($link);

投稿2016/03/08 22:54

編集2016/03/09 00:29
CHERRY

総合スコア25171

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

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

takeji

2016/03/09 12:33

$resultはNULLでした。
CHERRY

2016/03/09 13:08 編集

$result が、null ということは、mysqli_query を実行時にエラーになっていますね。 mysqli_query の次の行に if(!$result){ echo mysqli_error($link); } を追加して、どのようなメッセージが表示されるでしょうか?
mpyw

2016/03/09 13:13

mysqliを使うにしても,いちいちif文で成功したかどうかをチェックするのは面倒なので, mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); を最初に実行しておき, mysqli_sql_exception がスローされるようにすべきだと思います.
takeji

2016/03/09 17:18

>mysqli_query の次の行に >if(!$result){ echo mysqli_error($link); } 何も出ないです。
takeji

2016/03/09 18:22

>mysqli_sql_exception がスローされるようにすべきだと思います CertaiN様、 ちょっとレベルが高くて分かりませんでした。「mysqli_sql_exception 書き方 スロー」で書き方の例を検索しましたが、スローの仕方が見つからず、分かりませんでした。 すいません。
mpyw

2016/03/09 18:42

> スローの仕方が見つからず、分かりませんでした。 既に書いたとおり, mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); を最初に実行しておくと,$mysqli->query() あるいは mysqli_query() が失敗したときに,mysqli_sql_exception がPHPによって自動的にスローされる,ということです.自分でスローするわけではありません. また,基本的にこういう情報は英語で検索した方が見つかりやすいです.今回の情報は「mysqli throw exception」でググるとStackOverflowなりPHP公式ドキュメントのユーザーノートなり,引っかかると思います.
guest

0

まずSQL文にユーザ入力をパラメータとして取り込む際, "'" . $var . "'" あるいは "'{$var}'" のように書いてはいけません.SQLインジェクション攻撃に対して脆弱になります.プリペアドステートメントおよびプレースホルダを使いましょう.

また,クエリ発行のタイミングでエラーがあった場合例外をスローするように設定しておくべきです.falsenullになるだけでは不親切すぎますよね.

さらに,パスワードハッシュには標準の password_hash 関数を使うようにしましょう.暗号化ベクトルなしのSHA256だけではまだ安全性の面で不十分です.

POSTでパラメータを受け取り,結果をJSONとして返すAPI風に実装してみます.mysqliは使いにくいので**PDO**で書きます.よほどのことがない限り,初心者がmysqliを触る理由はありません.

php

1<?php 2 3// デフォルトでは「text/html」なので「application/json」であるとして明示する 4// 文字コードにはUTF-8を指定する 5header('Content-Type: application/json; charset=UTF-8'); 6 7try { 8 9 // $_POST['id'], $_POST['message'], $_POST['password'] を文字列として確実に受け取る 10 // 「$$var」は可変変数で,順番に $id, $message, $password となる 11 foreach (['id', 'message', 'password'] as $var) { 12 $$var = (string)filter_input(INPUT_POST, $var); 13 if ($$var === '') { 14 // どれか1つでも空だったら「400 Bad Request」として処理を中断する 15 throw new RuntimeException("Missing parameter: $var", 400); 16 } 17 } 18 19 // PHP5.5以降使える最も安全なパスワードハッシュ生成関数を使用する 20 $password = password_hash($password, PASSWORD_DEFAULT); 21 22 // 東京の現在時刻の文字列を生成 23 $created_at = (new DateTime('now Asia/Tokyo'))->foramt('Y-m-d H:i:s'); 24 25 // mydbデータベースに接続 (失敗するとPDOExceptionがスローされて処理が中断される) 26 $pdo = new PDO( 27 'mysql:host=localhost;dbname=mydb;charset=utf8', 28 'dbuser', 29 'dbpassword' 30 ); 31 32 // SQL実行時のエラーでもPDOExceptionがスローされて処理が中断されるようにする 33 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 34 35 // INSERT文のプリペアドステートメントを生成し, 36 // 「?」のプレースホルダ部分に順番に変数を当てはめて実行する 37 $stmt = $pdo->prepare(" 38 INSERT INTO posts(id, message, password, created_at) 39 VALUES (?, ?, ?, ?) 40 "); 41 $stmt->execute([$id, $message, $password, $created_at]); 42 43 // 結果をJSONで表示 44 $message = 'success'; 45 echo json_encode(compact('message'), JSON_UNESCAPED_UNICODE); 46 47} catch (PDOException $e) { 48 49 // PDOがエラーを検知したときはここに飛んで来る 50 http_response_code(500); // 「500 Internal Server Error」 51 $error = $e->getMessage(); 52 echo json_encode(compact('error'), JSON_UNESCAPED_UNICODE); 53 54} catch (RuntimeException $e) { 55 56 // 手動で中断したときはここに飛んで来る 57 http_response_code($e->getCode()); 58 $error = $e->getMessage(); 59 echo json_encode(compact('error'), JSON_UNESCAPED_UNICODE); 60 61}

投稿2016/03/09 13:04

編集2016/03/09 13:12
mpyw

総合スコア5223

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

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

0

実際のソースコードで変数のidに$を付け忘れてるとかではありませんよね、念の為。

PHP

1// 2 . "VALUES (" . $id . ",'" . $message . "','" . $password . "','" . $created_at . "')"; 3// ^^^

投稿2016/03/09 03:41

chinyato

総合スコア241

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

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

takeji

2016/03/09 12:01

$ついてます。投稿への対応で変数名変えた時に付け忘れました。汗
mpyw

2016/03/09 12:47

実験用であれば問題ないかもしれませんが,SQLインジェクションとその対策に関して全く言及していない回答は今後のことを考えると不親切だと思います.
takeji

2016/03/09 18:04

実験用です。ちなみに初心者です。
mpyw

2016/03/09 18:47 編集

個人的には,「初心者だからセキュリティ対策はあとでいい」というのは良くない教え方だと思ってます.「セキュリティ対策用の書き方が難しいのでとりあえずおまじないとして理解したことにする」ならまだマシですが.もしこれを怠るのであれば,あなたは 「さて一通り作ってみたし公開してみようかな」 と考えることを自粛しなければなりません.いちいち 「公開するから安全なコードに直さないと…」 ってなるの,どう考えても二度手間だと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問