前提・実現したいこと
下記のモデルに検索ワード($_GET['search'])を送ると検索結果を表示する処理を作りたいのですが、
$articles->execute()の部分でtrueにならず次の処理へ進めません。
ここをtrueにしたいです。
※$_GET['search']が''の状態だと記事を取得することができます。
発生している問題・エラーメッセージ
$articles->execute()がfalseになってしまう。
該当のソースコード
PHP
1 { 2 if (isset($_GET['search']) && !empty($_GET['search'])) { 3 $word = preg_replace('/(\s| )+/', ',', $_GET['search']); 4 if (strpos($word, ',') === 0) { 5 $word = substr($word, 1, strlen($word) - 1); 6 } 7 $searchWord = explode(',', $word); 8 $keywordCondition = []; 9 for ($i = 0; $i < count($searchWord); $i++) { 10 $keywordCondition[] = "title LIKE :title{$i}"; 11 } 12 $title = implode(' AND ', $keywordCondition); 13 } else { 14 $title = ''; 15 } 16 17 if ($_GET['category'] !== '') { 18 $category = 'category = :category '; 19 } else { 20 $category = ''; 21 } 22 23 $top = filter_input(INPUT_GET, 'top'); 24 switch ($top) { 25 case 'all': 26 $top = ''; 27 break; 28 case '0': 29 $top = "top = 0"; 30 break; 31 case '1': 32 case '2': 33 $top = '(top = :top OR top = 3)'; 34 break; 35 case '3': 36 $top = "top = 3"; 37 break; 38 } 39 if ($title === '' && $top === '' && $category === '') { 40 $where = ''; 41 } else { 42 $where = 'WHERE '; 43 } 44 $and1 = ''; 45 $and2 = ''; 46 $and3 = ''; 47 if ($title !== '' && $category !== '' && $top !== '') { 48 $and1 = ' AND '; 49 $and2 = ' AND '; 50 } else if ($title !== '' && $category !== '' && $top === '') { 51 $and1 = ' AND '; 52 } else if ($title === '' && $category !== '' && $top !== '') { 53 $and2 = ' AND '; 54 } else if ($title !== '' && $category === '' && $top !== '') { 55 $and3 = ' AND '; 56 } 57 58 $sql = "SELECT * FROM articles {$where} {$title} {$and1} {$and3} {$category} {$and2} {$top} ORDER BY created DESC"; 59 $articles = $this->db->prepare($sql); 60 $i = 0; 61 if (isset($searchWord)) { 62 foreach ($searchWord as $search) { 63 $articles->bindValue(":title{$i}", '"%' . $search . '%"'); 64 $i++; 65 } 66 } 67 if ($_GET['category'] !== '') { 68 $articles->bindValue(':category', $_GET['category']); 69 } 70 if ($_GET['top'] !== '') { 71 $articles->bindValue(':top', $_GET['top']); 72 } 73 74 if ($articles) { 75 if ($articles->execute()) { 76 while ($row = $articles->fetch()) { 77 $rows[] = $row; 78 } 79 if (!isset($rows)) { 80 $errors = '0件でした'; 81 return $errors; 82 } 83 } 84 $this->db = null; 85 return $rows; 86 } 87 } 88
試したこと
下記のbindValue部分で値がバインドされているか確認すると、trueとなった。
追記、trueではなく1が返ってきてました。
php
1if (isset($searchWord)) { 2 foreach ($searchWord as $search) { 3 $articles->bindValue(":title{$i}", '"%' . $search . '%"'); 4 $i++; 5 } 6 }
補足情報(FW/ツールのバージョンなど)
heroku/7.42.13
PHP 7.1.33
macOS Mojave 10.14.6
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/15 20:02
2020/09/15 20:14
2020/09/15 22:57