質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Q&A

解決済

2回答

1263閲覧

PHP PDO検索結果の並び替えについて

h28cis02

総合スコア8

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

0グッド

2クリップ

投稿2018/01/18 01:08

編集2018/01/18 02:01

###前提・実現したいこと
PHPでPDOを使いデータベースを検索する機能を作成しています。
検索結果が表示された後、リストボックスから項目を選び、並び替えをさせたいです。

###該当のソースコード

<?php session_start (); header ( 'Expires:-1' ); header ( 'Cache-Control:' ); header ( 'Pragma:' ); // データベース接続 include_once 'dbconnect.php'; if (! isset ( $_SESSION ['user'] )) { header ( "Location: index.php" ); } require_once ('header.php'); // userからデータを読み込む // クエリの実行 $query = "SELECT * FROM users WHERE user_id=" . $_SESSION ['user'] . ""; $result = $mysqli->query ( $query ); if (! $result) { print ('クエリーが失敗しました。' . $mysqli->error) ; $mysqli->close (); exit (); } while ( $row = $result->fetch_assoc () ) { $user_id = $row ["user_id"]; } // データベースの切断 $result->close (); if (count ( $errors ) === 0) { $dsn = 'mysql:host=localhost;dbname=movie_db;charset=utf8'; $user = 'root'; $password = ''; try { $dbh = new PDO ( $dsn, $user, $password ); $yourname = $_POST ['yourname']; $genre = $_POST ['genre']; // キーワードが入力されているとき if ($yourname != "") { if ($genre == "all") { // ジャンル指定なし $sql = $dbh->prepare ( "SELECT * FROM movies WHERE title LIKE '%{$yourname}%'" ); } else { // ジャンル指定あり // プレースホルダへ実際の値を設定する $sql = $dbh->prepare ( "SELECT * FROM movies WHERE genre2 LIKE '%{$genre}%' AND title LIKE '%{$yourname}%'" ); } if ($sql->execute ()) { // レコード件数取得 $row_count = $sql->rowCount (); while ( $row = $sql->fetch () ) { $rows [] = $row; } } else { $errors ['error'] = "検索失敗しました。"; } // データベース接続切断 $dbh = null; // キーワード指定がないとき } else { if ($genre == 'all') { // ジャンル指定なし $sql = $dbh->prepare ( "SELECT * FROM movies" ); } else { // ジャンル指定あり $sql = $dbh->prepare ( "SELECT * FROM movies WHERE genre2 LIKE '%{$genre}%'" ); } if ($sql->execute ()) { // レコード件数取得 $row_count = $sql->rowCount (); while ( $row = $sql->fetch () ) { $rows [] = $row; } } else { $errors ['error'] = "検索失敗しました。"; } $yourname = "指定なし"; // データベース接続切断 $dbh = null; } // クッキーを保存 if (isset ( $_COOKIE ["movie_db"] )) { $movie_db = $_COOKIE ["movie_db"]; $yourname = $movie_db ["yourname"]; $genre = $movie_db ["genre"]; } } catch ( PDOException $e ) { print ('Error:' . $e->getMessage ()) ; $errors ['error'] = "データベース接続失敗しました。"; } } // 観たいリストへ追加ボタン if (isset ( $_POST ["submit_list"] )) { $error = "観たいリストへ追加しました。"; } ?> <!DOCTYPE html> <html> <head> <title>検索結果</title> <meta charset="utf-8"> </head> <body> <?php if (count($errors) === 0): ?> <?php // エラーメッセージがあったら表示 if (strlen ( $error ) > 0) { echo "<font size=\"3\" color=\"#da0b00\">{$error}</font><p>"; } ?> <p><?=$row_count?>件あります</p> <p><?="ジャンル:".htmlspecialchars($genre, ENT_QUOTES, 'UTF-8')?></p> <p><?="キーワード:".htmlspecialchars($yourname, ENT_QUOTES, 'UTF-8')?></p> <form method="POST" action="search.php"> <select name="select"> <option value="default" selected="selected">並び替え</option> <option value="newyear">新しい順</option> <option value="oldyear">古い順</option> </select> <div class="search"> <table> <?php foreach ( ( array ) $rows as $row ) { $no = $row ['no']; $title = $row ['title']; $content = $row ['content']; $genre1 = $row ['genre1']; $genre2 = $row ['genre2']; $pic = $row ['pic']; $year = $row ['year']; ?> <tr> <td><img src="./pic/<?=$pic?>" width="100" height="150"></td> </tr> <tr> <td><?=htmlspecialchars($row['title'],ENT_QUOTES,'UTF-8')?></td> </tr> <tr> <td><?php echo '<a href="up.php?no=' . $no . '"> <input type="button" value="投稿"></a>'; ?> <input type="submit" name="submit_list" value="観たい"></td> </tr> <tr> <td><?php echo '<a href="movieinfo.php?no=' . $no . '"> <input type="button" value=" 詳細 "></a> </td></tr> '; // } ?> <?php elseif(count($errors) > 0): ?> <?php foreach ( $errors as $value ) { echo "<p>" . $value . "</p>"; } ?> <?php endif; ?> </table> </div> </form> </body> </html>

