使用PHP脚本从下拉列表更新SQL数据库

时间:2019-01-30 05:08:56

标签: php html mysql sql mysqli

我只是在自学PHP和SQL。这个问题似乎是重复的,但我无法找到解决问题的确切方法。

我有一个用于手机库存管理的SQL数据库。我已经实现了PHP脚本来在表中显示数据库内容。我必须进一步增强脚本,以便用户可以更改手机的状态,例如正在工作不工作。为此,我创建了另一个存储此信息的SQL数据库。我可以在下拉菜单中显示详细信息,但是当我从工作中更改为不工作并选择提交按钮时,看不到任何更改在数据库和Web服务器中。

<?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(); ?>

3 个答案:

答案 0 :(得分:1)

1。给您的input命名

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

2。自动为您的select字段添加唯一名称

<select name="your_unique_name">

3。给出一个隐藏的输入文本字段,以将asset_no放入要显示资产编号的td内

4。检查是否单击了该输入

if(isset($_POST["submit"]))
{
 for($i=0;$i<$count;$i++)
    {  $status= //catch it from posted form
       $asset_no= //catch it from posted form
        $sql="UPDATE Phone_table SET status='$status' WHERE 
             asset_no='$asset_no'";
        $result=$conn->query($sql);
    } 
}

答案 1 :(得分:1)

通常,表单创建/显示和对提交表单的操作是两个完全不相关的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);
        }
    }

答案 2 :(得分:1)

现有代码的一个问题是,无法将资产状态的提交值(即使已被命名!)与数据库中的特定记录相关联。通常,update语句在platform.setDir()子句中需要一个ID,以便相对记录的所有记录均等地更新,从而可以更新相关记录。为此,在给定HTML结构和常规方法(没有javascript和单一形式)的情况下,对表中的每一行使用隐藏的输入字段来保存记录ID似乎是有意义的。提交表单后,dir菜单的值和ID应该是相关的-您将在下面的演示中看到。

因为存在一个具有多个记录的表单,所以where菜单和select输入将需要被视为数组-也就是说它们的名称应为{{1} }

也许要注意的另一件事是直接在sql中使用变量。这种做法会使您的代码容易受到sql注入的攻击,而这可能是在封闭的系统中,那里有受信任的用户等,因此您永远不知道会发生什么!

select