Добавление функциональности к кнопкам, сгенерированным через скрипт php / html - PullRequest
0 голосов
/ 27 февраля 2019

Я очень новичок в программировании на PHP / HTML / CSS, и в приведенном ниже коде я попытаюсь создать базовую функциональность панели администрирования для веб-сайта.

Что я хочу сделать, так этораспечатать таблицу со всеми ее строками и столбцами и иметь дополнительный столбец с элементами управления, который позволил бы мне удалить указанную строку из базы данных.В конце концов я хотел бы сделать возможным изменение имени, пароля и прав администратора для каждого пользователя.

Кроме того, я действительно не знаю, как заставить каждую кнопку хранить значение, связывающее ее с соответствующей строкой.

Возможно, из-за того, что я поразительно неопытный программист, все мои попытки имеют либоне удалось или удалил последнюю строку (возможно, так как это было последнее значение в имени переменной $email).Друг предложил использовать либо JavaScript, либо перейти на другую платформу (его предложила Angular JS), чтобы достичь своих целей, но сейчас мне бы очень хотелось, чтобы это было просто (если это действительно так) с PHPи CSS.


Вот изображение того, как выглядит панель администрирования:

Click here to see an ugly administration panel.


Вотмой генератор таблиц (или настолько, насколько мне удалось его получить):

<?php
    include "connection.php"; 

    $sql = "SELECT * FROM users;";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) 
    {
        echo "<table class='sqltable'>
                <tr class='sqltable'>
                    <th class='sqltable'>ID</th>
                    <th class='sqltable'>EMAIL</th>
                    <th class='sqltable'>NAME</th>
                    <th class='sqltable'>IS ADMIN</th>
                    <th class='sqltable'>PASSWORD</th>
                    <th class='sqltable'>CONTROLS</th>
                </tr>";

        // output data of each row
        while($row = $result->fetch_assoc()) 
        {
            echo "<tr class='sqltable'>                            
                    <td class='sqlcell'>".$row["ID"]."</td>
                    <td class='sqlcell'>".$row["EMAIL"]."</td>
                    <td class='sqlcell'>".$row["FIRST_NAME"]." ".$row["MID_NAME"]." ".$row["LAST_NAME"]."</td>
                    <td class='sqlcell'>".$row["IS_ADMIN"]."</td> 
                    <td class='sqlcell'>".$row["PASSWORD"]."</td>
                    <td class='sqlcell'>
                        <center>
                            <div style='border: 1px solid lightgray;' method='POST'>
                                <input type='hidden' name='ID' value='".$row['ID']." '/>
                                <input type='button' name='delete' value='DEL ".$row['ID']." '/>
                            </div>
                        </center>
                    </td>
                </tr>";
        } 
        echo "</table>";
    }

    else 
    {
        echo "DATABASE IS EMPTY!";
    }  

    $conn->close(); 

    if (isset($_POST['delete']))
    { //if a delete request received
        $id = $_POST['id']; //primary key of this row

        /////// Connectivity /////////
        $servername = "127.0.0.1";
        $username = "root";
        $password = ""; 
        $db = "myDB";    

        // Create connection
        $conn = new mysqli($servername, $username, $password, $db);

        //check connection
        if ($conn)
        {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }

        //compose sql statement
        $stmt = mysqli_prepare($conn, "DELETE FROM users WHERE ID=?");

        mysqli_stmt_bind_param($stmt,'i',$id); //now add the $id to the statement 'i' stands for integer

        mysqli_stmt_execute($stmt);

        mysqli_stmt_close($stmt);
        mysqli_close($conn); //connection closed
    }
?>

Это то, что я начал делать, и я уже почти уверен, что выбрал неправильный путь для этого.

function delete()
            {
                $del = "DELETE FROM '".$table."' WHERE EMAIL='".$email."';";
                $conn->query($del);
            }

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

теперь, когда я реализовал ваш код, опубликованный в вопросе, я изменил несколько вещей, чтобы он работал должным образом, все мелкие проблемы, я опубликую их здесь в комментариях.