###試したこと
以下のようなコードを記述すればよいのかと考えました。

if($select == 'newyear') $sql.="ORDER BY year ASC"; elseif ($select == 'oldyear') $sql.="ORDER BY year DESC";

###補足情報(言語/FW/ツール等のバージョンなど)
php5.6 html5 xampp Mysql
phpの経験が浅く、理解しきれなく質問させていただきました。
説明不足の点が多いと思いますが、よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/01/18 01:29

プログラムコード(およびエラーメッセージ)は```で囲ってください。(わからなければ質問編集画面でコード部分を選択し<code>ボタンを押してください)正しく反映されているかどうかは質問編集画面のプレビューを見ながら編集していってください。
guest

回答2

0

変数名、ちゃんと付けたほうがイイですよ。

どこに追記するつもりか分かりませんが、$sql には結果セットが入っているので、意図した動作になりません。

sql文に追加してあげてください。

気になった点
根底にあるのが、変数に対して適切な名付けが出来ていないことがと思います。
$sql と $error がおかしいです。

また、全体的に、Web サイトに対してのセキュリティ意識の無いコードになっているので、少なくとも
・SQL インジェクション対策
・出力エスケープ
・入力値確認
はしたほうが良いかと。

あと、中途半端にロジックと表示が入り混じっているので、見通しが悪いです。分離したほうがかっこいい。

それと、include_once 'dbconnect.php';の意図が分かりません。
上記か$dbh = new PDO ( $dsn, $user, $password );のいずれかが必要ないと思います。

投稿2018/01/18 02:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h28cis02

2018/01/18 02:23

御回答ありがとうございます。 まだまだ理解が浅く見苦しいコードで申し訳ありません。 少しずつ直したいと思います。 内容についてなのですが、 tryを抜けた後に記述しようとしていました。 sql文に追加するというのはどういうことでしょうか。
退会済みユーザー

退会済みユーザー

2018/01/18 02:28

多分勘違いしていると思いますが、ORDER BY year DESC は結果セットをソートする役割ではありません。 DB からデータを引っ張ってくる時に、DB でソートするための指示です。 どの SQL 文に適用したいのか不明ですが、必要となる SQL 文のお尻につけてあげてください。
退会済みユーザー

退会済みユーザー

2018/01/18 05:02 編集

$sql = $dbh->prepare (~) で与えているSELECT文(~の箇所)に対して、ORDER BY句を足してあげるのが正しいと、te2jiさんは伝えたいのだと思います。 $sqlにはSQL文がそのまま納められているわけではないです。PDOStatement クラスのインスタンスです。 http://php.net/manual/ja/book.pdo.php ドキュメントでの例では、$sthがそれに当たります。 $sqlというネーミングはSQL文が納められている印象をあたえるので、初見殺しだから、面倒でなければネーミングを変えたほうが良いでしょう。
guest

0

ベストアンサー

試したことに書かれている
「$select」が唐突にでてきますが、$selectをなんらかのパラメータで渡せば
その方針でよろしいのでは?

ちなみにprepare処理をしているのにそのSQL文に変数を直接書き込むのは
本末転倒なのでやめたほうが良いと思います

投稿2018/01/18 01:22

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

h28cis02

2018/01/18 01:59

POSTで渡してこのように記述したのですが、うまくいきませんでした。 $select = $_POST['select']; if($select == 'newyear') $sql.="ORDER BY year ASC"; elseif ($select == 'oldyear') $sql.="ORDER BY year DESC"; if ($sql->execute ()) { // レコード件数取得 $row_count = $sql->rowCount (); while ( $row = $sql->fetch () ) { $rows [] = $row; } }else { $errors ['error'] = "検索失敗しました。"; } // データベース接続切断 $dbh = null;
yambejp

2018/01/18 02:07

> $sql->execute () 定義されている内容を見る限り、$sqlは$dbhから作成される ステートメントですよね? その$sqlに文字列としてorder by句を結合するのは間違いです。 prepare内に記載したsql文の文字列に結合して下さい
h28cis02

2018/01/18 02:43

$sqlに文字列を付け足すのはおかしいことは理解しました。 > prepare内に記載したsql文の文字列に結合して下さい ここについてもう少し詳しく説明頂けないでしょうか。 検索結果を出力後にソートをしたいのですが記述方法がよくわかりません...
yambejp

2018/01/18 06:28

仮に以下が正だとするなら $sql = $dbh->prepare ( "SELECT * FROM movies "); $query="SELECT * FROM movies "; if(条件){ $query.="ORDER BY なんたらかんたら"; else{ $query.="ORDER BY なんたらかんたら"; } $sql = $dbh->prepare ( $query); みたいな感じです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問