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

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

ただいまの
回答率

87.94%

SQL文で昇順にデータが取得出来ません

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,830

score 33

【質問内容】
PHPの関数の中でSQLを使用してデータを取得する際に、
変数「rank」に入っている整数値を参照し、「昇順」にデータを取り出したいのですがエラーが出てうまくいきません。
初心者で大変申し訳ありませんが、何卒よろしくお願い致します。


【備考】
・「ORDER BY rank ASC」 ⇒「ORDER BY rank」としたところ順不同ではありますがデータは取得出来ました。
(ORDER BY rank ASCとするとエラーが出てしまいデータを取得することが出来ません)

・データベースは「MariaDB」を使用しています。


【エラー】
エラー: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 'AND ( w.obj_key like ?)' at line 12


public function get_waitobj($search_key){
     $sql = <<<EOS
SELECT
        w.rank       as rank,
        w.obj_key    as obj_key,
        w.dotdata    as dotdata

FROM
        waitobj w

ORDER BY rank ASC

EOS;
        if($search_key != ""){
            $sql .= " AND ( w.obj_key  like :obj_key) ";
        }

        try {
            $stmh = $this->pdo->prepare($sql);
            if($search_key != ""){
                $search_key = '%' . $search_key . '%'; 
                $stmh->bindValue(':obj_key',  $search_key, PDO::PARAM_STR );
            }
            $stmh->execute();

            // 検索結果を多次元配列で受け取る
            $i=0;
            $data = [];
            while ($row = $stmh->fetch(PDO::FETCH_ASSOC)){
                foreach( $row as $key => $value){
                        $data[$i][$key] = $value;
                }
                $i++;
            }
        } catch (PDOException $Exception) {
            print "エラー:" . $Exception->getMessage();
        }
        return $data;
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

public function get_waitobj($search_key)
{
    $sql = "SELECT ";
    $sql .= "w.rank as rank, ";
    $sql .= "w.obj_key as obj_key, ";
    $sql .= "w.dotdata as dotdata ";
    $sql .= "FROM ";
    $sql .= "waitobj w ";
    $sql .= "WHERE 1 ";
    if ($search_key != "") {
        $sql .= " AND ( w.obj_key like :obj_key) ";
    }
    $sql .= "ORDER BY rank ASC";

    try {
        $stmh = $this->pdo->prepare($sql);
        if ($search_key != "") {
            $search_key = '%' . $search_key . '%';
            $stmh->bindValue(':obj_key', $search_key, PDO::PARAM_STR);
        }
        $stmh->execute();

        // 検索結果を多次元配列で受け取る
        return $stmh->fetchAll(PDO::FETCH_ASSOC);
    } catch (PDOException $Exception) {
        print "エラー:" . $Exception->getMessage();
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/25 00:20

    > KiyoshiMotokiさん
    補足ありがとうございます。" AND ( w.obj_key like :obj_key) ";という条件式があるのに、WHEREがないというのが正確な表現ですね。

    キャンセル

  • 2016/12/25 00:23

    Kosuke_Shibuya様

    レスありがとうございます。

    > " AND ( w.obj_key like :obj_key) ";という条件式があるのに、WHEREがないというのが正確な表現ですね。

    まさに、仰る通りですね。

    キャンセル

  • 2016/12/25 00:54

    >KiyoshiMotokiさん、詳細なご説明ありがとうございます。
    大変勉強になりました。
    >Kosuke_Shibuyaさん
    コードのご提示、及び参考URLありがとうございます。
    精進致します。

    キャンセル

+1

ORDER BYのデフォルトはASCなので通常記述しません。エラーになるDBってあるんですね。
同じSQLでもDBによって方言が多いです。質問毎にお使いのDBが何か明記された方が良いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/25 00:55 編集

    SQLで分からないことが多かったので勉強になりました。
    ご返信ありがとうございました。

    キャンセル

  • 2016/12/25 02:45

    いちおう、正規マニュアルです。今回の件でマニュアルの見方も進歩したでしょう。
    https://dev.mysql.com/doc/refman/5.6/ja/select.html

    キャンセル

  • 2016/12/27 01:57

    >Orlofskyさん
    正規マニュアルのリンクありがとうございます。
    精進致します。

    キャンセル

+1

具体的にどんなエラーが発生しているのでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/24 23:38 編集

    初心者であまり分かっていないので恐縮なのですが、WHERE句は今回記載しておりません。
    (ないといけないものなのでしょうか。。)
    ちなみにですが、「ORDER BY rank」としたところ順番がばらばら(昇順ではない)ですがデータは取得することが出来ました。

    キャンセル

  • 2016/12/24 23:46

    ないといけません。
    コードを見た感じだと
    SELECT ~~ FROM xx ORDER BY rank ASC AND (w.obj_key like ?) AND (w.obj_key like ?)
    というSELECT分を実行しようとしていますよね。
    ただしくは
    SELECT ~~ FROM xx WHERE (w.obj_key like ?) AND (w.obj_key like ?) ORDER BY rank ASC
    のようなSELECT文にしなければなりません。

    キャンセル

  • 2016/12/24 23:54

    WHEREはないとダメなのですね。詳細なご説明ありがとうございます。

    キャンセル

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

  • ただいまの回答率 87.94%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る