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

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

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

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

PHP

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

Q&A

解決済

6回答

1895閲覧

php上のSQL文のシングルクオテーションのネストについて

yoshipu

総合スコア115

SQL

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

PHP

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

0グッド

0クリップ

投稿2016/11/08 05:02

SQL

1$stmt = $pdo->query('INSERT INTO product( 2 data_no, 3 data_size, 4 data_num 5 )VALUES( 6 $_POST['data_no'], 7 $_POST['data_size'], 8 $_POST['data_num'] 9 )' 10);

php上でSQL文をやりたいのですが、文法エラーになってしまいます。

'をエスケープするには'をしてエスケープしシングルクオテーションにすることは
知っているのですが、複雑なネストだとうまくできません。
(ダブルクオテーションだと簡単なのですが、書き方のルールでシングルで作る必要があります)

記載例とできれば、申し訳ないのですが、一行でいいのでわかりやすく解説していただきますと大変ありがたいです。

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

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

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

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

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

guest

回答6

0

「どう生成するか」という以前に、$_POST変数をそのままSQL文に組み立てるようなことはしてはいけません。SQLインジェクションの原因となります。

PDOなので、予めprepareしてからexecuteで値をはめ込みましょう。

$stmt = $pdo->prepare('INSERT INTO product( data_no, data_size, data_num )VALUES(?, ?, ?)'); $stmt->execute([$_POST['data_no'], $_POST['data_size'], $_POST['data_num']]);

投稿2016/11/08 05:14

maisumakun

総合スコア145184

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

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

0

クオートについての回答は既に出ているようなので、別の方法の提示を。

SQL文をそのまま使うとエスケープ等も面倒になりますし、プリペアードステートメントを使うと良いかと思います。

PHP

1$sth = $dbh->prepare('INSERT INTO product( 2 data_no, 3 data_size, 4 data_num 5 )VALUES( 6 ?, 7 ?, 8 ?)' 9 :data_no, 10 $_POST['data_size'], 11 $_POST['data_num'] 12 )'); 13 $sth->execute(array('data_no' => $_POST['data_no'], '));

投稿2016/11/08 05:20

kunai

総合スコア5405

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

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

yoshipu

2016/11/08 06:10

この書き方も試したのですが、うまくいきませんでした。 こんな風に使えばいいというすごく重要な見本になりました。 ありがとうございました。
guest

0

ベストアンサー

'INSERT INTO product( data_no, data_size, data_num )VALUES( '. $_POST['data_no'].','. $_POST['data_size'].','. $_POST['data_num'].' )'

ダブルクオーツやsprintfなどつかわなずあくまでシングルクオーツという事であれば、変数の展開もされないといけないので上記のように連結する方法ですね。

投稿2016/11/08 05:11

hiim

総合スコア1689

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

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

yoshipu

2016/11/08 06:28

みなさんたくさんのアドバイスありがとうございます。 ベストアンサーを選ぶにあたり、一番リクエストに近かった方をベストアンサーにさせていただきました。 わたくしの主観ですのでご了承ください。
guest

0

無理せず分けるのはどうでしょうか。一旦sprintfで落とすと。

php

1$sql = sprintf("INSERT INTO product( 2 data_no, 3 data_size, 4 data_num 5 )VALUES( 6 %s,%s,%s)", 7 $_POST['data_no'], 8 $_POST['data_size'], 9 $_POST['data_num'] 10 ); 11 12$stmt = $pdo->query($sql); 13

投稿2016/11/08 05:10

fromageblanc

総合スコア2724

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

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

0

シングルで囲むと変数は展開されません。
なので次のように分割して結合することになるのでは。

PHP

1$stmt = $pdo->query('INSERT INTO product( 2 data_no, 3 data_size, 4 data_num 5 )VALUES(' . 6 $_POST['data_no'] . "," 7 $_POST['data_size'] . "," 8 $_POST['data_num'] . 9 ')' 10);

投稿2016/11/08 05:08

ttyp03

総合スコア16998

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

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

0

SQLでは文字列中のシングルクォーティーションはシングルクォーティーションを2つ続けて書きます。

投稿2016/11/08 05:07

Orlofsky

総合スコア16415

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問