我在php中写了几行来显示数据然后编辑它并在用户点击“保存”时保存它们。按钮。这仅用于测试,因此我没有使用大量的密码和清理验证。主要目的是显示和更新。
用户名和密码来自display.html(用户和通行证)。从2个表member_login_info和member_master中获取的数据和主键是cust_id。记录显示正确,但在尝试更新记录时,$ cid值似乎丢失,因此无法更新。
$ cid值可以显示在第二组php代码中,但是一旦进入函数if(isset($ _ POST [' edit']))它就不再是echo' d。
我知道某处有一个简单的错误,但我无法弄明白。 非常感谢您的帮助。
<?php
session_start();
include 'db_connect.php';
$user = (isset($_POST['user']) && !empty($_POST['user']) ? $_POST['user'] : "");
$pass = (isset($_POST['pass']) && !empty($_POST['pass']) ? $_POST['pass'] : "");
$sql = mysql_query("SELECT member_login_info.cust_id, member_master.fname, member_master.lname, member_master.cust_dob
FROM member_login_info INNER JOIN member_master
ON member_login_info.cust_id = member_master.cust_id
WHERE member_login_info.profilename = '$user' AND member_login_info.password = sha1('$pass') ");
$result=mysql_fetch_assoc($sql);
$fname = $result["fname"];
$lname = $result["lname"];
$dob = date("d-m-Y", strtotime($result["cust_dob"]));
$cid = $result["cust_id"];
// $_SESSION['cid'] = $result["cust_id"];
?>
<div id="edit_data">
<fieldset style="width:30%">
<legend>Edit information</legend>
<table border="0">
<form name="edit" method="POST" >
<tr>
<td>First Name:</td><td>
<input name="fname" type="text" id="fname" value="<?php echo $fname; ?>" > </td>
</tr>
<tr>
<td>Last Name:</td><td>
<input name="lname" type="text" id="lname" value="<?php echo $lname; ?>"> </td>
</tr>
<tr>
<td>Date of Birth:</td><td>
<input name="dob" type="text" id="dob" value="<?php echo $dob; ?>"> </td>
</tr>
<tr>
<tr>
<td><input id="exit" type="submit" name="exit" value="Exit" onclick="window.location.href='display.html'"></td>
<td><input id="edit" type="submit" name="edit" value="Save"></td>
</tr>
</form>
</table>
</fieldset>
</div>
<?php
echo "$cid";
if(isset($_POST['edit'])) {
$fname = $_POST['fname'];
$lname = $_POST['lname'];
$dob = $_POST['dob'];
$sql = mysql_query("UPDATE member_master SET fname = '$fname', lname = '$lname', cust_dob = '$dob'
WHERE cust_id = '$cid' ");
}
?>
&#13;
答案 0 :(得分:0)
您的代码需要通过POST向用户和通行证提供。当您单击“保存”按钮时,表单将被提交,并且由于没有任何内容指定user和pass的值,因此以下代码段将两个变量都设置为""
。
$user = (isset($_POST['user']) && !empty($_POST['user']) ? $_POST['user'] : "");
$pass = (isset($_POST['pass']) && !empty($_POST['pass']) ? $_POST['pass'] : "");
修复此问题的简单方法是向表单添加两个隐藏的输入,一个名称设置为user
,值设置为$user
保存,{{1 }和pass
:
$pass
然而,这是非常不安全的。如果您的连接未加密,则凭据以明文形式发送,并且假设没有csrf / repeat令牌,则它很容易受到csrf和重放攻击。
答案 1 :(得分:0)
您正在根据cid
和user
检索pass
。然后,您要提交其他一些数据的更改,而不重新提交user
和pass
。
您检索cid
的逻辑将失败,因此您的更新将失败。
您可以将cid
添加为隐藏字段,或者 - 更好一点 - 在成功进行身份验证后,将会话中的用户登录状态(和cid)存储起来:
$sql = mysql_query("SELECT member_login_info.cust_id, member_master.fname, member_master.lname, member_master.cust_dob
FROM member_login_info INNER JOIN member_master
ON member_login_info.cust_id = member_master.cust_id
WHERE member_login_info.profilename = '$user' AND member_login_info.password = sha1('$pass') ");
$result=mysql_fetch_assoc($sql);
if (mysql_num_rows() == 1){
$_SESSION["fname"] = $result["fname"];
$_SESSION["lname"] = $result["lname"];
$_SESSION["dob"] = date("d-m-Y", strtotime($result["cust_dob"]));
$_SESSION["cid"] = $result["cust_id"];
}
然后,当您尝试更新数据时,请参阅会话变量$_SESSION["cid"]
,而不是任何$_POST
或$_GET
变量。
$sql = mysql_query("UPDATE member_master SET fname = '$fname', lname = '$lname', cust_dob = '$dob'
WHERE cust_id = '".$_SESSION['cid']."' ");
Sidenode:您的代码容易受到SQL注入攻击! mysql*
- 方法已弃用,您应该使用预准备语句!