Обновление базы данных SQL из выпадающего списка с использованием PHP-скрипта - PullRequest
0 голосов
/ 30 января 2019

Я просто самообучающийся PHP и SQL.Этот вопрос кажется повторяющимся, но я не могу найти точное решение для моей проблемы.

У меня есть база данных SQL для управления запасами мобильных телефонов.Я реализовал PHP-скрипт для отображения содержимого базы данных в таблице.Я должен еще больше улучшить сценарий, чтобы пользователь мог изменить состояние мобильного телефона, например Работает или Не работает .Для этого я создал другую базу данных SQL, хранящую эту информацию.Я могу отобразить детали в раскрывающемся списке, но когда я перехожу с Работает на Не работает и выбираю кнопку Отправить , в базе данных не видно никаких измененийа также в веб-сервере.

<?php
$servername="localhost";
$username="root";
$password="XXXXX";
$dbname="inventory_db";

//Connection

$conn =mysqli_connect($servername,$username,$password);
$db_handle = $conn->select_db($dbname);

//Connection check
if($conn->connect_error)
{
    die("Connection failed:" .$conn->connect_error);
}
else {
    echo "connection setup";
}

if($db_handle)
{
$sql="SELECT asset_no,asset_name,current_holder,location,status FROM Phone_table ";
$sql_status="SELECT idstatus,status_name FROM status_table";
?>

<!DOCTYPE html>
<HTML>
    <HEAD>
        <STYLE>

            .asset_table
            {
                width: 100%;
            border :1px solid black;
            }

            td{
                text-align: left;
                padding: 15px;
                border: 1px solid black;
            }
            th{
                border: 1px solid black;
            }
        </STYLE>
    </HEAD>
<BODY>
    <form method="post">

<TABLE class="asset_table">
      <TR>
        <TH>Asset Number</TH>
        <TH>Asset Name</TH>
        <TH>Asset Holder</TH>
        <TH>Location</TH>
        <TH>Status</TH>
      </TR>
    <?php
    $result=$conn->query($sql);
    $count=mysqli_num_rows($result);
    if($result->num_rows > 0)
    {
    while($row=$result->fetch_assoc())
    {?>
    <TR>

            <TD> <?php echo $row['asset_no']; ?> </TD>
            <TD>  <?php echo $row['asset_name']; ?></TD>
            <TD>  <?php echo $row['current_holder']; ?></TD>
            <TD>  <?php echo $row['location']; ?></TD>
            <TD><select>
                <?php
<!-- *****This is where I am stuck*****-->     
                $result_status=$conn->query($sql_status);
                if($result_status->num_rows > 0)
                {
                    while($row_status=$result_status->fetch_assoc())
                    { ?>
                        <option value =' <?php echo $row_status['idstatus']?> '> 
                       <?php echo $row_status['status_name'];?> </option>
                       <?php $row['status']=$row_status['status_name'];
                       }} ?></select>
               </TD>
    </TR>
    <?php
    }}?>
    <input type="submit">
    </form>

    <?php
    if($submit)
    {
        for($i=0;$i<$count;$i++)
        {
            $sql="UPDATE Phone_table SET status='$status[$i]' WHERE asset_no='$asset_no[$i]'";
            $result=$conn->query($sql);
        }
    }
    ?>

</TABLE>
</BODY>
</HTML>
<?php }
ob_end_flush(); ?>

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Одна проблема с существующим кодом состоит в том, что не было никакого способа связать представленное значение для статуса актива (даже если ему было присвоено имя!) С конкретной записью в базе данных.Оператору update обычно требуется идентификатор в предложении where, чтобы соответствующая запись могла быть обновлена, а ВСЕ записи обновляются одинаково.Для этого, учитывая структуру HTML и общий подход (без javascript и одиночной формы), использование скрытого поля ввода для каждой строки в таблице для хранения идентификатора записи, кажется, имеет смысл.Когда форма отправлена, значение для меню select и идентификатор должны быть связаны - вы увидите демонстрацию ниже.

Поскольку существует одна форма с несколькими записями, меню select иhidden входные данные должны обрабатываться как массивы, то есть их имена должны иметь форму name[]

Еще одна вещь, на которую следует обратить внимание, это использование переменных непосредственно в sql.Эта практика делает ваш код уязвимым для SQL-инъекций, и хотя он может находиться в закрытой системе где-то с доверенными пользователями и т. Д., Вы никогда не знаете, что может произойти!

0 голосов
/ 30 января 2019

Как правило, создание / отображение формы и действие с отправленной формой - это два совершенно не связанных HTTP-запроса.

Вам нужно изменить несколько вещей, чтобы ваш скрипт работал:

1.Добавьте скрытое поле для каждого актива №:

<TD>
<input type="hidden" name="asset_no[]" value="<?php echo $row['asset_no']; ?>">
<?php echo $row['asset_no']; ?>
</TD>

2.Добавьте атрибут имени к вашим выбранным полям:

<TD><select name="asset_status[]">

3.Сделайте так, чтобы в выбранных полях был предварительно выбран текущий статус и удалите пробелы в значении:

<option value ='<?php echo $row_status['idstatus'] ?>' <?= $row['status'] == $row_status['idstatus'] ? ' selected' : '' ?>> 

4.Удалите этот оператор, поскольку он ничего не делает (вы не записываете в массив, который вы читаете из базы данных):

$row['status']=$row_status['status_name'];

5.Добавьте имя свойства в поле отправки:

<input type="submit" name="submit">

6.Прочитайте отправленную форму из суперглобального массива $_POST (см. php.net ):


    if(isset($_POST['submit']))
    {
        for($i=0;$i<count($_POST['asset_no']);$i++)
        {
            $asset_status = mysqli_real_escape_string($conn, $_POST['asset_status'][$i]);
            $asset_no     = mysqli_real_escape_string($conn, $_POST['asset_no'][$i]);
            $sql = "UPDATE Phone_table SET status='$asset_status' WHERE asset_no='$asset_no'";
            $result = $conn->query($sql);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...