2009-05-25 2 views
0

다음 PHP 폼이 있는데, mysql 데이터베이스에 다시 게시됩니다. 내 문제는 업데이트 쿼리가 작동하지만 항상 "checked"로 덮어 쓰게된다는 것입니다. 내가하고 싶은 일은 데이터베이스에서 현재 값을 가져 오는 것입니다. 그런 다음 게시물에 값이 있으면 대신 가져옵니다. 자 ... 왜이게 효과가없는거야? _POST에 있는지 검사 할 때 else 절이 있어야합니까? 그렇다면 $ checkDeleted = "";를 사용하여 변수를 초기화해야합니까?mysql db에 대한 업데이트 로직에 문제가 있습니다

<?php 
error_reporting(E_ALL); 
if (isset($_GET["cmd"])) 
    $cmd = $_GET["cmd"]; else 
if (isset($_POST["cmd"])) 
    $cmd = $_POST["cmd"]; else die("Invalid URL"); 
if (isset($_GET["pk"])) { 
    $pk = $_GET["pk"]; 
} 
$checkDeleted = ""; 
$con = mysqli_connect("localhost","user","pw", "db"); 
$getformdata = $con->query("select ARTICLE_NO, deleted from STATUS where ARTICLE_NO = '$pk'"); 
while ($row = mysqli_fetch_assoc($getformdata)) { 
    $ARTICLE_NO = $row['ARTICLE_NO']; 
    $checkDeleted = $row['deleted']; 
} 
$checkboxes = (isset($_POST['checkboxes'])? $_POST['checkboxes'] : array()); 
if (in_array('deleted', $checkboxes)) $checkDeleted = 'checked'; 
if($cmd=="submitinfo") { 
    if ($ARTICLE_NO == null) { 
     $statusQuery = "INSERT INTO STATUS VALUES (?, ?)"; 
     if ($statusInfo = $con->prepare($statusQuery)) { 
      $statusInfo->bind_param("ss", $pk, $checkDeleted); 
      $statusInfo->execute(); 
      $statusInfo->close(); 
     } else { 
      print_r($con->error); 
     } 
    } else if ($ARTICLE_NO == $pk) { 
     $statusQuery = "UPDATE STATUS SET deleted = ? WHERE ARTICLE_NO = ?"; 
     if ($statusInfo = $con->prepare($statusQuery)) { 
      $statusInfo->bind_param("ss", $checkDeleted, $pk); 
      $statusInfo->execute(); 
      $statusInfo->close(); 
     } else { 
      print_r($con->error); 
     } 
    } 
} 
if($cmd=="EditStatusData") { 
    echo "<form name=\"statusForm\" action=\"test.php?pk=".$pk."\" method=\"post\" enctype=\"multipart/form-data\"> 
         <input type=\"checkbox\" name=\"checkboxes[]\" value=\"deleted\" ".$checkDeleted." /> 
         <label for=\"deleted\">Delete</label> 
         <input type=\"hidden\" name=\"cmd\" value=\"submitinfo\" /> 
         <input name=\"Submit\" type=\"submit\" value=\"submit\" /> 
     </form>"; 
} 
?> 

다음과 같이 checkDeleted를 설정하여 줄을 변경해 보았습니다. 아무런 차이가 없었습니다.

if (in_array('deleted', $checkboxes)) { 
$checkDeleted = 'checked'; 
} else { 
$checkDeleted = ''; 
} 

편집 : OK, 나는이 일을 얻는 것을 처리했다,하지만

$ checkDeleted =와 in_array로 변경 한 후 ($ 체크 박스를 '삭제')? 'checked': '';

아래 답변에 따라,하지만 여전히 작동하지 않았다. 작동하려면 데이터베이스 쿼리를 제거하고 submitinfo 분기 내에서 하나를, EditStatusData 분기 내에서 하나를 대체해야했습니다 ... 왜? 쿼리를 하나만 가질 수없는 이유는 무엇입니까?

if($cmd=="submitinfo") { 

$getformdata = $con->query("select ARTICLE_NO from STATUS where ARTICLE_NO = '$pk'"); 

while ($row = mysqli_fetch_assoc($getformdata)) { 
    $ARTICLE_NO = $row['ARTICLE_NO']; 
}  
    if ($ARTICLE_NO == null) { etc 

if($cmd=="EditStatusData") { 
$getformdata = $con->query("select deleted from STATUS where ARTICLE_NO = '$pk'"); 

while ($row = mysqli_fetch_assoc($getformdata)) { 
    $checkDeleted = $row['deleted']; 
} etc 

답변

0

데이터를 GET'ing있는 경우에만 작동합니다 : 귀하의 요청이 POST 인 경우 코드 $의 PK에서

$getformdata = $con->query("select ARTICLE_NO, deleted from STATUS where ARTICLE_NO = '$pk'"); 

가 설정되어 있지 않습니다. $ _GET [ 'pk']에 사용자가 원하는 데이터를 넣을 수 있고 SQL 쿼리를 깰 수 있으므로이 줄에서 $ pk 변수를 이스케이프 처리해야합니다.

+0

if (in_array('deleted', $checkboxes)) $checkDeleted = 'checked'; 

를 대체 할 경우

에 항상 확인란이 설정되어 어떤과 데이터베이스 값을 덮어 쓰게됩니다 싶지 ? –

+0

'(isset ($ _ GET [ "pk"]))'행은 GET 요청 인 경우에만 유효합니다. – gacrux

+0

또한 항상 pk 매개 변수로 페이지가 호출되므로 pk는 항상 GET을 통해 설정됩니다. sanitisation 언급이 필요합니다 .. –

1

이 당신이 내가 얻을 수있다 수행 할 작업을

을 원하는대로 정확하게 작동하고,

mysql not updating from php form

코드 아무 문제가없는 거의 동일한 다른 질문입니다 데이터베이스의 현재 값, 그리고 게시물에 값이 있으면 대신 가져옵니다.

경우 1 : 데이터베이스 $ checkDeleted 가입일 틱

  1. 읽기와 HTML 양식은 =
  2. 가 $ _POST 경우 [ '체크 박스'는] [ '삭제'를] 설정되지 않은 '확인'
  3. 한, 기록 checkDeleted $를 떠나 데이터베이스

경우 2 '확인'.진드기와 HTML 양식은 데이터베이스 $ checkDeleted에서

  1. 읽기 =
  2. 경우 $ _POST [ '체크 박스'] [ '삭제'] 설정, checkDeleted는 = '확인'
  3. 쓰기를 $ 변경 '확인' 데이터베이스에 '확인'

당신은 틱 여부가있을 경우 다음 검사로 데이터베이스 값을 변경 한 후 그래서, 그것은

나는 그것을 가정 할 것이다 변경할 수있는 방법에 상관없이이없는 것을 요 u는 GET하는 것을 제한 왜이 라인이

$checkDeleted = in_array('deleted', $checkboxes) ? 'checked' : ''; 
+0

그래서,이 작동하려면, 데이터베이스 쿼리를 확인해야 할 것입니다 그것이 배열에 있다면? –

+0

위의 예에서 배열에없는 경우 실제로 필드를 설정하려고합니다. 왜 작동하지 않는 것입니까? –

+0

제 수정 된 질문을 참조하십시오 ... –

관련 문제