контроллер представления модели — Как подготовить запросы в шаблоне фасада PHP MVC?

Как защитить приложение от внедрения 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.

0

Решение

Вы можете передать Запрос в одном параметре, а затем передать значения во втором параметре. Так, например, в вашем классе DBOperation измените function getAll($sQuery) в function ($sQuery,$sQData){}.

где $sQData это массив, содержащий все значения, которые вы собираетесь связать с вашим запросом. Затем просто свяжите ваш запрос и параметры и выполните свою функцию.

Чтобы вы могли определить $sQData лайк :

array("key1"=>"value1","key2"=>"value2","key3"=>"value3");

Затем выполните итерацию по вашему массиву, как:

foreach($sQData as $key=>$value){}
0

Другие решения

Хорошо, я наконец решил проблему, смешав разные ответы.

Запрос и способ его передачи классу, отвечающему за выполнение, выглядят следующим образом. Новички, как я, не ставьте цитаты вокруг 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);
}
0

По вопросам рекламы [email protected]