Делаю второе задание отсюда http://theory.phphtml.net/tasks/php/practice/praktika-php-dlya-novichkov.html PHP: <?php /*Функция. которая в будующем обеспечит нам запрос в БД*/ function Zapros($host,$user,$password,$db_name,$table) { //Соединяемся с базой данных используя наши доступы: $link = mysqli_connect($host, $user, $password, $db_name) or die(mysqli_error($link)); //Устанавливаем кодировку (не обязательно, но поможет избежать проблем): mysqli_query($link, "SET NAMES 'utf8'"); //ВЫБРАТЬ все_столбцы ИЗ workers ГДЕ ад_ди_больше_нуля (т.е. все) $query = "SELECT * FROM ".$table." WHERE id > 0"; //Делаем запрос к БД, результат запроса пишем в $result: $result = mysqli_query($link, $query) or die(mysqli_error($link)); //Преобразуем то, что отдала нам база в нормальный массив PHP $data: for ($data = []; $row = mysqli_fetch_assoc($result); $data[] = $row) ; return $data; } /*Функция. которая в будующем обеспечит нам запрос в БД*/ /* Функция вывода пяти элементов*/ function VivodPiati($p1,$p2,$p3,$p4,$p5) { { ?> <div class="row align-items-center justify-content-center"> <div class="col-md-2 center-top" style="border-color:#36c7c7;border-style: solid"><?php echo $p1 ?></div> <div class="col-md-2"style="border-color:#36c7c7;border-style: solid" ><?php echo $p2 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p3 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p4 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p5 ?></div> </div> <?php } } /* Функция вывода пяти элементов*/ /*Функция удаления*/ function Deleted($host,$user,$password,$db_name,$table,$del_id) { //Соединяемся с базой данных используя наши доступы: $link = mysqli_connect($host, $user, $password, $db_name) or die(mysqli_error($link)); //Устанавливаем кодировку (не обязательно, но поможет избежать проблем): mysqli_query($link, "SET NAMES 'utf8'"); $query = "DELETE FROM ".$table." WHERE id=".$del_id." "; //Делаем запрос к БД, результат запроса пишем в $result: $result = mysqli_query($link, $query) or die(mysqli_error($link)); } /*Функция удаления*/ /*Функция для активного элемента*/ function Najat($del_id){ { ?> <form action="", method="GET"> <button tupe="submit" name="10" value="<?php $del_id ?>">Удалить</button> </form> <?php } } /*Функция для активного элемента/ /*Выводим таблицу*/ if (isset($_REQUEST['10'])) { Deleted('localhost', 'root', '', 'test', 'workers', $_REQUEST['10']); } VivodPiati('id','Имя','Возраст','Зарплата','Удаление'); foreach(Zapros('localhost','root','','test','workers') as $elem){ VivodPiati($elem['id'],$elem['name'],$elem['age'],$elem['salary'],Najat($elem['id'])); } /*Выводим таблицу*/ ?> Только получатся вот так https://yadi.sk/i/fKMa0JA13acoG9 К тому-же у всех кнопок пустые value. Знает кто. что я делаю не так ?
для начала вам необходимо забыть дорогу на theory.phphtml.net за такой код которому эти "теоретики" (вот в этом моменте очень сильно хочется ругаться матом) вас учат надо расстреливать деревянными пулями
@Taktreba, для начинающих говнокодеров, согласен, туда и дорога. Для всех остальных есть книги Котерова, Симдянова и тд. Устанавливать соединение с БД в каждой функции - это преступление, начинающим это не понять, а они мало того еще этому и учат.
я вот подумал, а есть ли начинающие "не говно кодеры"? типо пишет ооочень мало и всего одну функцию в неделю, зато просто божественно =)) с гениальной архитектурой и учетом всех подводных камней, и продумыванием всего что только можно наперед, такие себе гении-джуны =)))
@Taktreba, не надо утрировать, когда начинающий пишет подобного рода код своим умом это простительно, но когда такому учат на тематическом ресурсе это преступление. --- Добавлено --- @Taktreba, хотя может я и слегка погорячился, просто код меня возмутил до глубины души , сейчас внимательнее гляну чему там учат --- Добавлено --- @Алексей Др, дайте пожалуйста ссылку на то, где вас научили писать такие функции с запросами к БД.
@Алексей Др, понятно, а завернуть запросы в функции я так понимаю была ваша идея. Так делать нельзя, соединение с БД нужно устанавливать при необходимости один раз за скрипт, и желательно закрывать сразу после получения всех данных, для обучения это не критично, но привыкать к хорошему тону программирования лучше сразу.
И ещё, когда я функцию "Najat" записываю в виде Код (Text): function VivodPiati($p1,$p2,$p3,$p4,$p5) { { ?> <div class="row align-items-center justify-content-center"> <div class="col-md-2 center-top" style="border-color:#36c7c7;border-style: solid"><?php echo $p1 ?></div> <div class="col-md-2"style="border-color:#36c7c7;border-style: solid" ><?php echo $p2 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p3 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p4 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo Najat($p5) ?></div> </div> <?php } } VivodPiati($elem['id'],$elem['name'],$elem['age'],$elem['salary'], $elem['id']); Оно нормально в таблицу встает. Может знает кто, как записать переменную в качестве функции.
P.S. Корректность идентификатора перед его вставкой в запрос нигде не проверяется. Проверяется только существование параметра. --- Добавлено --- Ф-ция сама по себе делает вывод. Лепить дополнительно echo без надобности. --- Добавлено --- Либо сделайте в ф-ции возврат «обогащенного» контента, а не его вывод.
Так прописать будет адекватнее ? Код (Text): $host = 'localhost'; //имя хоста, на локальном компьютере это localhost $user = 'root'; //имя пользователя, по умолчанию это root $password = ''; //пароль, по умолчанию пустой $db_name = 'test'; //имя базы данных $table ='workers'; //Соединяемся с базой данных используя наши доступы: $link = mysqli_connect($host, $user, $password, $db_name) or die(mysqli_error($link)); //Устанавливаем кодировку (не обязательно, но поможет избежать проблем): mysqli_query($link, "SET NAMES 'utf8'"); //ВЫБРАТЬ все_столбцы ИЗ workers ГДЕ ад_ди_больше_нуля (т.е. все) $query = "SELECT * FROM ".$table." WHERE id > 0"; //Делаем запрос к БД, результат запроса пишем в $result: $result = mysqli_query($link, $query) or die(mysqli_error($link)); //Преобразуем то, что отдала нам база в нормальный массив PHP $data: for ($data = []; $row = mysqli_fetch_assoc($result); $data[] = $row) ; foreach($data as $elem){ VivodPiati($elem['id'],$elem['name'],$elem['age'],$elem['salary'], $elem['id']); }
А всё так, есть ли способ прописать в таком виде Код (Text): function VivodPiati($p1,$p2,$p3,$p4,$p5) { { ?> <div class="row align-items-center justify-content-center"> <div class="col-md-2 center-top" style="border-color:#36c7c7;border-style: solid"><?php echo $p1 ?></div> <div class="col-md-2"style="border-color:#36c7c7;border-style: solid" ><?php echo $p2 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p3 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p4 ?></div> <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p5 ?></div> </div> <?php } } VivodPiati('id','Имя','Возраст','Зарплата','Удаление'); foreach($data as $elem){ VivodPiati($elem['id'],$elem['name'],$elem['age'],$elem['salary'], Najat($elem['id'])); } так. что-бы функция кнопку строку вставляля. а не фигачила над ней, оставляя столбец пустым.
Обычно взаимодействие с БД и работу с разметкой разносят совсем по разным местам. Т.е. чтобы они и близко не стояли. --- Добавлено --- Я вам три способа назвал. Мало?
Раз https://php.ru/manual/control-structures.alternative-syntax.html Два https://php.ru/manual/language.types.string.html#language.types.string.syntax.heredoc PHP: function f($p1,$p2,$p3,$p4,$p5) { // Литералы не обязательны, но так легче читать $html = <<<HTML <div class="row"> <div>{$p1}</div> <div>{$p2}</div> <div>{$p3}</div> <div>{$p4}</div> <div>{$p5}</div> </div> HTML; return $html; } /// <body> <?= f(1,2,3,4,5,6) ?> </body> ///
При нынешней форме запроса в БД данные обновляются только если перезагрузить страницу. Пробовал прописать в Delete header("Refresh:0");, но страница теперь постоянно обновляется стоит что-то удалить. Есть ли способ опустошить $_REQUEST['10'] когда запрос уже сделали ?
@Алексей Др, вот примерно так должен выглядеть код Спойлер PHP: <?php // Включаем отображение ошибок в браузере error_reporting(E_ALL); ini_set('display_errors', 'On'); // Модель // Параметры подключения к базе данных define('DB_HOST', 'localhost'); define('DB_USER', 'mysql'); define('DB_PASSWORD', 'mysql'); define('DB_NAME', 'test'); // Функция подключения к базе данных // можно вынести в отдельный файл вместе с параметрами подключения // и подключать в скриптахпри помощи require_once function connectDB(){ $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME); if(!$conn){ echo 'Невозможно подключиться к серверу базы данных <br />'; die(mysqli_error()); }else{ $query = $conn->query('set names utf8'); if(!$query){ echo 'Невозможно установить кодировку подключения к базе данных'; die(mysqli_error()); }else{ return $conn; } } } // Функция инициализации таблицы function iniTable($rdb){ mysqli_query($rdb, "CREATE TABLE IF NOT EXISTS `test`.`workers` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `name` VARCHAR(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `age` INT(3) NOT NULL , `salary` DECIMAL(6,2) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;") or die ("Ошибка создания таблицы: ".mysqli_error()); mysqli_query($rdb, "TRUNCATE TABLE `test`.`workers`") or die ("Ошибка очистки таблицы: ".mysqli_error()); mysqli_query($rdb, "INSERT INTO `test`.`workers` (`id`, `name`, `age`, `salary`) VALUES (NULL, 'Дима', 23, 400), (NULL, 'Петя', 25, 500), (NULL, 'Вася', 23, 500), (NULL, 'Коля', 30, 1000), (NULL, 'Иван', 27, 500), (NULL, 'Кирилл', 28, 1000)") or die ("Ошибка добавления данных в таблицу: ".mysqli_error()); header("Location: ".$_SERVER['PHP_SELF']); } // Функция удаления пользователя из базы данных function delUser($rdb = NULL, $id = NULL){ // проверяем указатель ресурса соединения с базой данных // и идентификатор строки // возвращаем false в случае отсутвия указателя или идентификатора if(!$rdb || !$id) return false; // Собираем запрос, указываем LIMIT на всякий пожарный $query = "DELETE FROM `workers` WHERE id = ".$id." LIMIT 1"; // Выполняем запрос к базе данных $req = mysqli_query($rdb, $query) or die(mysqli_error()); if($req){ header("Location: ".$_SERVER['PHP_SELF']); }else{ return false; } } // Функция выборки значений из базы данных и формирования таблицы function selectTable($rdb = NULL, $where = NULL, $order = NULL, $limit = NULL){ $table = ''; if(!$rdb) return '<tr class="table-danger"><td colspan="6"><h3>Отсутсвует указатель ресурса соединения с базой данных</h3></td></tr>'; $query = "SELECT * FROM `workers`".$where.$order.$limit; //echo $query; $req = mysqli_query($rdb, $query); if($req){ if(mysqli_num_rows($req) > 0){ while($row = mysqli_fetch_assoc($req)){ $table .= '<tr>'; $table .= '<td><input type="checkbox" name="check[]" value="'.$row['id'].'"></td>'; $table .= '<td>'.$row['id'].'</td><td>'.$row['name'].'</td><td>'.$row['age'].'</td><td>'.$row['salary'].'</td>'; $table .= '<td><a href="?del='.$row['id'].'">Удалить</a>'; $table .= '</tr>'; } return $table; } }else{ return '<tr class="table-danger"><td colspan="6"><h3>Ошибка выполнения запроса к базе данных</h3></td></tr>'; } } // Контроллер // Устанавливаем соединение с базой данных $link = connectDB(); // Обработка переменной инициализации таблицы if(isset($_GET['ini'])){ iniTable($link); } // Обработка переменной удаления работника if(isset($_GET['del']) && !empty($_GET['del'])){ $userId = (int)$_GET['del']; $userId = mysqli_real_escape_string($link, $userId); delUser($link, $userId); } // Задаём сортировку по умолчанию для нашей таблицы $order = ' ORDER BY id'; // Фрмируем таблицу $table = ''; $table .= selectTable($link,NULL,$order); // Закрываем соединение с базой данных mysqli_close($link); // html шаблон ?> <!DOCTYPE html> <html> <head> <meta charset='UTF-8' /> <link rel="stylesheet" href="bootstrap.min.css"> </head> <body> <div class="container"> <div><h1>Таблица работников</h1></div> <table class="table table-bordered table-striped"> <thead class="thead-dark"> <tr> <th><input type="checkbox" name="check" value="all"></th> <th>id</th> <th>name</th> <th>age</th> <th>salary</th> <th>action</th> </tr> </thead> <tbody> <?php echo $table;?> </tbody> </table> <div><h5><a href="?ini=1">Создать и заполнить таблицу</a></h3></div> </div> </body> </html>