pg4wpの続き

pg4wp

一部地域(横須賀西地区)で絶賛使用中の 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 とかが置換されちゃうので、こういう面倒臭いことをやってます。