Я работаю над 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'> /* ... */