Как вставить несколько значений переключателей с помощью PHP OOP

Я работаю над CMS с PHP OOP. В этом проекте есть функция, позволяющая пользователям добавлять новый канал Telegram. Для этой функции я добавил эту форму, которая также содержит коды действий:

<?php if(isset($_POST['submit'])){ $token = $_POST['token']; $cat = $_POST['cat']; $ads = $_POST['ads']; $key = $_POST['keyboard']; $tel = new Telegram(); $notice = $tel->AddNew($token,$cat,$ads,$key); } ?> <div class='content-wrapper'> <section class='content-header'> <h1> Add New Telegram Account <small>You can add a new Telegram channel here</small> </h1> <ol class='breadcrumb'> <li class='active'>telegram.php</li> </ol> </section> <?php if($dataSet->GetLevel()==1) { echo " <section class='content'> <div class='row'> <div class='col-md-6'> <div class='box box-primary'> <div class='box-header with-border'> <h3 class='box-title'>Required Information</h3> </div> "; if(isset($notice['success_message'])){ echo " <div class='alert alert-success'> <strong>Hey!</strong> ".$notice['success_message'].". </div> "; } echo " <form role='form' method='POST' action=''> <div class='box-body'> <div class='form-group'> <label>Token Number</label> <input type='text' class='form-control' placeholder='Enter token' name='token' required> <a href='#' style='color:purple;'>Having problem while getting token</a> </div> <div class='form-group'> <label>Select Category</label> <select name='cat' class='form-control'> <option value='empty'>---</option> <option value='technology'>Technology</option> <option value='4fun'>Game & Fun</option> <option value='news'>News</option> <option value='tools'>Tools</option> <option value='learning'>Learning</option> <option value='traditional'>Traditional</option> <option value='media'>Media</option> </select> </div> <div class='form-group'> <div class='radio'> <label> <input type='radio' name='ads' id='optionsRadios1' value='on' checked> Set ads on</br> <input type='radio' name='ads' id='optionsRadios1' value='off'> Set ads off </label> </div> </div> <div class='form-group'> <div class='checkbox'> <label> <input type='checkbox' name='keyboard' value='with_keyboard'> Use dedicated keyboard for this bot </label></br> <label> <input type='checkbox' name='keyboard' value='without_keyboard'> Show keyboard at groups </label></br> <label> <input type='checkbox' name='answer' value='answer_messages_chats' checked> In private chats, just anwser the pre defined messages </label></br> <label> <input type='checkbox' name='answer' value='answer_messages_groups' checked> In groups, just answer the pre defined messages </label> </div> </div> </div> <div class='box-footer'> Visit <a href='https://zite.pouyavagefi.com/documentation/telegram.php'>Telegram</a> Social Media Documentation. </div> <div class='box-footer'> <button name='submit' type='submit' class='btn btn-primary'>Submit</button> </div> </form> </div> </div> </div> </section> "; }else{ echo " <section class='content'> <div class='alert alert-warning'> <strong>Access Denied!</strong> You don\'t have permission to access this page. </div> </section> "; } ?> </div> 

Как вы можете наверху, я назвал класс, который называется Telegram.class.php и этот класс выглядит следующим образом:

  <?php class Telegram { protected $notice = array(); private $db; public function __construct() { $this->db = new Connection(); $this->db = $this->db->dbConnect(); } public function AddNew($token,$cat,$ads,$key) { if(!empty($token)&&!empty($cat)&&!empty($ads)) { for ($i=0;$i<sizeof($ads);$i++) { for ($i=0;$i<sizeof($key);$i++) { $new = $this->db->prepare("INSERT INTO channels (token_number, category_name, ads_set, keyboard_status) VALUES (?, ?, "/*.$ads[$i].*/", "/*.$key[$i].*/")"); $new->bindParam(1,$token); $new->bindParam(2,$cat); $new->bindParam(3,$ads); $new->bindParam(4,$key); $new->execute(); $notice['success_message'] = "New Telegram Channel was successfully added"; return $this->notice; } } } } public function getNotice() { return $this->notice; } } ?> 

Поскольку я хочу добавить несколько таблиц в таблицу, я использовал это для цикла внутри метода Add_New (согласно этому qeustion ):

 for ($i=0;$i<sizeof($ads);$i++) { for ($i=0;$i<sizeof($key);$i++) { $new = $this->db->prepare("INSERT INTO channels (token_number, category_name, ads_set, keyboard_status) VALUES (?, ?, "/*.$ads[$i].*/", "/*.$key[$i].*/")"); $new->bindParam(1,$token); $new->bindParam(2,$cat); $new->bindParam(3,$ads); $new->bindParam(4,$key); $new->execute(); $notice['success_message'] = "New Telegram Channel was successfully added"; return $this->notice; } } 

