无法在同一PHP文件中两次使用变量值

时间:2015-02-01 00:54:56

标签: php html variables isset

我在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;
&#13;
&#13;

2 个答案:

答案 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)

您正在根据ciduser检索pass。然后,您要提交其他一些数据的更改,而不重新提交userpass

您检索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* - 方法已弃用,您应该使用预准备语句!