По какой-то причине метод AppModel->updateAll() не передает данные, переданные ему. Однако, просматривая документацию, я не могу найти ничего о том, как вы фактически удаляете данные с помощью CakePHP.
Вниз в datasources/dbo/dbo_mysql.php Я нашел метод value() который, кажется, просто использует mysql_real_escape_string() но как вы mysql_real_escape_string() доступ к этому методу из моделей?
Для большинства функций модели CakePHP вам не нужно беспокоиться об исключении ввода.
CakePHP уже защищает вас от SQL Injection, если вы используете:
- Методы ORM CakePHP (такие как
find()иsave()) плюс:- Правильная запись массива (т.
array('field' => $value)) вместо необработанного SQL.Для дезинфекции от XSS в целом лучше сохранить необработанный HTML в базе данных без изменений и дезинфекции во время вывода / отображения.
См. https://book.cakephp.org/2.0/en/core-utility-libraries/sanitize.html. Однако есть другие случаи, когда вам нужно запустить собственный SQL-запрос или подзапрос. В этих случаях вы можете:
$db->fetchAll( 'SELECT * from users where username = :username AND password = :password', ['username' => 'jhon','password' => '12345'] );
Model->getDataSource()->value() с помощью Model->getDataSource()->value() $sql = 'SELECT * FROM table WHERE name = ' . $this->MyModel->getDataSource()->value($untrustedInput, 'string') . ';'
Функция value() основном ускользает и добавляет такие кавычки:
"'" . mysql_real_escape_string($data, $this->MyModel->getDataSource()->connection) . "'"
Раньше это был вариант, но он устарел от CakePHP 2.4.
$name = "somename"; $db = $this->getDataSource(); $this->Model->query('SELECT * FROM models WHERE name = '.$db->value($name, 'string') . ';');
CakePHP заботится также о цитировании вашего ввода, потому что он помечен как строка.
SELECT * FROM models WHERE name = "somename";
Вот альтернативный способ делать вещи, используя Sanitize :: paranoid:
http://www.ibm.com/developerworks/opensource/library/os-php-cake3/