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

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

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

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

1368閲覧

PHP PDOのwhereでIN句(複数)を使いたい

ITOMO5963

総合スコア98

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2022/09/27 03:51

編集2022/09/28 01:02

実現したいこと

PHPのPDOで複数のhostidのデータを WHERE IN を使いたいです。
hostidの数は可変です。
参考URLをもとに作成してみましたが、うまく動作しません。
executeの引数を3つ実行できないのでしょうか?
ご教示お願いいたします。

前提

[バージョン]
PHP:7.2.24
MariaDB:10.5.10

流したいSQL(例)

select * from tbl where hostid in (1005, 1006) AND col between '2022-07-05 00:00' AND '2022-09-27 13:00';

検証用コード

SQL

1create table tbl (hostid int not null primary key, name varchar(30), val varchar(30), col timestamp not null) 2 3insert into tbl values 4(1001,'takuya','grape','2022-07-01 08:30:00'), 5(1002,'taro','orange','2022-07-01 09:30:00'), 6(1003,'yuta','apple','2022-07-14 08:30:00'), 7(1004,'makoto','cat','2022-07-20 08:30:00'), 8(1005,'shun','dog','2022-08-01 08:30:00'), 9(1006,'tomo','tiger','2022-09-01 08:30:00');
<?php try { // 過去〇週間前の日付取得 $startDateTime = new DateTime('-12 weeks'); $start_date = $startDateTime->format('Y-m-d 00:00'); // 現在時刻取得 $endDateTime = new DateTime('now'); $end_date = $endDateTime->format('Y-m-d H:i'); $user_id = '1005,1006'; $user_ids = explode(',', $user_id); $dbh = new PDO('mysql:host=localhost;dbname=base_info', 'dbuser', 'Paaword1!'); // $sql = "select * from tbl where col BETWEEN $start_date AND $end_date"; $sql .= 'AND hostid IN (' . substr(str_repeat(',?', count($user_ids)), 1) . ')'; $stmt = $dbh->prepare($sql); $stmt->execute($user_ids, $start_date, $end_date); var_dump($stmt->fetchAll(PDO::FETCH_ASSOC)); } catch (Exception $e) { print "error!! " . $e->getMessage() . PHP_EOL; } $dbh = null; ?>

エラーメッセージ

PHP Warning: PDOStatement::execute() expects at most 1 parameter, 3 given in /var/www/html/waiis/model/test5.php on line 21 array(0) { }

参考URL

https://chaika.hatenablog.com/entry/2016/06/22/092149
https://qiita.com/mgmgmogumi/items/570cfaef75bd142a1d44

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

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

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

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

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

m.ts10806

2022/09/27 04:01

?と同じ数だけのパラメータは送られてないと思います。
guest

回答2

0

ベストアンサー

sprintfやprepare処理を誤解していませんか?

PHP

1$names=[1,2,3]; 2echo sprintf('aaa %s bbb',implode(",",array_fill(0,count($names),"?")));

調整版

PHP

1function Hostid_Check(string $start_date, string $end_date){ 2 $id = array(1001, 1002); 3 $data=[]; 4 $sql ="select hostid from tbl where 1 \n"; 5 if(count($id)>0){ 6 $sql.="and hostid in (".implode(",",array_fill(0,count($id),"?")).") \n"; 7 $data=array_merge($data,$id); 8 } 9 $sql.="and col between ? and ? \n"; 10 $data[]=$start_date; 11 $data[]=$end_date; 12 13 $stmt = $pdo->prepare($sql); 14 $stmt->execute($data); 15 $res = $stmt->fetchAll(); 16 var_dump($res); 17}

投稿2022/09/27 03:59

編集2022/09/28 01:05
yambejp

総合スコア116810

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

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

ITOMO5963

2022/09/27 23:29

回答ありがとうございます。 いただいた内容でどのように修正したらよいでしょうか? すみません。お力沿いお願いいたします。
yambejp

2022/09/28 00:26

一応追記しておきますがもとのソースがだいぶおかしいのでこれだけで動くとは思えません すこしずつ丁寧に機能を追加されたほうがよいでしょう
ITOMO5963

2022/09/28 01:08 編集

コメントありがとうございます。
guest

0

おかげさまで、完成しました。

<?php function Hostid_Check(string $start_date, string $end_date){ try { $id = array(1005, 1006); $dbh = new PDO('mysql:host=localhost;dbname=base_info', 'dbuser’, 'Password1!'); $data=[]; $sql ="select hostid from tbl where 1 \n"; if(count($id)>0){ $sql.="and hostid in (".implode(",",array_fill(0,count($id),"?")).") \n"; $data=array_merge($data,$id); } $sql.="and col between ? and ? \n"; $data[]=$start_date; $data[]=$end_date; $stmt = $dbh->prepare($sql); $stmt->execute($data); $res = $stmt->fetchAll(); var_dump($res); } catch (Exception $e) { print "error!! " . $e->getMessage() . PHP_EOL; } } function Func_Exec(){ // 過去〇週間前の日付取得 $startDateTime = new DateTime('-12 weeks'); $start_date = $startDateTime->format('Y-m-d 00:00'); // 現在時刻取得 $endDateTime = new DateTime('now'); $end_date = $endDateTime->format('Y-m-d H:i'); Hostid_Check($start_date, $end_date); } // 関数実行 Func_Exec(); ?>

投稿2022/09/28 01:55

ITOMO5963

総合スコア98

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問