<?php
    if (isset($_POST['delete'])) //first: test if any delete request, delete and then render the table 
    { //if a delete request received
        $id = $_POST['id']; //primary key of this row, where 'id' index must be case-sensitively equal to the hidden input name 'id'

        /////// Connectivity /////////
        $servername = "localhost";
        $username = "root";
        $password = "root"; 
        $db = "user_delete";    

        // Create connection (procedural style)
        $conn = mysqli_connect($servername, $username, $password, $db);

        //check connection
        if (!$conn) //if NOT connected
        {
            printf("Connect failed: %s\n", mysqli_connect_error()); //print error
            exit(); //exit the program 'in this case you wouldn't see the table either'
        }

        //compose sql statement
        $stmt = mysqli_prepare($conn, "DELETE FROM users WHERE ID=?"); //notice that sql statements are NOT case sensitive

        mysqli_stmt_bind_param($stmt,'i',$id); //now add the $id to the statement 'i' stands for integer

        mysqli_stmt_execute($stmt);

        mysqli_stmt_close($stmt);
        mysqli_close($conn); //connection closed, row deleted
    }

    include "connection.php"; 

    $sql = "SELECT * FROM users;";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) 
    {
        echo "<table class='sqltable'>
                <tr class='sqltable'>
                    <th class='sqltable'>ID</th>
                    <th class='sqltable'>EMAIL</th>
                    <th class='sqltable'>NAME</th>
                    <th class='sqltable'>IS ADMIN</th>
                    <th class='sqltable'>PASSWORD</th>
                    <th class='sqltable'>CONTROLS</th>
                </tr>";

        // output data of each row
        while($row = $result->fetch_assoc()) 
        {
            echo "<tr class='sqltable'>";
            echo   "<td class='sqlcell'>".$row["id"]."</td>";   //php is case-sensitive so you should use $row['ID'] according to your scheme
            echo   "<td class='sqlcell'>".$row["email"]."</td>";//php is case-sensitive so you should use $row['EMAIL'] according to your scheme
            echo   "<td class='sqlcell'>".$row["name"]."</td>";//for simplicity, I made one field, change it according to your scheme
            echo   "<td class='sqlcell'>".$row["is_Admin"]."</td>";//php is case-sensitive so you should use $row['IS_ADMIN'] according to your scheme
            echo   "<td class='sqlcell'>".$row["password"]."</td>";//same as above
            echo    "<td class='sqlcell'>
                        <center>
                            <div style='border: 1px solid lightgray;'>";
                    echo    "<form method='POST'>"; //must be added in a form with method=post
                    echo        "<input type='hidden' name='id' value='".$row['id']." '/>"; //differntiate between input name `id` and mysql field name you have `ID`, input field name is the index you will fetch in line 4: $_POST['id']
                    echo        "<input type='submit' name='delete' value='DEL ".$row['id']." '/>"; //type: submit, not button
                    echo    "</form>
                            </div>
                        </center>
                    </td>
                </tr>";
        } 
        echo "</table>";
    }

    else 
    {
        echo "DATABASE IS EMPTY!";
    }  
//all done
    $conn->close(); 
?>

обновление: теперь это тот же код, все в стиле ООП и с повторным использованием соединения:

