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

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

解決済

3回答

1632閲覧

fetch関数 DBから取ってきたレコードをfetchで取得出来ない

1h_m

総合スコア19

SQL

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

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/04/01 10:02

編集2020/04/01 12:09

PHPの勉強として自作アプリを作成しています。
生き物の写真を投稿できるアプリです。

今現在、生き物の名前を検索できる機能の実装を試みています。
検索ワードと一致した投稿をDBから取得して内容を表示したいです。

index.tpl.phpにて検索ワード入力・送信
search.phpで入力値を受け取り、表示

という流れになっています。

<解決したい問題>
fetch関数でレコードを取得できない。

以下が該当のコードです。()で番号が降ってある箇所はデバッグを行った箇所です。

index.tpl.php

php

1<!DOCTYPE html> 2<html> 3<?php include('header_inc.php') ?> 4<body> 5<label>種名検索</label> 6<p></p> 7<form action="search.php" method="post"> 8<input type="text" name="keyword"> 9<input type="submit" name="submit" value="検索する"> 10<form> 11

search.php

php

1$keyword = assignmentKeyword(); 2var_dump($keyword); //(1) 3 4$pdo = connectDB(); 5$pbooks = []; 6$pbooks = searchPbook($pdo, $keyword); 7var_dump($pbooks); //(2) 8

function.php

php

1function assignmentKeyword(){ 2 if(isset($_POST['submit'])){ 3 $keyword = $_POST['keyword']; 4 return $keyword; 5 } 6} 7 8function searchPbook($pdo, $keyword){ 9 $sql = "SELECT picture.id, sp_name, team, 10 picture, description, user_id 11 FROM picture WHERE sp_name LIKE '%:keyword%'"; 12 var_export($sql); //(3) 13 $stmt = $pdo->prepare($sql); 14 $stmt->bindValue(':keyword', $keyword, PDO::PARAM_STR); 15 $stmt->execute(); 16 var_export($stmt->execute()); //(4) 17 return $stmt->fetch(PDO::FETCH_ASSOC); 18} 19 20function connectDB() { 21 return new PDO(DSN, DBUSER, DBPASS, [ 22 PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION, 23 PDO::ATTR_EMULATE_PREPARES=>false, 24 PDO::MYSQL_ATTR_INIT_COMMAND=>"SET time_zone='Asia/ToKyo'", 25 ]); 26} 27

デバッグの状況ですが、例えばindex.phpにて入力欄に「あ」と入力した時

(1) string(3) "あ" (2) bool(false) (3) 'SELECT picture.id, sp_name, team, picture, description, user_id FROM picture WHERE sp_name LIKE \'%:keyword%\'' (4) true

となっています。
また、phpmyadminで直接SQL文SELECT picture.id, sp_name, team, picture, description, user_id FROM picture WHERE sp_name LIKE '%あ%'を実行すると11件のレコードが表示されます(期待通りのレコードが取得できてます)。

なので、$stmt->execute();までは成功しているので、fetchの取得方法の問題かと思っていますが、今回の場合の取得方法としてどのような方法が適切でしょうか。
また、他の箇所に問題があるでしょうか。
宜しくお願いいたします。

ご回答ありがとうございます。
皆様のご指摘を受けて、以下のように修正したのですが、まだ状況が変わりません。
文字列結合の記述でおかしな箇所があるのでしょうか。
エラーは出ておりません。

php

1function searchPbook($pdo, $keyword){ 2 $sql = "SELECT picture.id, sp_name, team, picture, description, user_id 3 FROM picture WHERE sp_name LIKE ':keyword'"; 4 5 6 $stmt = $pdo->prepare($sql); 7 8 $stmt->bindValue(':keyword', '%'.$keyword.'%', PDO::PARAM_STR); 9 $stmt->execute(); 10 11 //var_export($stmt->execute()); 12 return $stmt->fetchAll(PDO::FETCH_ASSOC); 13}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/04/01 10:09

提示したコードの範囲で回答すればいいの?
guest

回答3

0

LIKE '%:keyword%'

はプレースホルダーとして認識しません。

文字列結合を行いましょう。

LIKE ':keyword'

もプレースホルダーとして認識しません。

プレースホルダーの記載方法をドキュメントに書いてありますか読んでいますか?

投稿2020/04/01 10:10

編集2020/04/01 14:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

1h_m

2020/04/02 14:49

読んで試してみたのですが失敗したので、上記の方法を試してまた失敗して手詰まりになっていました。時間を置いて見直したところコードの間違いに気が付き訂正しました。記事の方法で期待通りにレコード取得できました。ありがとうございました。
guest

0

sql

1FROM picture WHERE sp_name LIKE '%:keyword%'";

ここの所が間違っていますね。
bindValueするとbindする値をescapeするので結果としては

sql

1LIKE '%'''入力値'''%'

のような事になっているかと思います。
(と書きましたが、たぶんasahina1979さんの書かれているように、ただの文字列として認識されてしまってプレースホルダになっていない方が正解だと思います。)

素直に

sql

1LIKE :keyword;

として、bindValueの所で%入れてみるとどうですか?

投稿2020/04/01 10:09

編集2020/04/02 01:13
yoorwm

総合スコア1305

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

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

1h_m

2020/04/02 14:52

ご回答有り難うございました。全く見当違いの考えをしていました。おかげで解決に至ることができました。
guest

0

ベストアンサー

これ、エラー出ません?
LIKE に値をバインドする方法がおかしいです。

LIKE も気をつけよう - PHP で MySQL 接続時に必要な知識(最小限版)

投稿2020/04/01 10:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/04/01 10:12

文字列として認識するはずだからエラーにはならないかと
退会済みユーザー

退会済みユーザー

2020/04/01 10:13

あ、バインド個数がちがうほうか→エラー
退会済みユーザー

退会済みユーザー

2020/04/01 10:13

SQL のシンタックスに引っかからんかね? メンドイから試さんけど。
退会済みユーザー

退会済みユーザー

2020/04/01 10:34

そのままの文字列としてアクセスされる。 varexportのエスケープは関数仕様かと
1h_m

2020/04/02 14:50

ご回答有り難うございました。記事の方法で期待通りのレコードを取得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問