毎回お世話になっています。
今回も知恵を頂けたらありがたいです。よろしくお願い致します。
下記のようなプログラムを組んだところ、ページを開いたらすぐ全データがが出てくる状態になっています。ページを開いても何もデータが出てこない状態にして検索してからデータが出てくるようにするにはどのように書き換えれば良いのでしょうか?
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>リーグデータ</title>
<link rel="stylesheet" type="text/css" href="../common/style.css"/>
</head>
<?php error_reporting( E_ALL ^ E_NOTICE ); ?>
<body id="list">
<div id="main">
<form name="search_form" action="player_list.php" method="post">
<input type="hidden" name="cmd" value="search" />
<table>
<tr>
<th class="th_top">選手名</th>
<td class="td_top">
<input type="text" name="name" size="30" value="<?php echo $_POST['name'] ?>">
</td>
</tr>
<tr>
<th>チーム名</th>
<td>
<input type="checkbox" name="team_id[]" value="1" <?php if (isset($_REQUEST['team_id']) and in_array('1',$_REQUEST['team_id'])) print 'checked'; ?>/>
名古屋
<input type="checkbox" name="team_id[]" value="2" <?php if (isset($_REQUEST['team_id']) and in_array('2',$_REQUEST['team_id'])) print 'checked'; ?>/>
徳島
<input type="checkbox" name="team_id[]" value="3" <?php if (isset($_REQUEST['team_id']) and in_array('3',$_REQUEST['team_id'])) print 'checked'; ?>/>
千葉
<input type="checkbox" name="team_id[]" value="4" <?php if (isset($_REQUEST['team_id']) and in_array('4',$_REQUEST['team_id'])) print 'checked'; ?>/>
浦和
<input type="checkbox" name="team_id[]" value="5" <?php if (isset($_REQUEST['team_id']) and in_array('5',$_REQUEST['team_id'])) print 'checked'; ?>/>
磐田<br />
</td>
</tr>
<tr>
<th class="th_middle">
ポジション
</th>
<td class="td_middle">
FW MF DF GK
</td>
</tr>
</table>
<p>
<input type="submit" value="検索">
<input type="reset" value="リセット">
</p>
</form>
<?php
try
{
$dsn = 'mysql:dbname=xxxxx;host=localhost';
$user = 'xxxxx';
$password = 'xxxxxx';
$dbh = new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');
$sql = 'SELECT code,name,team_name,price,position,gazou FROM mst_player_market WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$dbh = null;
if(isset($_POST['name'])) {
$name = htmlspecialchars($_POST['name']);
print($name);
}
if(isset($_POST['name'])) {
if(!$_POST['name']==true){print '';
}else{
$sqlN ='code IN (SELECT code FROM mst_player_market where name LIKE ("%'.$_POST['name'].'%"))';
$sql.=' and ('.$sqlN.')';
}
}
if(isset($_POST['team_id'])and is_array($_POST['team_id'])){
$ary = array_filter($_POST['team_id'], function($v) {return is_numeric($v);});
$sqlA = 'code IN (SELECT playerid FROM team WHERE team_id IN ('.implode(',', $ary).'))';
}else{ print '';
$sqlA = ' 1 ';
$flag=false;
}
$sql.=' and ('.$sqlA.')';
if($flag) $sql.="AND 0 ";;
//参考
print $sql."<br>";
//実行
$pdo = new PDO($dsn,$user,$password);
$stmt = $pdo->prepare($sql);
$stmt->execute();
//画像処理
$rows=array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$rows[]=$row;
};
//参考SQL文表示
print_r($rows);
print'選手一覧<br /><br />';
print'</form>';
}
catch(Exception $e)
{
print'ただいま障害により大変ご迷惑をお掛けしております。';
exit();
}
?>
<?php
foreach((array) $rows as $row ){
?>
<tr>
<td><img src="../player/<?php print( htmlspecialchars( $row["gazou"], ENT_QUOTES )); ?>" /></td>
<td><?php print( htmlspecialchars( $row["team_name"], ENT_QUOTES )); ?></td>
<td>\<?php print( htmlspecialchars( number_format( $row["price"] ),ENT_QUOTES ) ); ?></td>
<td>
<?php print( htmlspecialchars( $row["name"], ENT_QUOTES ) ); ?>
</td>
<td>
<?php print( htmlspecialchars( $row["position"], ENT_QUOTES ) ); ?>
</td>
</tr>
<?php
}
?>
</table>
</div>
<!------------mainのdiv-------------->
</body>
</html>
No.3ベストアンサー
- 回答日時:
>何かおかしなところがございましたらご指摘いただけたらありがたい
DBの部分はまぁよいとして、htmlに組み込むところを少し調整した方がよいようです
こんな風にしておくと、htmlの部分がぐちゃぐちゃにならずにプログラムとの
親和性があがります
とくに例示では$_POSTの中身をそのまま出力していましたが、さすがにNGです
<?PHP
$value=array();
//想定するデータを初期化しておく
$value['name']="";
if(isset($_REQUEST['name'])){
$value['name']=htmlspecialchars($_REQUEST['name'],ENT_QUOTES,'UTF-8');
}
$checked=array();
//想定するデータを初期化しておく
$checked['team_id']=array(1=>"",2=>"",3=>"",4=>"",5=>"");
if(isset($_REQUEST['team_id']) and is_array($_REQUEST['team_id'])){
foreach($_REQUEST['team_id'] as $val){
$checked['team_id'][$val]=" checked";
}
}
print <<<eof
<form>
<input type="hidden" name="cmd" value="search" />
<table>
<tr>
<th class="th_top">選手名</th>
<td class="td_top">
<input type="text" name="name" size="30" value="{$value['name']}">
</td>
</tr>
<tr>
<th>チーム名</th>
<td>
<input type="checkbox" name="team_id[]" value="1"{$checked['team_id'][1]}/>名古屋
<input type="checkbox" name="team_id[]" value="2"{$checked['team_id'][2]}/>徳島
<input type="checkbox" name="team_id[]" value="3"{$checked['team_id'][3]}/>千葉
<input type="checkbox" name="team_id[]" value="4"{$checked['team_id'][4]}/>浦和
<input type="checkbox" name="team_id[]" value="5"{$checked['team_id'][5]}/>磐田<br />
</td>
</tr>
</table>
<p>
<input type="submit" value="検索">
<input type="reset" value="リセット">
</p>
</form>
eof;
この回答への補足
今回も回答頂きありがとうございます!
私の書き方が悪いと思うのですが、以下のようなエラーがテキスト内に出てしまいます。
<br /><b>Notice</b>: Undefined variable: value in <b>C:\xampp\htdocs\xxxxxx\xxxxxxx\xxxxxxx</b> on line <b>23</b><br /><br /><b>Notice</b>: Undefined index: in <b>C:\xampp\htdocs\xxxxxxxxxxx\xxxxxx\xxxxxxxx</b> on line <b>23</b><br />
これを直すのに少し時間がかかってしまうのでしばらくしてどうしてもわからなかったらまたここで質問させていただきたいと思っております。
恐縮ですが気が向いたらまたご教授いただきたいと思っております。
本当にありがとうございました!
No.2
- 回答日時:
例文が複雑になっているのでプレイスホルダーの部分だけ抜き出して書きます。
こんな感じでやってみてください
<form>
name:<input type="text" name="name" size="30" value=""><br>
check:<input type="checkbox" name="team_id[]" value="1">1
<input type="checkbox" name="team_id[]" value="2">2
<input type="checkbox" name="team_id[]" value="3">3
<input type="submit" value="go">
</form>
<?PHP
$sql = "SELECT * FROM mst_player_market WHERE 1 ";
$datas=array();
//nameとteam_idを拾う
$name=(isset($_REQUEST["name"])and $_REQUEST["name"]!=="")?$_REQUEST["name"]:null;
$team_id=(isset($_REQUEST["team_id"]) and is_array($_REQUEST["team_id"]))?$_REQUEST["team_id"]:null;
//nameもteam_idも空なら検索させない
if(is_null($name) and is_null($team_id)){ $sql.= "AND 0 "; }
//nameに何かはいっていれば検索、ただしワイルドカードやエスケープ文字をエスケープする
if(!is_null($name)){
$sql.= "AND name like ? ";
$datas[]="%".addcslashes($name, '\\_%')."%";
}
//team_idをINで検索
if(!is_null($team_id)){
$sql.= "AND team_id in (".implode(",",array_fill(1,count($team_id),"?")).") ";
$datas=array_merge($datas,$team_id);
}
print $sql.";<br>\n";
print_r( $datas);
$pdo = new PDO($dsn, $user,$password);
$stmt = $pdo->prepare($sql);
$stmt->execute($datas);
?>
この回答への補足
度々丁寧な解説して頂いて本当にありがとうございます!
只今結果報告が出来る状況ではありませんので申し訳ありませんがしばらくお待ち頂けたらと思っております。
明後日くらいまでには結果報告しますのでよろしくお願い致します。
いつもお世話になってます!
ご教授いただいたプログラムを組み合わせて作りました。
間違っているかどうかわからないですがプレースホルダーを使ったシステム自体は動いています。
何かおかしなところがございましたらご指摘いただけたらありがたいと思っております。
またチェックボックスなど項目を増やすかもしれないので気が向きましたらご教授いただけたらと思っております。
いつもお忙しいところ本当にありがとうございます。おかげ様でなんとかプログラムが動かせるようになりました。
プログラムは下記のように入力しました。
<form name="search_form" action="xxxxx.php" method="post">
<input type="hidden" name="cmd" value="search" />
<table>
<tr>
<th class="th_top">選手名</th>
<td class="td_top">
<input type="text" name="name" size="30" value="<?php echo $_POST['name'] ?>">
</td>
</tr>
<tr>
<th>チーム名</th>
<td>
<input type="checkbox" name="team_id[]" value="1" <?php if (isset($_REQUEST['team_id']) and in_array('1',$_REQUEST['team_id'])) print 'checked'; ?>/>
名古屋
<input type="checkbox" name="team_id[]" value="2" <?php if (isset($_REQUEST['team_id']) and in_array('2',$_REQUEST['team_id'])) print 'checked'; ?>/>
徳島
<input type="checkbox" name="team_id[]" value="3" <?php if (isset($_REQUEST['team_id']) and in_array('3',$_REQUEST['team_id'])) print 'checked'; ?>/>
千葉
<input type="checkbox" name="team_id[]" value="4" <?php if (isset($_REQUEST['team_id']) and in_array('4',$_REQUEST['team_id'])) print 'checked'; ?>/>
浦和
<input type="checkbox" name="team_id[]" value="5" <?php if (isset($_REQUEST['team_id']) and in_array('5',$_REQUEST['team_id'])) print 'checked'; ?>/>
磐田<br />
</td>
</tr>
</table>
<p>
<input type="submit" value="検索">
<input type="reset" value="リセット">
</p>
</form>
//データベース接続部分省略
//最初のSQL文
$sql = "SELECT DISTINCT code,name,price,position,gazou,team.team_name FROM mst_player_market,team,position WHERE mst_player_market.code = team.playerid";
$datas=array();
//nameとteam_idを拾う
$name=(isset($_REQUEST["name"])and $_REQUEST["name"]!=="")?$_REQUEST["name"]:null;
$team_id=(isset($_REQUEST["team_id"]) and is_array($_REQUEST["team_id"]))?$_REQUEST["team_id"]:null;
//nameもteam_idも空なら検索させない
if(is_null($name) and is_null($team_id) and is_null($position_id)){ $sql.= "AND 0 "; }
//nameに何かはいっていれば検索、ただしワイルドカードやエスケープ文字をエスケープする
if(!is_null($name)){
$sql.= " AND name like ? ";
$datas[]="%".addcslashes($name, '\\_%')."%";
}
//team_idをINで検索
if(!is_null($team_id)){
$sql.= " AND team_id in (".implode(",",array_fill(1,count($team_id),"?")).") ";
$datas=array_merge($datas,$team_id);
}
print $sql.";<br>\n";
print_r( $datas);
/************************************************************************/
//実行
$pdo = new PDO($dsn,$user,$password);
$stmt = $pdo->prepare($sql);
$stmt->execute($datas);
$rows=array();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
$rows[]=$row;
};
//参考SQL文表示
print_r($rows);
print'選手一覧<br /><br />';
print'</form>';
}
catch(Exception $e)
{
print'ただいま障害により大変ご迷惑をお掛けしております。';
exit();
}
?>
//結果部分省略
No.1
- 回答日時:
$_POST["team_id"]や$_POST["name"]など検索項目をissetでチェックして
すべてがセットされていなければ、SQLを走らせなければよいのでは?
もしくはSQLのWHERE句に"AND 0"が付加される様にして発行すれば
1件もヒットしません
ちなみにざっと見た感じ、プレースホルダの使い方が変
POSTされたデータを生でSQLに投入したらプリペアド処理する意味ないでしょ
運用方法を見直した方がよいです
ご指摘ありがとうございます!
プレースホルダの使い方はまだ全然理解できてないのでこれからマニュアル見るなり検索してみるなりしてみようと思います。
下記のようなプログラムを入力したらSQL文のプログラムが走らなくなりました。
<?php
try
{
$dsn = 'mysql:dbname=player;host=localhost';
$user = 'xxxxx';
$password = 'xxxxxx';
$dbh = new PDO($dsn,$user,$password);
$dbh->query('SET NAMES utf8');
$sql = 'SELECT code,name,team_name,price,position,gazou FROM mst_player_market WHERE 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$dbh = null;
のあとに下記のプログラム入力。
if(isset($_POST['name']) && ($_POST['team_id']!==0)){
$sql.='1';
}else{
$sql.='and 0';
を入れると何故かページを開いたらすぐ全データが出ない状態になりました。
($_POST['team_id']!==0)
の部分が特にわからないです。値が入っていないと言う意味ですよね?
選手名だけ入力した場合、チーム名だけ入力した場合、それと両方入力した場合で3パターンとも意味がわからないですが正常に動きました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQLサーバから、項目の属性(型...
-
SQLにて特定の文字を除いた検索...
-
”photo id” とは何ぞや?
-
【初心者】特定の文字に色をつ...
-
SQL Left Join で重複を排除す...
-
少し前に放送されていたオムツ...
-
クエリ表示と、ADOで抽出したレ...
-
エクセルの関数について教えて...
-
阪急三番街 ATM(ゆうちょ)は...
-
テーブルが5つの時の結合の仕...
-
SQLの検索について
-
多段外部結合はできる?
-
複数のカラムの中から最大値を...
-
複数行を一列に表示する場合に...
-
inner joinをすると数がおかし...
-
テーブル名を省略して「h.id」...
-
上位3位を求めるSQL文は?
-
2つのカラムでgroup by の動作...
-
VBAでボタンをクリックする方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
副問合せの書き方について
-
select文のwhere句に配列を入れ...
-
マイクラPC版のコマンドで効率...
-
SQLサーバから、項目の属性(型...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] 3つのテーブルの結合で...
-
Access パラメータクエリをcsv...
-
SQLにて特定の文字を除いた検索...
-
SQL Left Join で重複を排除す...
-
ストアドのエラーについて
-
Unionした最後にGROUP BYを追加...
-
バインド変数について
-
PL/SQLの変数について
-
sqlで、600行あるテーブルを100...
-
WordpressのContact form 7でzi...
-
selectした大量データをinsert...
-
inner joinをすると数がおかし...
おすすめ情報