2015-02-01 3 views
0

PHP를 사용하여 데이터를 표시 한 다음 편집하고 '저장'버튼을 클릭하면 저장됩니다. 이것은 테스트를위한 것일 뿐이므로 암호 및 위생 검증에 대한 많은 검증을 사용하지 않았습니다. 주요 목표는 표시하고 업데이트하는 것입니다.동일한 PHP 파일에서 변수 값을 두 번 사용할 수 없습니다.

사용자 이름과 암호는 display.html (사용자 & 패스)에서 나옵니다. 데이터는 member_login_info 및 member_master의 두 테이블에서 선택되며 기본 키는 cust_id입니다. 레코드가 제대로 표시되지만 레코드를 업데이트하려고 할 때 $ cid 값이 누락 된 것처럼 보이므로 업데이트 할 수 없습니다.

$ cid 값은 두 번째 PHP 코드 집합에 표시 될 수 있지만 if (isset ($ _ POST [ 'edit'])) 함수 내에서 한 번 더 echo 될 수 없습니다.

나는 어딘가에서 간단한 실수가 있다는 것을 알고 있지만, 나는 그것을 이해할 수 없다. 귀하의 도움을 많이 주시면 감사하겠습니다.

<?php 
 
session_start(); 
 

 
include 'db_connect.php'; 
 

 
$user \t = (isset($_POST['user']) && !empty($_POST['user']) ? $_POST['user'] : ""); 
 
$pass \t = (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') "); 
 
\t \t 
 
$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%"> 
 
\t <legend>Edit information</legend> 
 
\t 
 
<table border="0"> 
 
    \t <form name="edit" method="POST" > 
 
\t <tr> \t \t 
 
\t <td>First Name:</td><td> 
 
\t <input name="fname" type="text" id="fname" value="<?php echo $fname; ?>" > </td> 
 
\t </tr> 
 
\t 
 
\t <tr> 
 
\t <td>Last Name:</td><td> 
 
\t <input name="lname" type="text" id="lname" value="<?php echo $lname; ?>"> </td> 
 
\t </tr> 
 
\t 
 
\t <tr> 
 
\t <td>Date of Birth:</td><td> 
 
\t <input name="dob" type="text" id="dob" value="<?php echo $dob; ?>"> </td> 
 
\t </tr> 
 
\t <tr> 
 
\t \t 
 
\t <tr> 
 
\t <td><input id="exit" type="submit" name="exit" value="Exit" onclick="window.location.href='display.html'"></td> 
 
\t <td><input id="edit" type="submit" name="edit" value="Save"></td> 
 
\t </tr> 
 
\t </form> 
 
</table> 
 
</fieldset> \t 
 
</div> 
 
    
 
<?php 
 
echo "$cid"; 
 
if(isset($_POST['edit'])) { 
 
    \t 
 
$fname = $_POST['fname']; 
 
$lname = $_POST['lname']; \t \t 
 
$dob = $_POST['dob']; 
 
    
 
$sql = mysql_query("UPDATE member_master SET fname = '$fname', lname = '$lname', cust_dob = '$dob' 
 
    \t \t \t \t WHERE cust_id = '$cid' "); 
 
} 
 
?>

+0

죄송합니다. 귀하의 질문은 정확히 무엇입니까?그것은 "내 코드에서 단순한 실수는 어디에 있습니까?" –

+0

양식은 명명 된 속성을 사용하지 않으며 요소는 사용합니다. 따라서'if (isset ($ _ POST [ 'edit'])) {// 내부의 어떤 것도 작동하지 않습니다. }'- 숨겨진 유형의 요소를 사용하십시오. –

+0

'if (isset ($ _ POST [ 'edit'])) {...}'는 함수가 아닙니다. –

답변

0

코드는 사용자와 패스 POST를 통해 부여 할 것으로 기대하고있다. "저장"버튼을 클릭하면 양식이 제출되고 사용자와 패스 모두의 값을 지정하는 것이 없기 때문에 다음 스 니펫은 두 변수를 모두 ""으로 설정합니다.

:

$user = (isset($_POST['user']) && !empty($_POST['user']) ? $_POST['user'] : ""); 
$pass = (isset($_POST['pass']) && !empty($_POST['pass']) ? $_POST['pass'] : ""); 

이 고정의 간단한 방법은, 양식에 user로 설정 이름으로 하나 $user가 보유하고 어떤 설정 값, 유사에 대한 pass$pass 두 숨겨진 입력을 추가하는 것입니다

<input name="user" value="<?php echo $user; ?>" type="hidden" /> 
<input name="pass" value="<?php echo $pass; ?>" type="hidden" /> 

그러나 이것은 매우 안전하지 않습니다.. 연결이 암호화되지 않은 경우 자격 증명이 일반 텍스트로 보내지며 csrf/repeat 토큰이 없으므로 csrf 및 재생 공격에 취약합니다.

0

userpass을 기준으로 cid을 검색하고 있습니다. 그런 다음 userpass을 다시 제출하지 않고 다른 일부 데이터의 변경 사항을 제출하고 있습니다.

cid을 검색하는 논리가 실패하고 업데이트가 실패합니다.

당신은 숨겨진 필드로 cid를 추가하거나 수 중 - 더 좋을 것이다 - 그가 성공적으로 autehenticated되면 사용자가 세션에서 상태 (및 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"]; 

}

데이터를 업데이트하려고하면 $_POST 또는 $_GET 변수가 아닌 $_SESSION["cid"] 세션 변수를 참조하십시오.

$sql = mysql_query("UPDATE member_master SET fname = '$fname', lname = '$lname', cust_dob = '$dob' 
       WHERE cust_id = '".$_SESSION['cid']."' "); 

사이드 노드 : 코드가 SQL 인젝션에 취약합니다! mysql* -methods는 더 이상 사용되지 않으므로 대신 prepared statements를 사용해야합니다!

관련 문제