За последние 24 часа нас посетили 18935 программистов и 1618 роботов. Сейчас ищут 916 программистов ...

Проблема с автоматическим выводом кнопок

Тема в разделе "PHP для новичков", создана пользователем Алексей Др, 28 авг 2018.

  1. Алексей Др

    Алексей Др Новичок

    С нами с:
    28 авг 2018
    Сообщения:
    36
    Симпатии:
    0
    Делаю второе задание отсюда

    http://theory.phphtml.net/tasks/php/practice/praktika-php-dlya-novichkov.html

    PHP:
    1. <?php
    2. /*Функция. которая в будующем обеспечит нам запрос в БД*/
    3. function Zapros($host,$user,$password,$db_name,$table)
    4. {
    5. //Соединяемся с базой данных используя наши доступы:
    6.     $link = mysqli_connect($host, $user, $password, $db_name) or die(mysqli_error($link));
    7.  
    8. //Устанавливаем кодировку (не обязательно, но поможет избежать проблем):
    9.     mysqli_query($link, "SET NAMES 'utf8'");
    10.     //ВЫБРАТЬ все_столбцы ИЗ workers ГДЕ ад_ди_больше_нуля (т.е. все)
    11.     $query = "SELECT * FROM ".$table." WHERE id > 0";
    12.  
    13.     //Делаем запрос к БД, результат запроса пишем в $result:
    14.     $result = mysqli_query($link, $query) or die(mysqli_error($link));
    15.  
    16.     //Преобразуем то, что отдала нам база в нормальный массив PHP $data:
    17.     for ($data = []; $row = mysqli_fetch_assoc($result); $data[] = $row) ;
    18.  
    19.    return $data;
    20. }
    21. /*Функция. которая в будующем обеспечит нам запрос в БД*/
    22. /* Функция вывода пяти элементов*/
    23. function VivodPiati($p1,$p2,$p3,$p4,$p5)
    24. {
    25.     {
    26.         ?>
    27.         <div class="row align-items-center justify-content-center">
    28.             <div class="col-md-2 center-top" style="border-color:#36c7c7;border-style: solid"><?php echo $p1 ?></div>
    29.             <div class="col-md-2"style="border-color:#36c7c7;border-style: solid" ><?php echo $p2 ?></div>
    30.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p3 ?></div>
    31.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p4 ?></div>
    32.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p5 ?></div>
    33.         </div>
    34.         <?php
    35.     }
    36. }
    37. /* Функция вывода пяти элементов*/
    38. /*Функция удаления*/
    39. function Deleted($host,$user,$password,$db_name,$table,$del_id)
    40. {
    41. //Соединяемся с базой данных используя наши доступы:
    42.     $link = mysqli_connect($host, $user, $password, $db_name) or die(mysqli_error($link));
    43.  
    44. //Устанавливаем кодировку (не обязательно, но поможет избежать проблем):
    45.     mysqli_query($link, "SET NAMES 'utf8'");
    46.  
    47.     $query = "DELETE FROM ".$table." WHERE id=".$del_id." ";
    48.  
    49.     //Делаем запрос к БД, результат запроса пишем в $result:
    50.     $result = mysqli_query($link, $query) or die(mysqli_error($link));
    51.  
    52. }
    53. /*Функция удаления*/
    54. /*Функция для активного элемента*/
    55. function Najat($del_id){
    56.     {
    57.         ?>
    58.         <form action="", method="GET">
    59.         <button tupe="submit" name="10" value="<?php $del_id ?>">Удалить</button>
    60.         </form>
    61.  
    62.         <?php
    63.     }
    64. }
    65. /*Функция для активного элемента/
    66.  
    67. /*Выводим таблицу*/
    68. if (isset($_REQUEST['10'])) {
    69.     Deleted('localhost', 'root', '', 'test', 'workers', $_REQUEST['10']);
    70. }
    71. VivodPiati('id','Имя','Возраст','Зарплата','Удаление');
    72. foreach(Zapros('localhost','root','','test','workers') as $elem){
    73.     VivodPiati($elem['id'],$elem['name'],$elem['age'],$elem['salary'],Najat($elem['id']));
    74. }
    75. /*Выводим таблицу*/
    76.  
    77.  
    78. ?>
    Только получатся вот так

    https://yadi.sk/i/fKMa0JA13acoG9

    К тому-же у всех кнопок пустые value. Знает кто. что я делаю не так ?
     
    #1 Алексей Др, 28 авг 2018
    Последнее редактирование модератором: 28 авг 2018
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    для начала вам необходимо забыть дорогу на theory.phphtml.net
    за такой код которому эти "теоретики" (вот в этом моменте очень сильно хочется ругаться матом) вас учат надо расстреливать деревянными пулями
     
  3. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    не нужно забывать туда дорогу, очень полезный ресурс для тех кто "только начал" свой путь в рнр.
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Taktreba, для начинающих говнокодеров, согласен, туда и дорога. Для всех остальных есть книги Котерова, Симдянова и тд. Устанавливать соединение с БД в каждой функции - это преступление, начинающим это не понять, а они мало того еще этому и учат.
     
  5. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    я вот подумал, а есть ли начинающие "не говно кодеры"? типо пишет ооочень мало и всего одну функцию в неделю, зато просто божественно =)) с гениальной архитектурой и учетом всех подводных камней, и продумыванием всего что только можно наперед, такие себе гении-джуны =)))
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Taktreba, не надо утрировать, когда начинающий пишет подобного рода код своим умом это простительно, но когда такому учат на тематическом ресурсе это преступление.
    --- Добавлено ---
    @Taktreba, хотя может я и слегка погорячился, просто код меня возмутил до глубины души
    , сейчас внимательнее гляну чему там учат :)
    --- Добавлено ---
    @Алексей Др, дайте пожалуйста ссылку на то, где вас научили писать такие функции с запросами к БД.
     
    Taktreba нравится это.
  7. Алексей Др

    Алексей Др Новичок

    С нами с:
    28 авг 2018
    Сообщения:
    36
    Симпатии:
    0
  8. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Алексей Др, понятно, а завернуть запросы в функции я так понимаю была ваша идея. Так делать нельзя, соединение с БД нужно устанавливать при необходимости один раз за скрипт, и желательно закрывать сразу после получения всех данных, для обучения это не критично, но привыкать к хорошему тону программирования лучше сразу.
     
  9. Алексей Др

    Алексей Др Новичок

    С нами с:
    28 авг 2018
    Сообщения:
    36
    Симпатии:
    0
    А как его закрыть после получения данных ?
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    По первой ссылке – удаление записей по GET – это путь как раз в те самые кодеры.
     
  11. Алексей Др

    Алексей Др Новичок

    С нами с:
    28 авг 2018
    Сообщения:
    36
    Симпатии:
    0
    И ещё, когда я функцию "Najat" записываю в виде
    Код (Text):
    1. function VivodPiati($p1,$p2,$p3,$p4,$p5)
    2. {
    3.     {
    4.         ?>
    5.         <div class="row align-items-center justify-content-center">
    6.             <div class="col-md-2 center-top" style="border-color:#36c7c7;border-style: solid"><?php echo $p1 ?></div>
    7.             <div class="col-md-2"style="border-color:#36c7c7;border-style: solid" ><?php echo $p2 ?></div>
    8.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p3 ?></div>
    9.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p4 ?></div>
    10.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo Najat($p5) ?></div>
    11.         </div>
    12.         <?php
    13.     }
    14. }
    15.  
    16. VivodPiati($elem['id'],$elem['name'],$elem['age'],$elem['salary'], $elem['id']);
    Оно нормально в таблицу встает. Может знает кто, как записать переменную в качестве функции.
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    P.S. Корректность идентификатора перед его вставкой в запрос нигде не проверяется. Проверяется только существование параметра.
    --- Добавлено ---
    Ф-ция сама по себе делает вывод. Лепить дополнительно echo без надобности.
    --- Добавлено ---
    Либо сделайте в ф-ции возврат «обогащенного» контента, а не его вывод.
     
  13. Алексей Др

    Алексей Др Новичок

    С нами с:
    28 авг 2018
    Сообщения:
    36
    Симпатии:
    0
    Так прописать будет адекватнее ?
    Код (Text):
    1. $host = 'localhost'; //имя хоста, на локальном компьютере это localhost
    2. $user = 'root'; //имя пользователя, по умолчанию это root
    3. $password = ''; //пароль, по умолчанию пустой
    4. $db_name = 'test'; //имя базы данных
    5. $table ='workers';
    6.  
    7. //Соединяемся с базой данных используя наши доступы:
    8.     $link = mysqli_connect($host, $user, $password, $db_name) or die(mysqli_error($link));
    9.  
    10. //Устанавливаем кодировку (не обязательно, но поможет избежать проблем):
    11.     mysqli_query($link, "SET NAMES 'utf8'");
    12.     //ВЫБРАТЬ все_столбцы ИЗ workers ГДЕ ад_ди_больше_нуля (т.е. все)
    13.     $query = "SELECT * FROM ".$table." WHERE id > 0";
    14.  
    15.     //Делаем запрос к БД, результат запроса пишем в $result:
    16.     $result = mysqli_query($link, $query) or die(mysqli_error($link));
    17.  
    18.     //Преобразуем то, что отдала нам база в нормальный массив PHP $data:
    19.     for ($data = []; $row = mysqli_fetch_assoc($result); $data[] = $row) ;
    20.  
    21. foreach($data as $elem){
    22.     VivodPiati($elem['id'],$elem['name'],$elem['age'],$elem['salary'], $elem['id']);
    23. }
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    P.S. Проще всего совсем избавиться от ф-ции Najat.
     
  15. Алексей Др

    Алексей Др Новичок

    С нами с:
    28 авг 2018
    Сообщения:
    36
    Симпатии:
    0
    А всё так, есть ли способ прописать в таком виде
    Код (Text):
    1. function VivodPiati($p1,$p2,$p3,$p4,$p5)
    2. {
    3.     {
    4.         ?>
    5.         <div class="row align-items-center justify-content-center">
    6.             <div class="col-md-2 center-top" style="border-color:#36c7c7;border-style: solid"><?php echo $p1 ?></div>
    7.             <div class="col-md-2"style="border-color:#36c7c7;border-style: solid" ><?php echo $p2 ?></div>
    8.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p3 ?></div>
    9.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p4 ?></div>
    10.             <div class="col-md-2" style="border-color:#36c7c7;border-style: solid"><?php echo $p5 ?></div>
    11.         </div>
    12.         <?php
    13.     }
    14. }
    15.  
    16. VivodPiati('id','Имя','Возраст','Зарплата','Удаление');
    17. foreach($data as $elem){
    18.     VivodPiati($elem['id'],$elem['name'],$elem['age'],$elem['salary'], Najat($elem['id']));
    19. }
    так. что-бы функция кнопку строку вставляля. а не фигачила над ней, оставляя столбец пустым.
     
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Обычно взаимодействие с БД и работу с разметкой разносят совсем по разным местам. Т.е. чтобы они и близко не стояли.
    --- Добавлено ---
    Я вам три способа назвал. Мало?
     
  17. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Раз https://php.ru/manual/control-structures.alternative-syntax.html
    Два https://php.ru/manual/language.types.string.html#language.types.string.syntax.heredoc
    PHP:
    1. function f($p1,$p2,$p3,$p4,$p5) {
    2. // Литералы не обязательны, но так легче читать
    3.    $html = <<<HTML
    4.     <div class="row">
    5.        <div>{$p1}</div>
    6.        <div>{$p2}</div>
    7.        <div>{$p3}</div>
    8.        <div>{$p4}</div>
    9.        <div>{$p5}</div>
    10.     </div>
    11. HTML;
    12.  
    13. return $html;
    14. }
    15.  
    16. ///
    17. <body>
    18. <?= f(1,2,3,4,5,6) ?>
    19. </body>
    20. ///
     
  18. Алексей Др

    Алексей Др Новичок

    С нами с:
    28 авг 2018
    Сообщения:
    36
    Симпатии:
    0
    При нынешней форме запроса в БД данные обновляются только если перезагрузить страницу. Пробовал прописать в Delete
    header("Refresh:0");, но страница теперь постоянно обновляется стоит что-то удалить. Есть ли способ опустошить
    $_REQUEST['10'] когда запрос уже сделали ?
     
  19. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Алексей Др, вот примерно так должен выглядеть код
    PHP:
    1. <?php
    2. // Включаем отображение ошибок в браузере
    3. ini_set('display_errors', 'On');
    4.  
    5. // Модель
    6.  
    7. // Параметры подключения к базе данных
    8. define('DB_HOST', 'localhost');
    9. define('DB_USER', 'mysql');
    10. define('DB_PASSWORD', 'mysql');
    11. define('DB_NAME', 'test');
    12.  
    13. // Функция подключения к базе данных
    14. // можно вынести в отдельный файл вместе с параметрами подключения
    15. // и подключать в скриптахпри помощи require_once
    16. function connectDB(){
    17.     $conn = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
    18.     if(!$conn){
    19.         echo 'Невозможно подключиться к серверу базы данных <br />';
    20.         die(mysqli_error());
    21.     }else{
    22.         $query = $conn->query('set names utf8');
    23.         if(!$query){
    24.             echo 'Невозможно установить кодировку подключения к базе данных';
    25.             die(mysqli_error());
    26.         }else{
    27.             return $conn;
    28.         }
    29.     }
    30. }
    31.  
    32. // Функция инициализации таблицы
    33. function iniTable($rdb){
    34.     mysqli_query($rdb, "CREATE TABLE IF NOT EXISTS `test`.`workers` (
    35.                    `id` INT(11) NOT NULL AUTO_INCREMENT ,
    36.                    `name` VARCHAR(15) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    37.                    `age` INT(3) NOT NULL ,
    38.                    `salary` DECIMAL(6,2) NOT NULL ,
    39.                    PRIMARY KEY (`id`)) ENGINE = InnoDB;")
    40.         or die ("Ошибка создания таблицы: ".mysqli_error());
    41.        
    42.     mysqli_query($rdb, "TRUNCATE TABLE `test`.`workers`")
    43.         or die ("Ошибка очистки таблицы: ".mysqli_error());
    44.    
    45.     mysqli_query($rdb, "INSERT INTO `test`.`workers` (`id`, `name`, `age`, `salary`)
    46.                        VALUES
    47.                            (NULL, 'Дима', 23, 400),
    48.                            (NULL, 'Петя', 25, 500),
    49.                            (NULL, 'Вася', 23, 500),
    50.                            (NULL, 'Коля', 30, 1000),
    51.                            (NULL, 'Иван', 27, 500),
    52.                            (NULL, 'Кирилл', 28, 1000)")
    53.         or die ("Ошибка добавления данных в таблицу: ".mysqli_error());
    54.     header("Location: ".$_SERVER['PHP_SELF']);
    55. }
    56.  
    57. // Функция удаления пользователя из базы данных
    58. function delUser($rdb = NULL, $id = NULL){
    59.     // проверяем указатель ресурса соединения с базой данных
    60.     // и идентификатор строки
    61.     // возвращаем false в случае отсутвия указателя или идентификатора
    62.     if(!$rdb || !$id) return false;
    63.     // Собираем запрос, указываем LIMIT на всякий пожарный
    64.     $query = "DELETE FROM `workers` WHERE id = ".$id." LIMIT 1";
    65.     // Выполняем запрос к базе данных
    66.     $req = mysqli_query($rdb, $query) or die(mysqli_error());
    67.     if($req){
    68.         header("Location: ".$_SERVER['PHP_SELF']);
    69.     }else{
    70.         return false;
    71.     }
    72. }
    73.  
    74. // Функция выборки значений из базы данных и формирования таблицы
    75. function selectTable($rdb = NULL, $where = NULL, $order = NULL, $limit = NULL){
    76.     $table = '';
    77.     if(!$rdb) return '<tr class="table-danger"><td colspan="6"><h3>Отсутсвует указатель ресурса соединения с базой данных</h3></td></tr>';
    78.     $query = "SELECT * FROM `workers`".$where.$order.$limit;
    79.     //echo $query;
    80.     $req = mysqli_query($rdb, $query);
    81.     if($req){
    82.         if(mysqli_num_rows($req) > 0){
    83.             while($row = mysqli_fetch_assoc($req)){
    84.                 $table .= '<tr>';
    85.                 $table .= '<td><input type="checkbox" name="check[]" value="'.$row['id'].'"></td>';
    86.                 $table .= '<td>'.$row['id'].'</td><td>'.$row['name'].'</td><td>'.$row['age'].'</td><td>'.$row['salary'].'</td>';
    87.                 $table .= '<td><a href="?del='.$row['id'].'">Удалить</a>';
    88.                 $table .= '</tr>';
    89.             }
    90.             return $table;
    91.         }
    92.     }else{
    93.         return '<tr class="table-danger"><td colspan="6"><h3>Ошибка выполнения запроса к базе данных</h3></td></tr>';
    94.     }
    95. }
    96.  
    97. // Контроллер
    98.  
    99. // Устанавливаем соединение с базой данных
    100. $link = connectDB();
    101. // Обработка переменной инициализации таблицы
    102. if(isset($_GET['ini'])){
    103.     iniTable($link);
    104. }
    105. // Обработка переменной удаления работника
    106. if(isset($_GET['del']) && !empty($_GET['del'])){
    107.     $userId = (int)$_GET['del'];
    108.     $userId = mysqli_real_escape_string($link, $userId);
    109.     delUser($link, $userId);
    110. }
    111. // Задаём сортировку по умолчанию для нашей таблицы
    112. $order = ' ORDER BY id';
    113. // Фрмируем таблицу
    114. $table  = '';
    115. $table .= selectTable($link,NULL,$order);
    116. // Закрываем соединение с базой данных
    117. mysqli_close($link);
    118.  
    119. // html шаблон
    120. ?>
    121. <!DOCTYPE html>
    122. <html>
    123. <head>
    124. <meta charset='UTF-8' />
    125. <link rel="stylesheet" href="bootstrap.min.css">
    126. </head>
    127. <body>
    128.   <div class="container">
    129.    <div><h1>Таблица работников</h1></div>
    130.     <table class="table table-bordered table-striped">
    131.     <thead class="thead-dark">
    132.       <tr>
    133.         <th><input type="checkbox" name="check" value="all"></th>
    134.         <th>id</th>
    135.         <th>name</th>
    136.         <th>age</th>
    137.         <th>salary</th>
    138.         <th>action</th>
    139.       </tr>
    140.     </thead>
    141.     <tbody>
    142.     <?php echo $table;?>
    143.     </tbody>
    144.     </table>
    145.     <div><h5><a href="?ini=1">Создать и заполнить таблицу</a></h3></div>
    146.   </div>
    147. </body>
    148. </html>
     
  20. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @Алексей Др, вешаешь удаление на POST и при удалении делаешь серверный редирект методом GET.