По какой-то причине метод 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/