Я знаю, что это не правильно, но я не знаю, как правильно добавить эти переменные $ ads [$ i] и $ key [$ i] в инструкцию insert

Поэтому, если вы знаете, как это сделать в правильном порядке, пожалуйста, дайте мне знать .. спасибо!

Просто используйте imode и взорвите функции PHP. Сохраняя данные, взломайте их следующим образом:

 $key = implode(", ", $_POST['keyboard']); $tel = new Telegram(); $notice = $tel->AddNew($token,$cat,$ads,$key); 

Заменить первый параметр implode "," в соответствии с вашими потребностями.

Для отображения используйте взрыв, как показано ниже: $ id = explode (",", $ DbRes-> клавиатура);

Как только вы преобразуете массив в строку, вам не понадобится цикл внутри вашего класса. См. Обновленный код класса, как показано ниже:

 <?php class Telegram { protected $notice = array(); private $db; public function __construct() { $this->db = new Connection(); $this->db = $this->db->dbConnect(); } public function AddNew($token,$cat,$ads,$key) { if(!empty($token)&&!empty($cat)&&!empty($ads)) { $new = $this->db->prepare("INSERT INTO channels (token_number, category_name, ads_set, keyboard_status) VALUES (?, ?, ".$ads.", ".$key.")"); $new->bindParam(1,$token); $new->bindParam(2,$cat); $new->bindParam(3,$ads); $new->bindParam(4,$key); $new->execute(); $notice['success_message'] = "New Telegram Channel was successfully added"; return $this->notice; } } public function getNotice() { return $this->notice; } } ?> 

Это поможет вам понять ваше понимание. Вам нужно преобразовать Array в строку, чтобы база данных mysql могла ее хранить. Этот пост также может быть полезен: сохранить PHP-массив в MySQL?

Использовать конструктор

Во-первых, ваша функция addNew действительно может быть прочитана как «создать новый экземпляр этого объекта», что действительно является задачей __construct . Другая проблема заключается в том, что объект Telegram должен создавать несколько экземпляров. Однако вызов $tel = new Telegram(); подразумевает один и только один экземпляр объекта. Поэтому ваши вложенные петли должны принадлежать странице сценария, os, противоположной внутри объекта.

Рефакторинг подключения к базе данных

В настоящее время соединение с базой данных инициализируется внутри объекта. Теперь ваш объект имеет две обязанности: управление телеграммой и связь с базой данных. Я бы предложил создать объект соединения вне Telegram и, чтобы как можно объективнее, передать его объекту. Этот ответ очень хорошо объясняет эту часть.

Нарушение некоторых функций

Прямо сейчас конструктор объекта выполняет две вещи: создает экземпляр объекта и сохраняет его в базе данных. В идеале вы хотели бы, чтобы эти два процесса были отделены друг от друга. Это позволяет вам создать экземпляр Telegram и выполнить проверку на нем до его сохранения в базе данных, оставив ваш конструктор красивым и чистым.

Класс телеграмм:

 <?php class Telegram { protected $notice = ''; private $_token; private $_cat; private $_ads; private $_key public function __construct($token, $cat, $ads, $key) { $this->_token = $token; $this->_cat = $cat; $this->_ads = $ads; $this->_key = $key; } public function saveToDb(PDO $con) { $new = $this->con->prepare("INSERT INTO channels (token_number, category_name, ads_set, keyboard_status) VALUES (?, ?, "/*.$ads[$i].*/", "/*.$key[$i].*/")"); $new->bindParam(1,$this->_token); $new->bindParam(2,$this->_cat); $new->bindParam(3,$this->_ads); $new->bindParam(4,$this->_key); $new->execute(); $this->notice['success_message'] = "New Telegram Channel was successfully added"; return $this->notice; } public function getNotice() { return $this->notice; } public function getToken() { return $this->_token; } public function getCat() { return $this->_cat; } public function getAds() { return $this->_ads; } public function getKey() { return $this->_key; } } ?> 

Сценарий формы:

 <?php if(isset($_POST['submit'])){ $db = new Connection(); $db = $this->db->dbConnect(); $token = $_POST['token']; $cat = $_POST['cat']; $ads = $_POST['ads']; $key = $_POST['keyboard']; $notices = array(); if(!empty($token)&&!empty($cat)&&!empty($ads)) { for ($i=0; $i < count($this->_ads); $i++) { for ($j=0; $j < count($this->_key);$j++) { $tel = new Telegram($token, $cat, $ads[$i], $key[$j]); $notices[] = $tel->saveToDb($db); // keep a notice for each object created } } } } ?> <div class='content-wrapper'> /* ... */