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

Posted

技术标签:

【中文标题】使用 PHP 脚本从下拉列表中更新 SQL 数据库【英文标题】:Updating SQL database from a dropdown using PHP script 【发布时间】:2019-01-30 05:08:56 【问题描述】:

我只是自学php和SQL。这个问题似乎是重复的,但我找不到我的问题的确切解决方案。

我有一个用于手机库存管理的 SQL 数据库。我已经实现了 PHP 脚本来在表格中显示数据库内容。我必须进一步增强脚本,以便用户可以更改手机的状态,例如 WorkingNot working。为此,我创建了另一个存储此信息的 SQL 数据库。我可以在下拉列表中显示详细信息,但是当我从 Working 更改为 Not working 并选择 Submit 按钮时,看不到任何变化在数据库和 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(); ?>

【问题讨论】:

您的 html 无效 - 没有结束表单标签 表格结束前有一个结束表格标签 哦,是的...我现在看到了。但是,它在错误的位置 - 您需要以镜像顺序打开和关闭元素,而不仅仅是在感觉正确时;-) 很高兴我能够帮助顺便说一句 - 很容易扩展它以允许更新所有字段(资产名称、持有人、位置等) 【参考方案1】:

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

因为有一个包含多个记录的表单,所以 select 菜单和 hidden 输入需要被视为数组 - 也就是说,它们的名称应该是 name[] 的形式

另外需要注意的可能是在 sql 中直接使用变量。这种做法会使您的代码容易受到 sql 注入的影响,虽然这可能在某个具有受信任用户等的封闭系统上,但您永远不知道会发生什么!

<?php
    error_reporting( E_ALL );
    ini_set( 'display_errors', 1 );


    /* connect to the db */
    $dbhost =   'localhost';
    $dbuser =   'root'; 
    $dbpwd  =   'xxx'; 
    $dbname =   'inventory_db';
    $db =   new mysqli( $dbhost, $dbuser, $dbpwd, $dbname );


    /* declare the sql statements for later use */
    $sql=(object)array(
        'phones'    =>  'select `asset_no`, `asset_name`, `current_holder`, `location`, `status` from `phone_table`',
        'status'    =>  'select `idstatus`, `status_name` from `status_table`',
        'update'    =>  'update `phone_table` set `status`=? where asset_no=?'
    );



    /* very basic utility function to generate select menu */
    function createselect( $name, $data, $value )
        $html=array();
        $html[]=sprintf( '<select name="%s">', $name );
        foreach( $data as $id => $status )
            $selected = $id == $value ? ' selected=true' : '';
            $html[]=sprintf('<option value="%s"%s>%s', $id, $selected, $status );
        
        $html[]='</select>';
        return implode( PHP_EOL, $html );
    



    /* query database to get possible status values which are used to create the SELECT menus */
    $status=array();
    $results=$db->query( $sql->status );
    if( $results )
        while( $rs=$results->fetch_object() )$status[ $rs->idstatus ]=$rs->status_name;
    




    if( $_SERVER['REQUEST_METHOD']=='POST' )
        ob_clean();

        /* using `user supplied data` - use a prepared statement to be safe! */
        $stmt=$db->prepare( $sql->update );
        $stmt->bind_param( 'ii', $assetstatus, $assetid );

        /* Perform the update */
        foreach( $_POST['id'] as $i => $assetid )
            $assetstatus = $_POST['status'][ $i ];
            $stmt->execute();
        

        $stmt->close();
        exit( header( 'Location: ?db=updated' ) );
    
?>
<!DOCTYPE html>
<html lang='en'>
    <head>
        <meta charset='utf-8' />
        <title>Asses or Assets?</title>
        <style>
            bodyfont-family:verdana
            table width: 100%; border :1px solid black; 
            td text-align: left; padding: 15px;  border: 1px solid black;text-align:center; 
            th border: 1px solid black; 
            input,selectpadding:1rem;width:100%
        </style>
    </head>
    <body>
    <?php

        /* get the phones... no user input so no need for prepared statement */
        $results = $db->query( $sql->phones );
        if( $results )

    ?>
        <form method='post'>
            <table>
                <thead>
                    <tr>
                        <th>Asset Number</th>
                        <th>Asset Name</th>
                        <th>Asset Holder</th>
                        <th>Location</th>
                        <th>Status</th>
                    </tr>
                </thead>
                <tbody>
                <?php
                    while( $rs = $results->fetch_object() )
                        printf(
                            "<tr>
                                <td>%s<input type='hidden' name='id[]' value='%d' /></td>
                                <td>%s</td>
                                <td>%s</td>
                                <td>%s</td>
                                <td>%s</td>
                            </tr>",
                            $rs->asset_no,
                            $rs->asset_no,
                            $rs->asset_name,
                            $rs->current_holder,
                            $rs->location,
                            createselect( 'status[]', $status, $rs->status )
                        );
                    
                ?>
                </tbody>
                <tfoot>
                    <tr>
                        <td colspan=5>
                            <input type='submit' />
                        </td>
                    </tr>
                </tfoot>
            </table>
        </form>
        <?php

        //close `if`

        ?>
    </body>
</html>

【讨论】:

【参考方案2】:

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

【讨论】:

谢谢。我已经按照上述进行了更改,但问题仍然存在

以上是关于使用 PHP 脚本从下拉列表中更新 SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQL 查询从另一个表中更新作为下拉列表的字段

php中sql查询的列名

PHP/HTML 在 sql 查询的下拉列表中显示选定的选项

从下拉列表中更新所选值的 mysql 记录

如何在php中使用下拉列表显示不同的mysql表

使用 ajax、sql 和 php 的动态下拉列表