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}
回答3件
あなたの回答
tips
プレビュー