最終的に、プリペアドステートメントを明示的に使用できることがわかりました。
<?php
$query = array('OR' => array(
array(
'Post.title LIKE ?' => array(
'%' . $this->escapeLike('100%') . '%'),
),
),
array(
'Post.title LIKE ?' => array(
'%' . $this->escapeLike('red_apples') . '%'),
),
),
);
...または、DBMSにデフォルトの区切り文字がない場合、またはデフォルトの区切り記号を設定する場合は、次のようにします。
<?php
$separator = '|';
$query = array('OR' => array(
array(
'Post.title LIKE ? ESCAPE ?' => array(
'%' . $this->escapeLike('100%', $separator) . '%'),
$separator
),
),
array(
'Post.title LIKE ? ESCAPE ?' => array(
'%' . $this->escapeLike('red_apples', $separator) . '%'),
$separator
),
),
);
私のescapeLike()
方法は現在これです(それは決して難しい部分ではありませんでした):
/**
* Escapes LIKE wildcard characters
*
* @param string $text
* @param string $escape_character
* @return string
*/
protected function escapeLike ($text, $escape_character='\\') {
return strtr($text, array(
'%' => $escape_character . '%',
'_' => $escape_character . '_',
$escape_character => $escape_character . $escape_character,
));
}
簡単にするために実装しましAppModel
た(少なくとも私のプロジェクトでは)。
これは、MySQLアダプターを使用するCakePHP / 2.5で機能します(他のシナリオはわかりません)。