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

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

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

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

PHP

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

Q&A

解決済

4回答

2823閲覧

PDOのIN句とbindvalueを一緒に使いたいがエラーになる。

ringoame49

総合スコア46

MySQL

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

PHP

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

0グッド

0クリップ

投稿2021/11/15 09:10

編集2021/11/15 10:06

質問失礼します。

現在PDOでIN句を使いたく色々なページを見てIN句の使い方がなんとか分かりまいた。
しかし、bindvalueを組み合わせるとエラーが発生します。

コードは下記になります。

$year = '2021'; $flug = [NULL,1,2,3,4]; $inClause = substr(str_repeat(',?', count($flug)), 1); $statement = $dbh->prepare("SELECT id FROM sample_tbl WHERE year = :year AND flug IN ({$inClause})"); $statement -> bindValue(':year', $year, PDO::PARAM_STR); $statement -> execute($flug);

例えばですがbindValueは使用せずyear = '2021'とした場合にはエラーはでません。
表示されるエラーは下記になります。
Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters in C:\xampp\htdocs\test\test.php:73 Stack trace: #0 C:\xampp\htdocs\test\test.php(73): PDOStatement->execute(Array) #1 {main} thrown in C:\xampp\htdocs\test\test.php on line 73

解決方法や参考になるページ等ご教授いただけますと幸いです。

よろしくお願いいたします。

【追記】
皆様から得た回答で下記にて実行できましたがおかしい部分はありますでしょうか?

$year = 2021; $flug = [1,2,3,4]; $inClause = substr(str_repeat(',?', count($flug)), 1); $statement = $dbh->prepare("SELECT id FROM sample_tbl WHERE year = ? AND flug IN ({$inClause})"); $in_array = array($year); for($i = 0; $i < count($flug); $i++){ array_push($in_array,$flug[$i]); } $statement -> execute($in_array);

INでNULLは拾えないとのご指摘をいただいたため一旦NULLは省いています。

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

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

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

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

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

guest

回答4

0

解決方法も参考資料も以下になるかと。

【PHP】PDOのプリペアドステートメントで疑問符パラメータと名前付きパラメータを混在させるとどうなるか

「混ぜるな危険」です。

追記
エラーメッセージ的に、どっかのバージョンで修正入ってそうですね。。。
7.2 あたりにありそう。
時間が出来たら調査してみたい(だれか調査結果をコメントしてくれても嬉しいなぁw)

投稿2021/11/15 09:14

編集2021/11/15 09:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ringoame49

2021/11/15 09:17

ご回答ありがとうございます! in句を:***のプレースホルダにする方法を探してみます!
退会済みユーザー

退会済みユーザー

2021/11/15 09:21

名前付きパラメータにするのはちょっとしんどいと思いますよ。 疑問符パラメータで統一するのが一般的です。
guest

0

ベストアンサー

「名前と疑問符パラメータを同一の ステートメントのテンプレート中で使用することはできません」

全部疑問符パラメータにすればよいでしょう

それとnullはinで拾えないし、疑問符パラメータのprepareで渡せないでしょう

PHP

1$year = '2021'; 2$flug = [NULL,1,2,3,4]; 3$data=[]; 4 5$sql="SELECT id FROM sample_tbl WHERE 1 "; 6if($year){ 7 $sql.="AND year = ? "; 8 $data[]=$year; 9} 10if(count($flug)){ 11 $sql.="AND (0 "; 12 if(in_array(null,$flug,true)){ 13 $sql.="OR flug is null "; 14 } 15 $flug=array_diff($flug, [null]); 16 if(count($flug)){ 17 $sql.="OR flug IN(".implode(",",array_fill(0,count($flug),"?")).")"; 18 $data=array_merge($data,$flug); 19 } 20 $sql.=") "; 21} 22print $sql.";<br>\n"; 23print_r($data);

投稿2021/11/15 09:15

編集2021/11/15 09:58
yambejp

総合スコア114779

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

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

ringoame49

2021/11/15 09:17

ご回答ありがとうございます! in句を:***のプレースホルダにする方法を探してみます!
yambejp

2021/11/15 10:00

NULLが混ざる状況が解せないですが、サンプル上げておきました
ringoame49

2021/11/15 10:15

ご丁寧にサンプルまでありがとうございます! いただいたサンプルをしっかり理解できるようにします!
ringoame49

2021/11/16 09:16

皆様この度はありがとうございました。 いただいたサンプルを基に疑問符パラメータでできました! 重ね得てお礼申し上げます。
guest

0

エラー内容はこうです。

Invalid parameter number: mixed named and positional parameters

二種類のプレースホルダは使用できませんので、?にするか:hogeにするかどっちかにしましょう。
$inClauseに使っているのが?で、yearに使っているのが:hogeです。

投稿2021/11/15 09:14

FKM

総合スコア3633

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

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

ringoame49

2021/11/15 09:17

ご回答ありがとうございます! in句を:***のプレースホルダにする方法を探してみます!
guest

0

mixed named and positional parametersとエラーメッセージに明記されているとおりです。

?:***のプレースホルダを併用することはできません。

投稿2021/11/15 09:12

maisumakun

総合スコア145183

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

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

ringoame49

2021/11/15 09:17

ご回答ありがとうございます! in句を:***のプレースホルダにする方法を探してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問