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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

1326閲覧

シングルクォートを含む文字列書式をしっかり理解したいです。

kosaku

総合スコア6

MySQL

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

phpMyAdmin

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

PHP

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

0グッド

0クリップ

投稿2020/02/01 13:37

前提・実現したいこと

phpによるデータベース(phpMyAdmin)操作の勉強をしています。
SQL文にて、下記のような場合のそれぞれのシングルクォートの役割がどうしても理解できなくて困っています。

該当のソースコード

<?php $data = []; $sql = 'INSERT INTO order_table (customer_id, order_date, payment) VALUES(\'' . implode('\',\'', $data) . '\')'; ?>

試したこと

<?php $my_name = '山田太郎'; print '私の名前は' . $my_name . 'です。'; ?>

この場合、
文字列の始まりの「'」+私の名前は+文字列の終わりの「'」
結合演算子「.」+$my_name+結合演算子「.」
文字列の始まりの「'」+です。+文字列の終わりの「'」
このような解釈と、
「' '」(シングルクォートで囲まれた)中の「' '」(シングルクォート)は「\」を付ける
というのは理解できたのですが、該当のソースコードのように複雑になってくると1つ1つの「'」の役割がわからなくなってしまいます。
どなたか詳しく教えていただけると助かります。
よろしくお願いします。

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

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

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

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

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

otn

2020/02/01 13:50

PHPの話なのか、SQLの話なのか、両方は全く別の話です。
m.ts10806

2020/02/01 19:52

コードはマークダウンのcode機能を利用してご提示ください。
kosaku

2020/02/02 10:16

わかりずらくてすみませんでした。 以後気をつけます。
m.ts10806

2020/02/02 10:20

質問は編集できるので適宜ご対応ください
guest

回答3

0

該当のソースコードのように複雑になってくると1つ1つの「'」の役割がわからなくなってしまいます。

書いたようにしか動きませんので、コード上で目検で分からないのであれば、作っている$sqlという変数に格納されるのはあくまで「文字列」なので、都度、var_dump()などで出力して確認して調整すれば良いですしデバッガ使っても良いですし、
コード見て結果が想像できないのであれば、もっと分かりやすく作るようにしてみては。

目指す結果が出ればやり方は1つではありません。

php

1$data = [1,2,3]; 2 3$input_values = []; 4foreach($data as $val){ 5 $input_values[] = "'{$val}'"; 6} 7 8$sql = 'INSERT INTO order_table (customer_id, order_date, payment) VALUES('.implode(',',$input_values).')'; 9echo $sql; 10

PHP構文的なところであればIDEを使えば実行しなくてもチェックしてくれるので、「覚える」というより「慣れる」と言った方が正しいと思います。
(完全に「覚える」でいってしまうとPHPのみの言語仕様もあるので別の言語にいったときに苦しみます。現に私も初めは苦しみました)


ただ、今回のSQLの関してはSQLインジェクション対策が全くされてない文字列ということになるので、
今回のように「自分でSQLのクォートを付ける」ということは基本やりません。

PDO::prepare → PDOStatement::bindValue → PDOStatement::execute の3ステップでクエリを実行する

データが配列で、順番も指定したカラムの順になっているなら
PDO::prepare → PDOStatement::execute の2ステップでクエリを実行する

どちらかで対応します。

php

1$pdo = new PDO($dsn,$user,$pass,[ 2 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 3 PDO::ATTR_EMULATE_PREPARES => false, 4]); 5$stmt = $pdo->prepare( 6 'INSERT INTO order_table (customer_id, order_date, payment) VALUES(?,?,?) 7'); 8$stmt->execute($data); 9

投稿2020/02/01 20:16

m.ts10806

総合スコア80850

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

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

kosaku

2020/02/02 10:28

ー「覚える」というより「慣れる」と言った方が正しいと思います。 なるほど、と思いました。 教えていただいたことを1つ1つ試してみます。 ありがとうございました。
kosaku

2020/02/02 10:55

とても励みになります。 知りたいことほとんどがマニュアルにあり、そしてその理解に苦しんだところを皆さんに尋ねるのが正解なのですね。 ご丁寧にありがとうございました。
m.ts10806

2020/02/02 11:11

PHPマニュアルにそのまま載っているかどうかは別として 構文的なところをPHPマニュアルで確認するのは熟練者でなくても必須の手段です。 teratailの各所でも回答につけていますが ・エラーメッセージを読む ・PHPマニュアルを確認する ・デバッグする この3つさえできれば大抵の問題は解決します。
guest

0

MySQL/MariaDB の SQL 構文に関してはそれぞれのドキュメントを参照するのが適切です。

本件の原因の殆どが、プリペアドステートメントを使用していないことに起因しているので、書き換えてみると良いです。バインド機構により、パラメータを自動的にクォーテーションで囲み、エスケープを実行してくれます。
(プリペアドステートメントを使用すると、シングルクォーテーションの出番はほとんどありません)

PDO 接続の際のテンプレートを用意しているので参考まで。
PHP で MySQL 接続時に必要な知識(最小限版)

投稿2020/02/01 21:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kosaku

2020/02/02 10:19

そんな方法もあったんですね。 書き換えてみて理解を深めたいと思います。 ありがとうございました。
guest

0

ベストアンサー

前から順番に見ていきます。それだけです。

'INSERT INTO order_table (customer_id, order_date, payment) VALUES(''

1.最初の引用符は、文字列リテラルの開始です。
2.次の引用符は、直前にバックスラッシュがあるので、特別の意味を失い、単なる文字です
3.次の引用符は、文字列リテラルの終了です。

. implode('','',

4.次の引用符は、文字列リテラルの開始です。
5.次の引用符は、直前にバックスラッシュがあるので、特別の意味を失い、単なる文字です
6.次の引用符は、直前にバックスラッシュがあるので、特別の意味を失い、単なる文字です
7.次の引用符は、文字列リテラルの終了です。

$data) . '')';

8.次の引用符は、文字列リテラルの開始です。
9.次の引用符は、直前にバックスラッシュがあるので、特別の意味を失い、単なる文字です
10.次の引用符は、文字列リテラルの終了です。

投稿2020/02/01 13:51

編集2020/02/01 22:31
otn

総合スコア84499

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

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

kosaku

2020/02/02 10:33

初心者の私にはこのようなお答えを期待していたのもありましたので、とても助かりました。 ありがとうございました。
otn

2020/02/02 10:38

PHPの話として回答しましたが、SQL的には他の方の回答の通り、値を文字列連結してSQLを組み立てるのは間違ったやり方ですので、注意ください。
kosaku

2020/02/02 11:02

今回の質問でたくさんの基本的なことを学ぶことができました。 引き続き勉強に励みたいと思います。 ご回答いただきまして本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問