1. やりたい・やりたかったこと
背景
カードゲームのDBを作っています。
DBのカード検索でテーブル(ユーザがブラウザ上で入力する項目)が4つあります。
name, attribute, type, numberの4つです。
issetで値の有無を確認して変数にattribute LIKE '$pro_attributeなどの値を入れたいです。
例えば4つ全て入っているときはsqlの変数数に入るコードは以下のようになります。
$sql_part_head="SELECT code,name,attribute,type,number FROM mst_product"LIKE "WHERE name LIKE '%$pro_name%'"
"attribute LIKE '%$pro_attribute%'"
"type LIKE '%$pro_type%'"
"number LIKE '%$pro_number%'"
(そもそもこれはSQL文として正しいのでしょうか?どのようにして検索ボックスでユーザーに入力された項目を連結してDBからデータをとれば良いのでしょうか?根本的に私の考えとアプローチが間違っていたら教えてください。)
2. 起きている問題やエラーメッセージ
以下のエラーメッセージが出力されます。
失敗:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''WHERE name LIKE '%ドラゴン%''AND'number LIKE '%%''AND''AND''' at line 1
3. 関連するソースコード
対象のソースコードになります。
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 17$pro_name=$_POST['name']; 18$pro_attribute=$_POST['attribute']; 19$pro_type=$_POST['type']; 20$pro_number=$_POST['number']; 21 22$pro_name=htmlspecialchars($pro_name,ENT_QUOTES,'UTF-8'); 23$pro_attribute=htmlspecialchars($pro_attribute,ENT_QUOTES,'UTF-8'); 24$pro_type=htmlspecialchars($pro_type,ENT_QUOTES,'UTF-8'); 25$pro_number=htmlspecialchars($pro_number,ENT_QUOTES,'UTF-8'); 26 27if($pro_name=='' && $pro_attribute=='' && $pro_type=='' && preg_match('/\A[0-9]+\z/',$pro_number)==0 ) 28{ 29 print("検索項目が全て空白です。値を入力してください。"); 30 print '<form>'; 31 print '<input type="button" onclick="history.back()" value="戻る">'; 32 print '</form>'; 33 exit(); 34} 35else 36{ 37 print 'カード一覧<br /><br />'; 38} 39 40$sql_part_head="SELECT code,name,attribute,type,number FROM mst_product"; 41 42$first_query = true; 43 44if(isset($_POST['name'])==true) 45{ 46 $sql_part_A = "WHERE name LIKE '%$pro_name%'"; 47 $first_query=false; 48} 49if(isset($_POST['attribute'])==true) { 50 if($first_query=false){ 51 $sql_part_B = "WHERE attribute LIKE '%$pro_attribute%'"; 52 } 53 else{ 54 $sql_part_B="attribute LIKE '%$pro_attribute%'"; 55 } 56} 57if(isset($_POST['type'])==true) { 58 if($first_query=false){ 59 $sql_part_B = "WHERE type LIKE '%$pro_type%'"; 60 } 61 else{ 62 $sql_part_B="type LIKE '%$pro_type%'"; 63 } 64} 65 66if(isset($_POST['number'])==true) { 67 if($first_query=false){ 68 $sql_part_B = "WHERE number LIKE '%$pro_number%'"; 69 } 70 else{ 71 $sql_part_B="number LIKE '%$pro_number%'"; 72 } 73} 74 75$dsn='mysql:dbname=yugioh;host=localhost;charset=utf8'; 76$user='root'; 77$password=''; 78$dbh=new PDO($dsn,$user,$password); 79$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 80 81$sql="SELECT code,name,attribute,type,number FROM mst_product '$sql_part_A'AND'$sql_part_B'AND'$sql_part_C'AND'$sql_part_D'"; 82$stmt=$dbh->prepare($sql); 83$stmt->execute(); 84 85$dbh=null; 86 87print '<form method="post" action="pro_branch.php">'; 88while(true) 89{ 90 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 91 if($rec==false) 92 { 93 break; 94 } 95 print '<input type="radio" name="procode" value="'.$rec['code']. '">'; 96 print $rec['name'].' 種族:'; 97 print $rec['attribute'].' 属性'; 98 print $rec['type'].' 枚数:'; 99 print $rec['number'].'枚'; 100 print '<br />'; 101} 102 103/* if(isset($_POST['name'])==true || isset($_POST['attribute'])==true || isset($_POST['type'])==true || isset($_POST['number'])==true) #もし検索ボックスのどれかに値が入っていたら 104{ */ 105 106/* if(isset($_POST['name'])==true && $pro_attribute=='' && $pro_type=='' && $pro_number=='') */ 107/* if(isset($_POST['name'])==true ) 108{ 109 110$dsn='mysql:dbname=yugioh;host=localhost;charset=utf8'; 111$user='root'; 112$password=''; 113$dbh=new PDO($dsn,$user,$password); 114$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 115 116$sql="SELECT code,name,attribute,type,number FROM mst_product WHERE name LIKE '%$pro_name%'"; 117$stmt=$dbh->prepare($sql); 118$stmt->execute(); 119 120$dbh=null; 121 122 123print '<form method="post" action="pro_branch.php">'; 124while(true) 125{ 126 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 127 if($rec==false) 128 { 129 break; 130 } 131 print '<input type="radio" name="procode" value="'.$rec['code']. '">'; 132 print $rec['name'].' 種族:'; 133 print $rec['attribute'].' 属性'; 134 print $rec['type'].' 枚数:'; 135 print $rec['number'].'枚'; 136 print '<br />'; 137} 138 139} */ 140 141/* } */ 142 143/* if(isset($_POST['name'])==true && isset($_POST['attribute'])==true && $pro_type=='' && $pro_number=='') 144{ 145 $dsn='mysql:dbname=yugioh;host=localhost;charset=utf8'; 146$user='root'; 147$password=''; 148$dbh=new PDO($dsn,$user,$password); 149$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 150 151$sql="SELECT code,name,attribute,type,number FROM mst_product WHERE name LIKE '%$pro_name%','%pro_attribute'"; 152$stmt=$dbh->prepare($sql); 153$stmt->execute(); 154 155$dbh=null; 156 157 158print '<form method="post" action="pro_branch.php">'; 159while(true) 160{ 161 $rec=$stmt->fetch(PDO::FETCH_ASSOC); 162 if($rec==false) 163 { 164 break; 165 } 166 print '<input type="radio" name="procode" value="'.$rec['code']. '">'; 167 print $rec['name'].' 種族:'; 168 print $rec['attribute'].' 属性'; 169 print $rec['type'].' 枚数:'; 170 print $rec['number'].'枚'; 171 print '<br />'; 172} 173 174} */ 175 176 177} 178catch(PDOException $e) 179{ 180 echo "失敗:" . $e->getMessage() . "\n"; 181 exit(); 182} 183 184?> 185 186</body> 187</html>
回答1件
あなたの回答
tips
プレビュー