Как защитить приложение от внедрения SQL, используя подготовленные операторы для каждого запроса SQL.
У меня есть несколько классов «менеджера», которые обрабатывают запросы и вызывают статические методы из определенного класса, предназначенного для подключения к базе данных и выполнения запросов. Этот создает связь для каждого запроса и имеет несколько общих открытых статических методов getAll (), getOne (), exec () для обработки всех видов запросов.
Где я могу сделать операторы db-> prepare, BindParam и execute? Сторона класса менеджера, соединение не инициализировано, поэтому db-> prepare невозможно.
Сторона класса базы данных, метод являются общими, поэтому параметры являются переменными в зависимости от метода, вызывающего статический метод.
Чтобы иметь более четкое представление о том, что я пытаюсь объяснить здесь, вы можете увидеть мой код здесь: https://github.com/code-climber/car_rental/tree/master/src/car_rental/model/dao
Вы можете проверить, как я пишу свои SQL-запросы в CarManager.class.php и как они обрабатываются в DBOperation.class.php.
Я надеюсь, что эта проблема прояснит важные идеи в моем программировании на ООП PHP.
Вы можете передать Запрос в одном параметре, а затем передать значения во втором параметре. Так, например, в вашем классе DBOperation измените function getAll($sQuery)
в function ($sQuery,$sQData){}.
где $sQData
это массив, содержащий все значения, которые вы собираетесь связать с вашим запросом. Затем просто свяжите ваш запрос и параметры и выполните свою функцию.
Чтобы вы могли определить $sQData
лайк :
array("key1"=>"value1","key2"=>"value2","key3"=>"value3");
Затем выполните итерацию по вашему массиву, как:
foreach($sQData as $key=>$value){}
Хорошо, я наконец решил проблему, смешав разные ответы.
Запрос и способ его передачи классу, отвечающему за выполнение, выглядят следующим образом. Новички, как я, не ставьте цитаты вокруг VALUES
параметры:
$sQuery = 'INSERT INTO Clients (first_name, last_name, email, login, passwd) ';
$sQuery .= "VALUES (:firstName,:lastName,:email,:login,:saltedPasswd)";
$aQueryParams = array(':firstName' => $sFirstName,':lastName' => $sLastName,':email' => $sEmail,':login' => $sLogin,':saltedPasswd'=>$sPasswordSalted);
$bSuccess = DBOperation::exec($sQuery,$aQueryParams);
А теперь содержание exec()
метод в DBOperation
учебный класс.
public static function exec($sQuery,$aQueryParams){
self::init();
try {
$stmt = self::$oDataBase->prepare($sQuery);
$iAffectedRows = $stmt->execute($aQueryParams) or die(print_r(self::$oDataBase->errorInfo()));
} catch (PDOException $oPdoException) {
echo 'PDO Exception : ' . $oPdoException->getMessage();
}
return false !== $iAffectedRows;
}
Я не пользуюсь foreach()
цикл, потому что я прочитал, что я могу использовать массив параметров непосредственно в execute()
и если бы я должен был иметь дело, я должен использовать ссылку для bindParam()
как это :
foreach($aQueryParams as $key=>&$value){
$stmt->bindParam($key, $value);
}