CRUDをより簡単に処理するためのクラスを作成しましたが、問題が発生しました。私の現在のクラスは、次の構文でクラッドを実行します。
$crud = Core::Db()->builder();
$userData =$crud
->select("city,adress")
->from('users')
->where('name')
->like(':name')
->read(array(':name','%stefan'));
crudメソッドを呼び出すと、SQLセンテンスが自動的に作成され、プライベート変数$this->sqlに挿入されます。write()はデータを準備し、準備されたステートメントをバインドします(存在する場合)。
最後の例では、次のSQLが生成されます。
$ this-sql = "SELECT city
、address
FROM users
WHERE name
LIKE:name";
すべてが完璧に機能します。:nameをバインドし、「%stefan」を追加します。大丈夫。
これが私の問題です。追加した場合:
$userData =$crud
->select("city,adress")
->from('users')
->where('name')
->like('%stefan')
->read();
戻り値 :
//bad syntax
$this->sql = "SELECT `city`,`address` FROM `users` WHERE `name` LIKE %stefan";
データに引用符を追加すると、2番目の例は正常に機能しますが、最初の例は失敗します。
// First example, bad sintax
$this-sql = "SELECT `city`,`address` FROM `users` WHERE `name` LIKE ':name'";
// Second example, good
$this-sql = "SELECT `city`,`address` FROM `users` WHERE `name` LIKE '%stefan' ";
私は解決策を考えていました...like()メソッド呼び出しに引用符を追加し、名前がwrite()でバインドされたバインドされたパラメーターの名前と等しい場合はストライプします。
private function write(array $input_parameters=array(),$style=NULL)
{
// clean possible errors in holders
foreach($input_parameters as $key => $value):
if(strpos($this->sql,"'".$key."'") !== FALSE)
$this->sql = str_replace("'".$key."'",$key,$this->sql);
if(strpos($this->sql,'"'.$key.'"') !== FALSE)
$this->sql = str_replace('"'.$key.'"',$key,$this->sql);
endforeach;
// .... code ....//
}
この場合、このソリューションは正常に機能しますが、次のようなものがある場合:
$userData =$crud
->select("id")
->from('blog')
->where('content')
->like(':word')
->_or('something')
->like(':word')
->read(array(':word','something'));
戻り値:
$this->sql = "SELECT `id` FROM `blog` WHERE `name` LIKE :word or `something` LIKE :word ";
これは実際の例ではありませんが、それが悪い解決策であると私が考える理由を示すためだけに、セキュリティリスクになる可能性があります。
安全な問題や破損したSQLなしでデータをバインドする方法を見つけることができません。ここで何かが恋しいです。
他に何か考えられますか?何か忘れた?私はパラノイアですか?今、頭がとても痛くて、人間のようには思えません。
あなたの助けは大歓迎です、ありがとう