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

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

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

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

Q&A

解決済

1回答

979閲覧

DB::select($sql, [ $para ])でエラーをなくしたい

isiz0507

総合スコア3

SQL

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

0グッド

0クリップ

投稿2021/10/01 13:16

下記sqlで変数によりand ab = ?を入れたり入れなかったりするsqlを作成しているのですが、
$i=1の場合、
select * from project where hide = 1,2 and ab = ?
とエラーとなるのですが、
DB::select($sql, [ $para0, $para1 ])以外で、
変数$para0と変数$para1を使って
select * from project where hide = 1 and ab = 2
するには、どうすればいいのでしょうか?

$para0=1;
$para1=2;

$sql = 'select * from project where hide = ?';
$para=$para0;

if ($i==1) {
$sql = $sql .' and ab = ?';
$para=$para.','.$para1;
}

DB::select($sql, [ $para ]);

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

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

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

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

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

guest

回答1

0

ベストアンサー

パラメータは配列内の値に1つにつき1つ当てられるので複数あるならその分の配列にしなければなりません。
「そう見える文字列」ではなく、きちんと配列を作ります。

今のコードを元にするならこうでしょうか。

php

1$param = []; 2 3$sql = 'select * from project where hide = ?'; 4$param[]=$para0; 5 6if ($i==1) { 7 $sql .= ' and ab = ?'; 8 $param[]=$para1; 9} 10DB::select($sql, $param);

※ただDB::select()がPDOと同じような仕様であればの話。実装が提示されてないので試しようがなく、これで出来るかは知りません。

投稿2021/10/01 21:49

m.ts10806

総合スコア80875

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

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

isiz0507

2021/10/01 23:45

回答ありがとうございました。 $param[]=$para0; $param[]=$para1 ではエラーとなりました。
m.ts10806

2021/10/01 23:47 編集

私のコードにはある終端がないようですが。 それにコード一部だけじゃどう書いてどういうエラーが出たのか全く分かりません。
isiz0507

2021/10/02 04:30

phpフレームワークLaravelで作成していますが $param = []; $sql = 'select * from project where hide = ?'; $param[]=$para0; if ($i==1) { $sql .= ' and ab = ?'; $param[]=$para1; } DB::select($sql, $param); ですとエラーがでませんが, $param = []; $sql = 'select * from project where hide = ?'; $param[]=$para0; if ($i==1) { $sql .= ' and ab = ?'; $param[]=$para1; } DB::select($sql, [$param]); ですと ErrorException Array to string conversion というエラーが出ます。 SQLインジェクション脆弱性対策より DB::SQL値(SQL文、[パラメータ配列]) と記述されているものが多いのですが、 DB::SQL値(SQL文、パラメータ配列)でも DB::SQL値(SQL文、[パラメータ配列])でも SQLインジェクションを防ぐ対策として問題ないのでしょうか?
m.ts10806

2021/10/02 04:35

配列に配列重ねると階層が深くなるので値が取り出せません。 パラメータからバインドにしてる時点でエスケープが適切にされるのでSQLインジェクションは対策できています。 試しに直接値を入れたときとバインドしたときでSQLインジェクションが発生する値を入れて確かめてみて下さい
isiz0507

2021/10/02 04:39

ありがとうございます。
m.ts10806

2021/10/02 06:01

おそらくLaravelよりもPHPの基本的なところの問題と思います。
m.ts10806

2021/10/02 06:02

というか、「SQL」というタグだけでLaravelに精通した人に見てもらうのは無理があります。PHPとLaravelのタグは必須ですよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問