使用 PHP 脚本从下拉列表中更新 SQL 数据库
Posted
技术标签:
【中文标题】使用 PHP 脚本从下拉列表中更新 SQL 数据库【英文标题】:Updating SQL database from a dropdown using PHP script 【发布时间】:2019-01-30 05:08:56 【问题描述】:我只是自学php和SQL。这个问题似乎是重复的,但我找不到我的问题的确切解决方案。
我有一个用于手机库存管理的 SQL 数据库。我已经实现了 PHP 脚本来在表格中显示数据库内容。我必须进一步增强脚本,以便用户可以更改手机的状态,例如 Working 或 Not 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 数据库的主要内容,如果未能解决你的问题,请参考以下文章