こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

MySQLについての質問です

毎回お世話になっています。
今回も知恵を頂けたらありがたいです。よろしくお願い致します。

下記のようなプログラムを組んだところ、ページを開いたらすぐ全データがが出てくる状態になっています。ページを開いても何もデータが出てこない状態にして検索してからデータが出てくるようにするにはどのように書き換えれば良いのでしょうか?


<!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>

投稿日時 - 2014-11-04 18:34:23

QNo.8813798

困ってます

質問者が選んだベストアンサー

>何かおかしなところがございましたらご指摘いただけたらありがたい

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;

投稿日時 - 2014-11-10 12:27:37

補足

今回も回答頂きありがとうございます!
私の書き方が悪いと思うのですが、以下のようなエラーがテキスト内に出てしまいます。

<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 />

これを直すのに少し時間がかかってしまうのでしばらくしてどうしてもわからなかったらまたここで質問させていただきたいと思っております。

恐縮ですが気が向いたらまたご教授いただきたいと思っております。

本当にありがとうございました!

投稿日時 - 2014-11-11 19:27:39

ANo.3

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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);
?>

投稿日時 - 2014-11-07 13:03:46

補足

度々丁寧な解説して頂いて本当にありがとうございます!
只今結果報告が出来る状況ではありませんので申し訳ありませんがしばらくお待ち頂けたらと思っております。

明後日くらいまでには結果報告しますのでよろしくお願い致します。

投稿日時 - 2014-11-07 22:46:05

お礼

いつもお世話になってます!

ご教授いただいたプログラムを組み合わせて作りました。
間違っているかどうかわからないですがプレースホルダーを使ったシステム自体は動いています。
何かおかしなところがございましたらご指摘いただけたらありがたいと思っております。

またチェックボックスなど項目を増やすかもしれないので気が向きましたらご教授いただけたらと思っております。

いつもお忙しいところ本当にありがとうございます。おかげ様でなんとかプログラムが動かせるようになりました。


プログラムは下記のように入力しました。

<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();
}

?>

//結果部分省略

投稿日時 - 2014-11-10 02:46:37

ANo.1

$_POST["team_id"]や$_POST["name"]など検索項目をissetでチェックして
すべてがセットされていなければ、SQLを走らせなければよいのでは?

もしくはSQLのWHERE句に"AND 0"が付加される様にして発行すれば
1件もヒットしません

ちなみにざっと見た感じ、プレースホルダの使い方が変
POSTされたデータを生でSQLに投入したらプリペアド処理する意味ないでしょ
運用方法を見直した方がよいです

投稿日時 - 2014-11-04 19:10:33

お礼

ご指摘ありがとうございます!

プレースホルダの使い方はまだ全然理解できてないのでこれからマニュアル見るなり検索してみるなりしてみようと思います。

下記のようなプログラムを入力したら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パターンとも意味がわからないですが正常に動きました。

投稿日時 - 2014-11-07 02:38:49

あなたにオススメの質問