一部地域(横須賀西地区)で絶賛使用中の PostgreSQL for WordPress (PG4WP) ですが、まだいろいろと調整中です。
今回ぶち当たったのは、user-role-editorというプラグイン。
$getRolesQuery = "select option_id, option_value from $ure_OptionsTable where option_name='$option_name' limit 0, 1";
こいつが、こういうSQLを投げてくるわけで、別にどうってことないと思うんだけど、selectとか fromが小文字なのが PG4WP的にはNGらしい。
確かに WordPressのコアが吐き出す SQLはキーワードがすべて大文字になってるけど、これってたまたま? それともコーディング規約かなんかあるのかな?
解決方法は2種類あって、こんな風に大文字前提でハードコートしてあるところを striposに変えるなどして、ちまちま修正していく方法が1つ。
if( 0 === strpos($sql, 'SELECT'))
あと1つはそもそも SQLキーワードを小文字にしてくるからいけないじゃんということで、入力時点で SQLキーワードだけ大文字にしちゃう方法。
今回は直し漏れがあると嫌なので、速度優先じゃない方法、つまり入口で修正にしました。(スピードのかかり具合によっては変えるかも)
追記:早速問題があったので、stripos()、str_ireplace()を使う方法に変更。このタイミングで大文字変換しちゃうと、INSERTやUPDATE文の中身にも適応してしまうので、<script>の中の変数名が変わったりしてひどい目にあった。
// SQLキーワードが小文字で、先頭から始まっているパターンを置換 function sql_keywords1($value) { return "/^\b".strtolower($value)."\b/"; } // SQLキーワードが小文字で、文中にあるパターンを置換 function sql_keywords2($value) { return "/\s\b".strtolower($value)."\b/"; } function sql_keywords3($value) { return " ".$value; } function wpsql_query($sql) { : $sqlkeywords = array ("ABORT","ABS","ABSOLUTE","ACCESS","ACTION", ・・・ : : $sql = preg_replace(array_map(sql_keywords1, $sqlkeywords), $sqlkeywords, $sql); $sql = preg_replace(array_map(sql_keywords2, $sqlkeywords), array_map(sql_keywords3, $sqlkeywords), $sql);
無名関数でやるつもりだったんだけど、エラーが出たので深追いはせず、普通の関数で。
ただの単語単位(\b)を対象にすると $wdb->abort とかが置換されちゃうので、こういう面倒臭いことをやってます。