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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

3回答

7003閲覧

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

t33

総合スコア33

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2016/12/24 14:01

編集2016/12/24 14:31

【質問内容】
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


PHP

1public function get_waitobj($search_key){ 2 $sql = <<<EOS 3SELECT 4 w.rank as rank, 5 w.obj_key as obj_key, 6 w.dotdata as dotdata 7 8FROM 9 waitobj w 10 11ORDER BY rank ASC 12 13EOS; 14 if($search_key != ""){ 15 $sql .= " AND ( w.obj_key like :obj_key) "; 16 } 17 18 try { 19 $stmh = $this->pdo->prepare($sql); 20 if($search_key != ""){ 21 $search_key = '%' . $search_key . '%'; 22 $stmh->bindValue(':obj_key', $search_key, PDO::PARAM_STR ); 23 } 24 $stmh->execute(); 25 26 // 検索結果を多次元配列で受け取る 27 $i=0; 28 $data = []; 29 while ($row = $stmh->fetch(PDO::FETCH_ASSOC)){ 30 foreach( $row as $key => $value){ 31 $data[$i][$key] = $value; 32 } 33 $i++; 34 } 35 } catch (PDOException $Exception) { 36 print "エラー:" . $Exception->getMessage(); 37 } 38 return $data; 39 }

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

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

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

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

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

guest

回答3

0

ベストアンサー

php

1 2public function get_waitobj($search_key) 3{ 4 $sql = "SELECT "; 5 $sql .= "w.rank as rank, "; 6 $sql .= "w.obj_key as obj_key, "; 7 $sql .= "w.dotdata as dotdata "; 8 $sql .= "FROM "; 9 $sql .= "waitobj w "; 10 $sql .= "WHERE 1 "; 11 if ($search_key != "") { 12 $sql .= " AND ( w.obj_key like :obj_key) "; 13 } 14 $sql .= "ORDER BY rank ASC"; 15 16 try { 17 $stmh = $this->pdo->prepare($sql); 18 if ($search_key != "") { 19 $search_key = '%' . $search_key . '%'; 20 $stmh->bindValue(':obj_key', $search_key, PDO::PARAM_STR); 21 } 22 $stmh->execute(); 23 24 // 検索結果を多次元配列で受け取る 25 return $stmh->fetchAll(PDO::FETCH_ASSOC); 26 } catch (PDOException $Exception) { 27 print "エラー:" . $Exception->getMessage(); 28 } 29} 30

投稿2016/12/24 14:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

t33

2016/12/24 14:45

無事昇順にソート出来ました!ありがとうございます。 エラーが出た理由としてEOSで記載していたのがダメだったのでしょうか。。
退会済みユーザー

退会済みユーザー

2016/12/24 14:48 編集

直接の原因はそこじゃない。 SQLそのものが理解されていないようです。 SELECT ... FROM ... WHERE ... ORDER この順番で書かれていない。 提示のものには WHERE というキーワードすら書かれていない。
t33

2016/12/24 14:52

WHERE句がないのが原因だったのですね。。 お教え頂きありがとうございます。
退会済みユーザー

退会済みユーザー

2016/12/24 14:54

動くコード見せてるんだから、自分のコードと見比べてください。他にも問題の部分はありますよ。
t33

2016/12/24 14:56 編集

AND ( w.obj_key like :obj_key)を記載するタイミングでしょうか。。 (間違っていたらごめんなさい)
KiyoshiMotoki

2016/12/24 15:17

横から失礼します。 > 提示のものには WHERE というキーワードすら書かれていない。 について、誤解を招きそうなので補足させていただくと、 WHERE キーワードは記載しなければいけない、【というわけではありません】。 テーブルに格納されている全てのレコードを取得したい場合、  SELECT ... FROM [テーブル名] ORDER BY ... のように WHERE句を付けなくても良いですし、 Kosuke_Shibuya様の回答のように  SELECT ... FROM [テーブル名] WHERE 1 ORDER BY ... と、全てのレコードに対して true となる(※)ような WHERE句を付けても良いのです。 ※ MariaDB の場合、数値の 0 が false、それ以外の値が true とみなされます。  https://mariadb.com/kb/en/mariadb/boolean/  > A value of zero is considered false. Non-zero values are considered true: 実際、Kosuke_Shibuya様が示された URL に記載されている SELECT文の書式を見ても、  [WHERE where_condition] と、WHERE句が "[ ]" で囲われています。 "[ ]" で囲われている部分は、 「付けても付けなくても良い」 ことを表しています。
退会済みユーザー

退会済みユーザー

2016/12/24 15:20

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

2016/12/24 15:23

Kosuke_Shibuya様 レスありがとうございます。 > " AND ( w.obj_key like :obj_key) ";という条件式があるのに、WHEREがないというのが正確な表現ですね。 まさに、仰る通りですね。
t33

2016/12/24 15:54

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

0

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

投稿2016/12/24 14:29

turbgraphics200

総合スコア4267

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

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

t33

2016/12/24 14:32

エラー: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 というエラーが出ています。質問箇所にも追記致しました。 よろしくお願い致します。
turbgraphics200

2016/12/24 14:35

WHERE句より先にORDER BY句が記述されているからなのではないでしょうか?
t33

2016/12/24 14:39 編集

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

2016/12/24 14: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文にしなければなりません。
t33

2016/12/24 14:54

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

0

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

投稿2016/12/24 14:12

Orlofsky

総合スコア16415

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

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

t33

2016/12/24 14:21

失礼致しました。「MariaDB」を使用している旨記載致しました。 ORDER BY rankと記述したところデータは取得出来るのですが、順不同(昇順にならない)で困っています。。
Orlofsky

2016/12/24 15:44

他の人も書かれているように条件はORDER BY句の前にWHERE句がなければならないのに、ORDER BY句の次にWHERE句がないのに条件がかいてあるせいですね。
t33

2016/12/26 16:53 編集

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

2016/12/26 16:57

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問