А я не хакер, мне не интересно ломать. Он у тебя не ломается, пока заказчик не скажет, что хочет произвольное имя... --- Добавлено --- Причём, я и не вызывался ломать. А в первом посте регулярок нету, так что там на раз-два всё ломается. --- Добавлено --- Кстати, если бы вы у меня собеседовались, и я увидел в коде переменную $familiya, на этом бы собеседование было окончено.
Резюмирую. Мой код верный и рабочий. А вы предлагаете написать тонны никому не нужного кода в надежде что к вам придёт д'Артаньян. Ждите и надейтесь.
@miltorg, подготовленные запросы добавляют к коду одну-две строчки. Вместо твоих потенциально дохрена (по количеству полей)
Внимательно прочитайте первоначальный пост: То есть я проверяю чтоб цифры - были цифрами и пр. Вы правда это не видите? --- Добавлено --- Мало того, в зависимости от результата - там не просто Вася Пупкин, вася Пупкин - это просто пример. Вы правда это не понимаете?
Так это и не один запрос, а 50000 запросов в рамках одной транзакции, впрочем, да, при таком раскладе mysqli исполняется быстрее, процентов аж на 15%. Другое дело, если чуть выпрямить руки (сам код попахивает, но чисто для примера сойдет): PHP: try { $db = new PDO("mysql:host=localhost;dbname=test", "root", ""); create($db); } catch (PDOException $e) { echo $e->getMessage(); } function create(PDO $db) { $db->exec("TRUNCATE TABLE names"); $time = microtime(true); $data = array('name' => 'John', 'age' => '25'); $insertStatement = $db->prepare('insert into names (name, age) values '.implode(',', array_fill(0, 50000, '(?, ?)'))); $db->beginTransaction(); $insertStatement->execute(array_merge([], ...array_fill(0, 50000, array_values($data)))); $db->commit(); echo microtime(true) - $time; } PHP: try { $db = new mysqli("localhost","root","","test"); create($db); } catch (Exception $e) { echo $e->getMessage(); } function create(mysqli $db) { $db->query("TRUNCATE TABLE names"); $time = microtime(true); $data = array('name' => 'John', 'age' => '33'); $insertStatement = $db->prepare('insert into names (name, age) values '.implode(',', array_fill(0, 30000, '(?, ?)'))); $db->autocommit(false); $db->begin_transaction(MYSQLI_TRANS_START_READ_WRITE); $insertStatement->bind_param(str_repeat('si', 30000), ...array_merge([], ...array_fill(0, 30000, array_values($data)))); $insertStatement->execute(); $db->commit(); echo microtime(true) - $time; } 0.5 секунд, против 2.3 секунд у mysqli. Такие дела.
Если что, я ни в коем случае не утверждаю, что одно лучше другого. Более того, я работаю с БД исключительно через ту или иную ORM и в большинстве случаев БД - это pgsql. Просто небольшой тест ради теста )
Причём я же не говорю, что не нужна валидация. Но валидация не для защиты от инъекций. Валидация для проверки соответствия введённых данных техническому заданию
То есть вместо одной регулярки длиной в 10 символов, ОДНОЙ! - Вы напишите тонны кода по защите от инъекций, а потом ещё тонны кода по валидации? Объедините это всё в функции и создадите специальный класс. Я правильно вас понял?
pdo эмулирует подготовленное выражение, на деле вышлет обычным сигналом/запросом. Поэтому при больших кол-вах данных информация может исказиться в пользу другого инструмента. Отключи эмулирование в PDO чтобы слал настоящие подготовленные запросы. Теоретически/логически - это так. В практике не проверял, так что могу ошибиться.
Помнится в одном проекте был файлик, где регулярных выражений было несколько сотен, при чем каждое - большая такая и длинная строка. Человек их написавший, пожалуй единственный кто знал регулярные выражения на самом деле из тех кто мне знаком )) Ну, лично я напишу примерно вот так: PHP: public function create(Request $request) { $this->validate($request, [ 'title' => 'required|string|unique:posts,title', 'content' => 'required|string' ]); $post = Post::create($request->only('title', 'content')); return new PostResuorce($post); } И это таки будет работать, при чем довольно гибко и правильно ))
Напишите пожалуйста полный код применительно к вышеизложенному заданию - тогда можно будет что-то сравнить. И чтоб можно было понять всю гениальность гибкости и правильности
Лень ) Но в целом, думаю, что так оно и есть, а так же что в реальном таске стоимость использования PDO по сравнению с временем выполнения приложения / запроса не существенна, за небольшим рядом исключений. Потому лучше использовать то что подходит под таск. --- Добавлено --- Так вот он, валидирует, создает, отдает ресурс. Примерно так я бы это и написал, если выкинуть бизнес-логику и те или иные требования по проекту.
Для защиты от инъекций не нужно тонны кода - достаточно подготовленного запроса в 3-4 строчки. А валидация - ну я не знаю, сколько будет строчек, и будут ли вообще, зависит от ТЗ. А это был у @romach полный код, только на фреймворке. Фреймворк всё, что необходимо сделает, для этого их и придумали --- Добавлено --- И в большинстве моих проектов этот момент выглядит точно так же
Во как надо - Мой Дартаньян уже превратился в бизнес-проект. - Хочу дивиденды! --- Добавлено --- Круть. То есть вместо регулярки в 10 символов вы подключаете не просто класс, а Фреймворк! Круть.
Ну у меня проект обычно реализует больше, чем одну форму для ввода имени, поэтому да, подключаю И это даёт мне роутинг, защиту от csrf, защиту от брутфорса и ещё кучу всяких плюшек, пользуйся не хочу. На самом деле, даже для маленьких проектов в две-три формы (такие тоже бывают) я сейчас обычно подключаю микрофреймворк Slim ради роутинга нормального. А что, большая проблема подключить фреймворк?
Бизнес-логика — в разработке информационных систем — совокупность правил, принципов, зависимостей поведения объектов предметной области. Вики. Более того, в рамках проекта их может быть несколько )
@miltorg, почему вместо? У тебя что, в проекте ничего кроме одной формы нету? Там всякие личные кабинеты, оплаты и прочее и прочее. А в случае со Slim, кстати, он ORM не содержит, и пишу через PDO подготовленные запросы, как тебе показали.