1. やりたい・やりたかったこと
以下のSQL文で条件を絞っていき、配列に値がない場合は処理を終了して前画面に戻したいのですが、何故か以下の文を入れると配列を全て取り出せなくなります。
SQL文
PHP
1$sql="SELECT name,attribute,type,number FROM mst_product 2 WHERE 3 name LIKE '%$pro_name%' 4 AND 5 attribute LIKE '%$pro_attribute%' 6 AND 7 type LIKE '%$pro_type%' 8 AND 9 number LIKE '%$pro_number%'"; 10$stmt=$dbh->prepare($sql); 11$stmt->execute(); 12
検索で絞り込んだ配列に値がない場合は処理を終わらせるためのコード(これを書かなければ配列の値は全て上手くプリントされる
PHP
1$check=$stmt->fetch(PDO::FETCH_ASSOC); 2if(empty($check)){ 3 echo '検索したカードが存在しません。'; 4 echo '<a href="' . $_SERVER['HTTP_REFERER'] . '">戻る</a>'; //戻るボタンの実装記事 https://blanche-toile.com/web/history-back 5 exit(); 6} 7
2. 起きている問題やエラーメッセージ
エラーはないのですが先述通り、何故か値が全て取り出せません。
全体のソースコード
PHP
1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>トレカDB</title> 6</head> 7<body> 8 9<?php 10 11header("Content-type: text/html; charset=utf-8"); # このコードはコンテンツはhtmlで文字コードはutf-8であるという意味。通常はプログラムでわざわざ指定しなくても 12#Webサーバが勝手につけてくれますが、プログラムから指定しているのは、より明示的に文字化けや、文字コードの違いを利用したXSS攻撃等を防ぐ 13 14try 15{ 16 17print 'カード一覧<br /><br />'; 18 19$pro_name=$_POST['name']; //前画面でユーザーにWEBでTextを入力させた結果を変数に代入 20$pro_attribute=$_POST['attribute']; 21$pro_type=$_POST['type']; 22$pro_number=$_POST['number']; 23 24print$_POST['name']; 25echo '<br>'; 26print$_POST['attribute']; //テスト用 27echo '<br>'; 28print$_POST['type']; 29echo '<br>'; 30print$_POST['number']; 31echo '<br>'; 32 33if(isset($_POST['type'])==false) { 34 print'値は2つ入っています。'; 35 print '<br />'; 36} 37 38$pro_name=htmlspecialchars($pro_name,ENT_QUOTES,'UTF-8'); 39$pro_attribute=htmlspecialchars($pro_attribute,ENT_QUOTES,'UTF-8'); 40$pro_type=htmlspecialchars($pro_type,ENT_QUOTES,'UTF-8'); 41$pro_number=htmlspecialchars($pro_number,ENT_QUOTES,'UTF-8'); 42 43if($pro_name=='' && $pro_attribute=='' && $pro_type=='' && $pro_number=='' ) 44{ 45 print("検索項目が全て空白です。値を入力してください。"); 46 print '<form>'; 47 print '<input type="button" onclick="history.back()" value="戻る">'; 48 print '</form>'; 49 exit(); 50} 51 52$dsn='mysql:dbname=yugioh;host=localhost;charset=utf8'; 53$user='root'; 54$password=''; 55$dbh=new PDO($dsn,$user,$password); 56$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 57 58$sql="SELECT name,attribute,type,number FROM mst_product 59 WHERE 60 name LIKE '%$pro_name%' 61 AND 62 attribute LIKE '%$pro_attribute%' 63 AND 64 type LIKE '%$pro_type%' 65 AND 66 number LIKE '%$pro_number%'"; 67$stmt=$dbh->prepare($sql); 68$stmt->execute(); 69 70$dbh=null; 71 72$check=$stmt->fetch(PDO::FETCH_ASSOC); 73if(empty($check)){ 74 echo '検索したカードが存在しません。'; 75 echo '<a href="' . $_SERVER['HTTP_REFERER'] . '">戻る</a>'; 76 exit(); 77} 78 79/* print '<form method="post" action="pro_search_branch.php">'; *///追加、修正の機能のために新しく追加したコード(pro_search_branch)はまだ作ってない。 80while(true) 81{ 82 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 83 84 if($rec==false) 85 { 86 break; 87 } 88 /* print_r($rec); 89 echo '<br>'; */ 90 print '<input type="radio" name="procode" value="'.$rec['code']. '">'; 91 print $rec['name'].' 属性:'; 92 print $rec['attribute'].' 種族'; 93 print $rec['type'].' 枚数:'; 94 print $rec['number'].'枚'; 95 print '<br />'; 96 } 97 98} 99 100catch(PDOException $e) 101{ 102 echo "失敗:" . $e->getMessage() . "\n"; 103 exit(); 104} 105 106?> 107 108</body> 109</html>
3. 試したこと
empty関数の代わりにissetを使ったり色々な場所に配列の値確認のコードを入れてみましたがどこに入れても上手く動きませんでした。
PHP
1$sql="SELECT name,attribute,type,number FROM mst_product 2 WHERE 3 name LIKE '%$pro_name%' 4 AND 5 attribute LIKE '%$pro_attribute%' 6 AND 7 type LIKE '%$pro_type%' 8 AND 9 number LIKE '%$pro_number%'"; 10$stmt=$dbh->prepare($sql); 11$stmt->execute(); 12
上記のコードで検索結果が絞られていき、結果が空の場合は処理を終了して戻るボタンを表示したいので、もしそもそものアプローチが間違っていたら教えてくだい。
if (empty($_check['name']) && empty($_check['attribute']) && empty($_check['type']))
このようなコードも試しました。
質問
・上記を踏まえて私のアプローチ(fetchでSQLの配列を取り出してemptyで確認)はあっているのか
・コードに問題はあるか
・確認コードを入れると値が全て取り出せない理由(例えば検索結果が3つあるべきなのに2つしか表示されない)
以上のことを教えていただけると助かります。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー