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

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

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

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

Q&A

解決済

2回答

4537閲覧

wordpressにおけるin句について

claya

総合スコア11

MySQL

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

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

0グッド

0クリップ

投稿2018/02/03 07:36

編集2018/02/03 07:59

前提・実現したいこと

初心者ですが、よろしくお願いいたします。
現在、wordpressにてmysqlに接続する検索機能を作成しております。
以下のようなデータベースにて検索を行い、関連するコンテンツを表示させたいと思いますが、うまくいきません。

該当のソースコード

データベース①

idnamecategory
1name11,2
2name22,3
3name31,3

データベース②

idcategorycontents
11aaa
22bbb
33ccc

php

1global $wpdb; 2$select = isset($_POST['name']) ? $_POST['name'] : ""; 3 4if ($select) { 5 $sql =$wpdb->prepare( 6 "SELECT * FROM データベース① WHERE name = %s",($select) 7 ); 8 $id_rows = $wpdb->get_results($sql); 9} 10 11if($id_rows){ 12 foreach ((array)$id_rows as $id_row){ 13 $category = $wpdb->prepare( 14 "SELECT * FROM データベース② WHERE category in %d ",($id_row->category) 15 ); 16 $contents = $wpdb->get_results($category); 17 } 18} 19if($contents):?>//検索結果をテーブルに表示 20 <tr> 21 <td><?=($contents->contents)?> 22 </td> 23 </tr> 24<?php endif; ?>

上記にて、仮にname1を検索した場合、テーブル上に「aaa」と「bbb」が表示されるようにしたいと考えております。

発生している問題・エラーメッセージ

php

1You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1' at line 1] 2SELECT * FROM データベース② WHERE category in 1

試したこと

「%d」の箇所をin句の配列の数だけ「?」とする必要があるようですが、wpdbにおける書き方が調べてもわかりませんでした(上記データベースでは2つとしていますが、値の数が場合によって増減する予定)。また、そもそもデータベース内にカンマ区切りで入力したデータをin句で取得できるか否かも理解できていません。

勉強不足につき、一部コードが意味不明となっているかもしれませんが、ご指摘頂ければ幸いです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

INは

sql

1WHERE category IN (1, 2, 3, 4)

みたいに使うことで

sql

1WHERE category = 1 OR category = 2 OR category = 3 OR category = 4

と同じになります。
なのでおっしゃるとおりINのカッコ内の値の数だけ%dは必要です。

追記

https://developer.wordpress.org/reference/classes/wpdb/prepare/

を見る限りは、

php

1// $inは予め%dを必要な数だけカンマ区切りで並べておく 2$query = "SELECT * FROM データベース② WHERE category in ({$in})"; 3// $categoriesはcategoryの数値が入った配列 4$wpdb->prepare($query, $categories);

でいけるのではないでしょうか。

投稿2018/02/03 07:44

編集2018/02/03 08:00
dala00

総合スコア441

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

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

claya

2018/02/03 07:50

ご回答いただきありがとうございます。 もしよろしければ、inのカッコ内の値を変数とし、変数内の値の数が変動する場合(1~4つ程度と想定中)の記載方法を教えていただいてもよろしいでしょうか。
dala00

2018/02/03 08:00

追記しました。
claya

2018/02/03 08:34

たびたびのご質問となり申し訳ありません。 ご指摘に基づきコードを書き直したところエラーは消えましたが、「%d」を値の数だけカンマ区切りで並べるところで躓きました。以下コードだと%dがひとつしか生成されないため、ご指摘頂ければ幸いです。 $in = substr(str_repeat(',%d', count($categories)), 1);
guest

0

無事解決いたしました。
最初のselect文にて取得したコンマ区切りのデータを、explodeにより分割したところ、二つ以上の値と認識され、無事にin句が動作しました。
ご回答いただき、ありがとうございました。

投稿2018/02/04 03:01

claya

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問