<?php
    include "connection.php"; 
    if (isset($_POST['delete'])) //first: test if any delete request, delete and then render the table 
    { //if a delete request received
        $id = $_POST['id']; //primary key of this row, where 'id' index must be case-sensitivly equal to the hidden input name 'id'

        //check connection
        if (mysqli_connect_errno()) //if connection error existed
        {
            printf("Connect failed: %s\n", mysqli_connect_error()); //print error
            exit(); //exit the program 'in this case you wouldn't see the table either'
        }

        //compose sql statement
        $stmt = $conn->prepare("DELETE FROM users WHERE ID=?"); //notice that sql statements are NOT case sensitive

        $stmt->bind_param('i',$id); //now add the $id to the statement 'i' stands for integer

        $stmt->execute();

        $stmt->close();
    }

    $sql = "SELECT * FROM users;";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) 
    {
        echo "<table class='sqltable'>
                <tr class='sqltable'>
                    <th class='sqltable'>ID</th>
                    <th class='sqltable'>EMAIL</th>
                    <th class='sqltable'>NAME</th>
                    <th class='sqltable'>IS ADMIN</th>
                    <th class='sqltable'>PASSWORD</th>
                    <th class='sqltable'>CONTROLS</th>
                </tr>";

        // output data of each row
        while($row = $result->fetch_assoc()) 
        {
            echo "<tr class='sqltable'>";
            echo   "<td class='sqlcell'>".$row["id"]."</td>";   //php is case-sensitive so you should use $row['ID'] according to your scheme
            echo   "<td class='sqlcell'>".$row["email"]."</td>";//php is case-sensitive so you should use $row['EMAIL'] according to your scheme
            echo   "<td class='sqlcell'>".$row["name"]."</td>";//for simplicity, I made one field, change it according to your scheme
            echo   "<td class='sqlcell'>".$row["is_Admin"]."</td>";//php is case-sensitive so you should use $row['IS_ADMIN'] according to your scheme
            echo   "<td class='sqlcell'>".$row["password"]."</td>";//same as above
            echo    "<td class='sqlcell'>
                        <center>
                            <div style='border: 1px solid lightgray;'>";
                    echo    "<form method='POST'>"; //must be added in a form with method=post
                    echo        "<input type='hidden' name='id' value='".$row['id']." '/>"; //differntiate between input name `id` and mysql field name you have `ID`, input field name is the index you will fetch in line 4: $_POST['id']
                    echo        "<input type='submit' name='delete' value='DEL ".$row['id']." '/>"; //type: submit, not button
                    echo    "</form>
                            </div>
                        </center>
                    </td>
                </tr>";
        } 
        echo "</table>";
    }

    else 
    {
        echo "DATABASE IS EMPTY!";
    }  
//all done
    $conn->close(); 
?>

Подсказка: в реальном мире, никогда не храните пароли в виде простого текста,поиск и чтение о хешировании

0 голосов
/ 27 февраля 2019

Ну, во-первых, php-скрипты - это серверные скрипты, что означает, что ваша кнопка не будет вызывать функцию удаления, в противном случае она отправит запрос на сервер, на котором есть удаление.

как это сделать?просто вам нужно визуализировать форму (которая является элементом html), просто внутри ячейки таблицы, где вы хотите показать кнопку удаления, и вы определяете метод как post (подробнее о методах http-запроса), и вы можете включить значение id (или первичный ключ этой таблицы, какой бы то ни было).

 <form method="post">
 <input type='submit' name='delete' />
 <input type='hidden' name="id" value="$row['id']" />
 </form>

, поэтому эта форма сообщает браузеру: всякий раз, когда пользователь нажимает кнопку «удалить», отправьте эту форму, которая содержит один скрытый ввод, содержит идентификаторэлемент хотел удалить.

теперь перейдем к серверной части, в начале вашего файла:

<?php 
if (isset($_POST['delete'])){ //if a delete request received
$id = $_POST['id']; //primary key of this row

//establish connection to mysql
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');

//check connection
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

//compose sql statement
$stmt = $mysqli->prepare("DELETE FROM users WHERE ID=?");

$stmt->bind_param('i',$id); //now add the $id to the statement 'i' stands for integer

$stmt->execute();

$stmt->close();
$mysqli->close() //connection closed
}
?>

код выше написан в ООП, или вы можете написать его в процедурном стиле..

<?php 
if (isset($_POST['delete'])){ //if a delete request received
$id = $_POST['id']; //primary key of this row

//establish connection to mysql
$mysqli = mysqli_connect('localhost', 'my_user', 'my_password', 'world');

//check connection
if (!$mysqli) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

//compose sql statement
$stmt = mysqli_prepare($mysqli, "DELETE FROM users WHERE ID=?");

mysqli_stmt_bind_param($stmt,'i',$id); //now add the $id to the statement 'i' stands for integer

mysqli_stmt_execute($stmt);

mysqli_stmt_close($stmt);
mysqli_close($mysqli) //connection closed
}
?>
  1. подробнее о параметрах привязки
  2. HTTP-методы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...