###前提・実現したいこと
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件
4
ベストアンサー
普通ダブルクォートで囲むと文字リテラルとして扱われるので、データベースではエラーになりますから、構文的には「(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
3
データを取るだけなら以下で良いかと…
$query = $wpdb->get_results( 'SELECT option_name FROM wp_options WHERE option_id >= 5');
投稿2017/09/03 09:23
退会済みユーザー
総合スコア0
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2
せっかくなので、私も回答を書きます。
まず、大前提
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
1
もー… 回答者全員、何いってんだか意味がわからないんですが、
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
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
Q&Aの回答には、質問の解決につながる回答のみを投稿してください。 回答するために追加の情報が必要な場合等については、質問へのコメント欄からコメントするようにしてください。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
解決済
SyntaxError: Unexpected token < in JSON at position 0 のエラー対策がわからない
回答3
クリップ1
更新
2019/04/12
Q&A
解決済
画像が表示されません【Laravel】
回答1
クリップ0
更新
2023/08/26
Q&A
解決済
(ruby) bundle installが出来ません
回答1
クリップ0
更新
2023/08/02
Q&A
解決済
JSPでテーブルをラジオボタンで選択して削除したいのですが
回答1
クリップ0
更新
2017/07/27
Q&A
解決済
ajax通信の戻り値がソースコードになってしまう
回答2
クリップ0
更新
2023/08/19
Q&A
解決済
Laravelをherokuにデプロイしたが、データベースの作成方法がうまくいかない。
回答1
クリップ0
更新
2023/08/05
Q&A
解決済
投稿機能でカラムにデータ入れらずに投稿できません。
回答1
クリップ0
更新
2023/08/23
Q&A
Rails6でBlocked hostエラーが発生し、ググって出てきた対処法を試しても解消できない
回答1
クリップ0
更新
2023/08/18
同じタグがついた質問を見る
phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。
WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。
PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。