###前提・実現したいこと
WordPressの固定ページにPHPでデータベースにアクセスしデータを出力したいと思っています。
固定ページにPHPを書き込むことはショートコードを使用することでクリアしています。
表示されたエラーメッセージについて調べてみると、SQL文の書き方にミスがあるらしいのですが、いくら修正をしてみても解決しません。どこを修正すれば良いのでしょうか?回答よろしくお願い致します。
###発生している問題・エラーメッセージ
接続成功 クエリーが失敗しました。 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"wp_options" WHERE option_id >= 5' at line 1
###該当のソースコード
try{ $my_Con = mysql_connect("localhost","[user]","[pass]"); if($my_Con == false){ echo '接続失敗<br/>'; }else{ echo '接続成功<br/>'; } $query = 'SELECT option_name FROM "wp_options" WHERE option_id >= 5'; $result = mysql_query($query, $my_Con); if(!$result){ die('クエリーが失敗しました。<br/>'.mysql_error()); }
###試したこと
(1)修正箇所
SELECT option_name FROM wp_options WHERE option_id >= 5
エラーメッセージ
接続成功 クエリーが失敗しました。 No database selected
(2)修正箇所
SELECT "option_name" FROM "wp_options" WHERE "option_id" >= 5
エラーメッセージ
接続成功 クエリーが失敗しました。 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"wp_options" WHERE "option_id" >= 5' at line 1
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
普通ダブルクォートで囲むと文字リテラルとして扱われるので、データベースではエラーになりますから、構文的には「(1)修正箇所」が一番正しいと思います。
で、「データベースが選ばれてないよ!」ってエラーが帰ってきてますから、単純にアクティブにするデータベースを選択してあげればいいのでは?
PHP
1$my_Con = mysql_connect("localhost","[user]","[pass]");
の後に、
PHP
1mysql_select_db("your_db_name", $my_Con);
これでそれ以降のmysql_query()は全て選択されたアクティブなデータベース上で実行されることになります。(your_db_nameはあなたの利用しているデータベース名に変更してくださいね)
【補足】
コメントにもありましたが「普通ダブルクォートで囲むと文字リテラルとして扱われる」と書いたのは私のミスです。
多くのRDBMSでは普通にダブルクォート使ってましたね(恥)
むしろ文字リテラルとして扱われるのはシングルクォートの場合でしたね・・・
MySQLではバッククォートなんかも使いますから、ほんとMySQLはちょっと異端だと思います。
ちょっと質問の内容とずれますが、「-」(ハイフォン)を表名や列名に使う場合、ダブルクォートで囲まないと、SQL文では減算と解釈されますから、ダブルクォートで囲むことで、記号なども名前に使用することもできます。
お勧めはしませんけどね( ̄▽ ̄;)
投稿2017/09/03 08:51
編集2017/09/04 06:54総合スコア83
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/03 10:54
退会済みユーザー
2017/09/03 11:04
退会済みユーザー
2017/09/03 13:46 編集
退会済みユーザー
2017/09/03 13:50
退会済みユーザー
2017/09/04 09:39
0
データを取るだけなら以下で良いかと…
$query = $wpdb->get_results( 'SELECT option_name FROM wp_options WHERE option_id >= 5');
投稿2017/09/03 09:23
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
せっかくなので、私も回答を書きます。
まず、大前提
WordPress では テーブル操作用の関数が用意されているので、それを使うのが正しいです。
素の PHP で対応することは、将来のバージョンアップ対応やメンテナンスで、非常にイレギュラーな扱いをしなければならなくなるので、極力避けるべきです。
今回の回答の中では、ay03 さんが WordPress 内で使うべき関数を使用した具体的な方法を提示してくれているので、参考にすると良いです。
また、今回使用している、mysql_connect は、PHP 5.5.0 より非推奨となっている関数なので、素の PHP で書くにしても、現在は避けるべき関数です。質問には PHP のバージョン明記はありませんが、WordPress を使用しているサーバであれば、PDO や MySQLi が使用できると思いますので、そちらを使用してください。
syntax error に関して
やっと、今回の質問内容への回答となりますが、syntax error を出しているのは、テーブル名を「ダブルクオート」で囲ったことが原因です。
「(1)修正箇所」で実はすでに切り分けが出来ているのですが、MySQL の SQL 文として、テーブル名を「ダブルクオート」で囲むことは許されていません。
(厳密には設定されたモードにもよるので、時間のある時に以下のマニュアルを参考にしてください。
9.2 スキーマオブジェクト名 - MySQL マニュアル
こちらのページには、テーブル名を引用符で囲む場合と囲まない場合の違いも記述が有るので合わせて確認しておくと良いです。)
今回のケースでは、テーブル名を引用符「バッククォート」で囲むか、引用符を無くすかすることで、syntax error を無くすことが出来ます。
もう一つの error
本来であれば、「(1)修正箇所」で切り分けが出来ているのですが、この中でも error が出ているため、混乱してしまったようですね。惜しいw
urdapple さんが回答しているように、メッセージを素直に読むと、「データベースが選ばれてないよ!」ってエラーなので、それに対応することで、対処は完了します。
ようするに
今回のケースでは、wpdb を使用し、SQL 文の構文を修正するのが、WordPress を使用する上で最も適切な対応になります。
投稿2017/09/05 01:06
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/05 11:07
退会済みユーザー
2017/09/05 11:28
退会済みユーザー
2017/09/05 11:42
0
もー… 回答者全員、何いってんだか意味がわからないんですが、
You have an error in your SQL syntax:
って書いてあるんだから、シンタックスエラーに決まってんじゃないですか。
SQL
1SELECT option_name FROM "wp_options" WHERE option_id >= 5
ですけど、phpmyadmin のタグついてるってことは、DB は MySQL なんでしょ?
何て呼ぶのか忘れましたけど、MySQL のテーブル名およびフィールド名を区切る記号はダブルクオートじゃなくてバッククオートです。これ。
SQL
1`
ダブルクオートは PostgreSQL。
本当に全員、もっと真面目にやってください。
投稿2017/09/03 10:05
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/03 10:08
退会済みユーザー
2017/09/03 10:15
退会済みユーザー
2017/09/03 10:29
退会済みユーザー
2017/09/03 10:33
退会済みユーザー
2017/09/03 10:54 編集
退会済みユーザー
2017/09/03 11:02
退会済みユーザー
2017/09/03 11:15
退会済みユーザー
2017/09/03 11:26
退会済みユーザー
2017/09/03 11:47 編集
退会済みユーザー
2017/09/03 11:55
退会済みユーザー
2017/09/03 12:31 編集
退会済みユーザー
2017/09/03 12:52
退会済みユーザー
2017/09/03 12:56
退会済みユーザー
2017/09/03 12:57
退会済みユーザー
2017/09/03 13:07
2017/09/03 13:17
退会済みユーザー
2017/09/03 13:18
退会済みユーザー
2017/09/03 13:22
退会済みユーザー
2017/09/03 13:31
退会済みユーザー
2017/09/03 13:33
退会済みユーザー
2017/09/03 13:35
退会済みユーザー
2017/09/03 13:36
退会済みユーザー
2017/09/03 13:42
退会済みユーザー
2017/09/03 13:44
退会済みユーザー
2017/09/03 13:49
退会済みユーザー
2017/09/03 13:51
退会済みユーザー
2017/09/03 13:52
退会済みユーザー
2017/09/03 13:52
2017/09/04 15:40
退会済みユーザー
2017/09/05 08:14 編集
2017/09/05 09:34
2017/09/05 11:09
2017/09/05 11:12
退会済みユーザー
2017/09/05 11:47
0
PDO
を使ったほうがいいと思いますが、そのままmysql_xxx()
を使うのであれば下記のようにすればよいです。
データーベースにSELECT文で結果を受け取るには下記のようにします。
PDOなどでは下記の1.2.を同時に行うことができたりします。
- MySQLサーバーに接続(質問のコードでOK)
- データーベース選択(質問のコードにありません)
- SQLクエリ発行(質問のコード(1)修正箇所が正解です)
- SQLクエリの結果を受け取る
php
1try{ 2 $my_Con = mysql_connect("localhost","[user]","[pass]"); 3 4 if($my_Con == false){ 5 echo '接続失敗<br/>'; 6 }else{ 7 echo '接続成功<br/>'; 8 } 9 10 // データーベース選択 11 mysql_select_db('データーベース名', $my_Con); 12 13 $query = 'SELECT option_name FROM wp_options WHERE option_id >= 5'; 14 $result = mysql_query($query, $my_Con); 15 16 if(!$result){ 17 die('クエリーが失敗しました。<br/>'.mysql_error()); 18 }
投稿2017/09/03 09:17
総合スコア1652
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。