我创建了一个类来更轻松地处理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”;
一切都很完美。绑定:命名并添加'%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";
如果我在数据中添加引号,第二个示例将正常工作,但第一个示例将失败:
// 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损坏,我想念这里。
你能想到别的什么吗?我忘记了什么?我是偏执狂?现在我的脑袋疼得厉害,我不能像人一样思考。
欢迎您的帮助,谢谢